Linux:

Linux:

簡単な例です。私はTCPソケットを使ってhttpリクエストを処理するプロセスを実行しています。 A)CPUがボトルネックを引き起こすものを計算する場合B)ネットワークにボトルネックを引き起こす可能性がある大容量ファイルを転送する場合、またはC)ディスクボトルネックを引き起こす半ランダムアクセスを使用する複雑なデータベースクエリです。

各ページ/API呼び出しを上記のタイプの1つ以上に分類し、各ページ/API呼び出しの数のバランスを取る必要がありますか?それとも、OSが代わりにするのでしょうか?必要なスレッド数をどのように決定しますか?

ハードウェアスレッド12と48に2つの数字を使用します(Intel Xeonにはそれだけの数字があります)。 CPU使用量が多い場合(8/32)スレッド2/3、ディスク使用量が多い場合はスレッド1個(またはディスク当たり使用量が多いスレッド1個)、残りの3/15は他の用途に使うつもりです。ネットワークのバランスをとりましょう。

12/48スレッドのみをサポートするハードウェアに12/48以上のスレッドが必要ですか? CPUがより遅い調整モードに入らないように、より少ない量を望んでいますか?スレッドをロードしてリソースのバランスを取る必要がある場合はどうすればよいですか?

答え1

Linux:

Linuxカーネルには、これをうまく実装し、実行中のプロセスのリソースを管理するように設計された多くの機能/設定があります(CPUマネージャ、sysctl、またはcgroupsを介して)。この場合、これらの設定を調整し、スワップ調整(必要な場合)を調整します。お勧めです。デフォルトでは、デバイスに応じてデフォルトの動作モードを調整します。

特に、本番サーバーでは、変更を適用した後のベンチマーク、ストレステスト、および状況分析が必須です。カーネル設定を目的の用途に調整すると、パフォーマンスが大幅に向上する可能性があります。一方、これにはさまざまな設定をテストして完全に理解する必要があるため、管理者には非常に時間がかかることがあります。

Linuxは以下を使用します支店実行中のアプリケーション間のCPUリソースの負荷分散には、複数のレギュレータを使用できます。デプロイカーネルによっては、一部のレギュレータを使用できない場合があります(欠落しているか、非アップストリームレギュレータを追加するためにカーネルを再構築することがあります)。確認できます県知事は誰ですか変化この場合、さらに重要なことは、設定を調整してください

追加書類:読むガイドエマルジョン周波数スケーリング知事の選択パフォーマンスコントローラそしてCPU周波数

システム制御:

システムコマンド実行時にカーネルパラメータを確認および変更するツールで、設定ファイルを介して永久に調整できます/etc/sysctl.conf。 Sysctlを使用して多くのカーネル設定を変更できるため、これはこの回答の重要な部分です。コマンドsysctl -a、詳細情報は以下で確認できます。これそしてこの記事

カテゴリー:

カーネルは次の機能を提供します。このガイドでは、短い名前であるcgroupと呼ばれる制御グループ。 Cgroupを使用すると、システムで実行されているカスタムタスク(プロセス)グループに、CPU時間、システムメモリ、ネットワーク帯域幅、またはこれらのリソースの組み合わせなどのリソースを割り当てることができます。設定されたcgroupを監視し、特定のリソースへのcgroupアクセスを拒否し、実行中のシステムでcgroupを動的に再設定することもできます。 cgconfig(制御グループの設定)サービスは、起動時に事前定義されたcgroupを起動してリセットし、再起動後も維持されるように設定できます。

ソース、追加の読み取りそして質問この問題では。

メモリ:

これは、システムのRAM容量が制限されている場合に便利です。そうでない場合は、RAMを主に使用するようにスワップを無効にできます。交換システムを調整できますプロセスごとまたは交換設定。必要に応じて、プロセスごとにリソース(メモリ)を制限できます。限界値(他のリソースを制限するためにも使用されます)。

ディスク:

ディスクI / O設定(入力/出力スケジューラ)も変更されることがあります。群れサイズ。

代替:

次のようなその他のツールいいねCPU制限中央処理ユニットワークセットまたは限界値この問題の代替として使用することができます。

答え2

これに対する最良の答えは、「吸って見てみること」です。ストレステストを実施し、何が最良の結果を提供するかを確認することです。これは、スレッドの振る舞いの非常に小さな違いによってパフォーマンスの違いが発生する可能性があるためです。


以下は主に私の経験に基づいています...

どこから始めますか?

Linuxはスレッドの枯渇を防ぐのに非常に堪能です。これは必ずしもすべてのスレッドが均等な共有を受け取ることを意味するわけではありませんが、すべてのスレッドが少なくともいくつかの共有を受け取ります。 CPU 時間をかけて競合する 2 つのスレッドがある場合... 1 つのスレッドは 100% CPU を使用しようとし、もう 1 つは 10% だけ使用しようとするとします。それでは、バランスが91%と9でバランスを取れば、悪くはありません。 %またはどこかにSurpriseがそれを囲んでいます。

特定のリソースがあると、全体的なパフォーマンスが低下する可能性があります。重く超過購読されました。回転するハードドライブのディスクIOの場合は特にそうです。ヘッドはディスクの位置間で物理的に移動(検索)する必要があります。続けて異なるファイル間で振動すると、かなりの速度低下が発生する可能性があります。ただし、あるスレッドがIOバインディングがひどく、もう一方のスレッドがこれを実行しようとすると、一般に影響は非常に小さくなります。少しIO。

この2つの組み合わせは、20%超の購読が20%過小購読よりも一般的に優れていることを意味します。つまり、CPU をあまり使用しないスレッドに対して CPU 時間をスケジュールしないでください。

例:CPUバインディングスレッドとディスクIOバインディングスレッドがあり、コア8個とハードドライブ1個がある場合から始まるCPU集約的なスレッド8個とハードディスクIO集約的なスレッド1個。 7 と 1 は、ほとんどの時間、コアをアイドル状態にすることができます。 8と1はHDスレッドを枯渇させないので、フルHDとCPU使用率を得ることができます。

寿命の短いスレッドの危険性

Linuxたくさん寿命の短いスレッド。これはもっと明らかです。意図的にシステムを損傷しようとする試み。ただし、スレッド/プロセスが継続的に作成されると、Linuxのパフォーマンスが低下する可能性があります。

あなたの質問は、長寿命のスレッドのように聞こえる専用ワーカースレッドについて説明しています。これは正しいアプローチのように聞こえます。

ロンドンバス効果

バスを30分ほど待つとすぐに5台のバスが来ます。 前席バスに乗った乗客がバスの速度を遅くするため、このようなことが発生する。その後のバスの乗客不足により、バス速度が速くなり、混雑効果が発生しました。

特に、スレッドがリソースを配置して競合する場合、同じ問題がスレッドにも存在する可能性があります。スレッドがあるディスクから読み取った後に別のディスクに書き込むなど、期待どおりにタスクを交互に実行する場合、期待どおりにランダムに分散されるのではなく、一緒にクラスタ化される傾向があります。そのため、あるリソースが他のリソースの使用速度を遅くする可能性があります。したがって、時にはスレッドの作業をより細かくする方が良い場合があります。

cgroup

あまりにも詳細な説明は避けてください。しかし、Linuxにはプロセスをグループ化し、集団リソースを制限する「cgroups」という機能があることに言及したいと思います。これは追加のパフォーマンス調整に役立ちます。

それらについての簡単な議論がありますここ。ただし、長期的に役立つ可能性があるため、Googleで時間を費やして、何ができるかを確認することをお勧めします。

答え3

あなたはこれについて間違った方向に行っているかもしれません。シンプルな同期IOを実行していますか?

2つの方法は次のとおりです。

Apache方式:同期IO、接続ごとに1つのプロセス、ジョブの作成および削除を防ぐためのプロセスプール。これにより、コード化が容易で、1秒あたりの接続数が多いが、同時接続数が少ない強力な機能が可能になります。

Nginxモード:非同期IO、コアごとに1つのプロセス。これはpole、システムコールを使用して接続、パケット、およびディスクIOを待ちます。一部の機能をコーディングするのが難しい場合(必要に応じて状態を明示的に保存する必要がある場合)、より多くの同時接続を持つことができます。

どちらの方法も、オペレーティングシステムのスレッドのバランスをとり、コア、ディスク、ネットワークを完全に活用できます。コアごとに1つのスレッドと同期IOを選択すると、ほとんどのコアはほとんどの時間アイドル状態になります。

検索selectとシステムコールpollepoll

関連情報