質問: 以下の構成でサーバーを立てています 「Nginx」===「uwsgi」===「Django/Celery」 後ろで重めのPythonプログラムを動かしています uwsgiでは--processesと--threadsのオプションを用いて、プロセス数/スレッド数を指定します。 Celeryでは--concurrencyとワーカー数を指定します(ワーカー数はいまいちよくわかっていません) **質問** 1:CPUのコア数・スレッド数とプログラムでいうプロセス数・スレッド数とはどういう関係ですか? 2:Celeryのワーカーやconcurrencyについて、説明お願いします 3:uwsgiの--processes/--threads Celeryの--concurrency/ワーカー数の最適値はどのようにして求めたらいいですか?(「移行錯誤により決定する」っていう回答ではなく一般解か、試行錯誤の手順を教えてください) ``` # grep physical.id /proc/cpuinfo | sort -u | wc -l 1 # grep cpu.cores /proc/cpuiuinfo | sort -u cpu cores : 1 # grep processor /proc/cpuinfo | wc -l 1 ```
回答: 1. 「CPUのスレッド数」の意味がよくわかりませんが、ハイパースレッディング・テクノロジー(HTT)による論理コア数の話でしょうか。であれば、プログラム側からすれば、HTTなしの場合と比べてCPUコア数が増え、プロセス数を多めに設定する効果が出やすくなること、HTTなしの場合よりも、処理内容によって1コアあたりのパフォーマンスが落ちることがあるという特性があることを知っていれば良いだけとなります。 2. あいにく詳しくありませんのでパスします。 3. 一般解はありませんので、試行錯誤するしかありません。まずはどんな状態をもって「最適」とみなすのかを細かく定義するところから始めると良いでしょう。同じ処理を動かすのでも、リクエストが最大で並列4つ程度しかこない想定(リクエストあたりの処理速度重視)なのか、日常的に並列1000とか来る想定(許容リクエスト数重視)なのかで全く話は変わります。変動する要因・判定するための要因をそれぞれ最小限に絞った上で、できるだけ本番環境に近い環境と入力条件を揃えるのが理想です。今どきのCPU、というかサーバ環境は、各種IOのアクセスレイテンシ・転送速度・キャッシュ量、スーパースカラ・パイプライン処理に投機的実行と様々な性能要因が複雑に絡み合って性能が決まるため、実際に動かしたい処理を動かしてみないと、特定処理を動かす上での性能傾向がどうなるかを高い精度で読むことは非常に困難です。これは、ある値を超えたところから劇的に性能が落ちる、ということがよくあるからです。