by kiridaruma at PHPer kaigi 2022
@kiridaruma
1998/3/11生まれ
ピクシブ株式会社
趣味でHaskell, Elm, Rust
@kiridaruma
@kiridaruma
原因はいろいろ
原因によって対応方法が変わってくる
計算量が原因の場合
ディスクやネットワークなどが原因の場合
基本的に計算量が大きい処理は速くできない
CPUが待っている時間が長い処理(IOなど)
Webページの表示速度の計測を行うバッチ
計測には時間がかかる
この場合、ボトルネックはCPUの外部にある
計測対象のページは複数
→Fiberでまとめて並行処理を行うようにした
タスク1→タスク2→タスク3→タスク1→タスク2→…
タスク1→タスク1→タスク1→…
タスク2→タスク2→タスク2→…
タスク3→タスク3→タスク3→…
基本的に計算量が大きい処理は速くできない
重い処理を同時に実行して全体を早くはできる
GeneratorもFiberも並行処理
そもそもPHPだけでは並列処理できない
スレッド
プロセス
pthreads
parallel
標準でいくつか使える関数がある
Linuxなら大体すぐ使える
スレッドをちゃんと動かすのは大変
「プロセスよりスレッドの方が早いんでしょ?」
プロセスの方が扱いやすい
基本的に2つのプロセスに分けて考える
よくあるミドルウェアもだいたい同じ構成
別プロセスを実行する関数
色々ある
マルチプロセスで並列で実行した
オンプレの専用の強いマシンを使用
オンプレ環境は調達すれば強いマシンが使える
クラウドの場合は分散させることが多い
数分程度ならlambdaやfunctionsで回せる
時間のかかる処理の場合はVMの方が良い場合も
「あれ、良く分からないけど失敗してる」
バッチ処理はログの出力が大事
基本はプロセス毎にログを出力するのが楽
そもそもプロセス同士の依存を減らした方が楽
シグナルハンドラは必ず設定する
オンプレ/クラウド関わらずシグナル処理は大事
正常終了時には0、異常終了時はそれ以外でexitする
異常終了したら通知する仕組みなどがあったり