web-dev-qa-db-ja.com

スレッドのバランスをとる必要がありますか、それともLinuxはこれを行うのですか?

簡単な例。 TCPソケットを使用してhttpリクエストを処理するプロセスを実行しています。それは、A)CPUがボトルネックになることを意味する何かを計算するB)ネットワークをボトルネックまたはC)セミランダムアクセスを伴う複雑なデータベースクエリがディスクのボトルネックを引き起こしている

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

ハードウェアスレッド12と48には2つの数値を使用します(Intel xeonにはその数があります)。スレッドの3分の2を重いCPU(8/32)、重いディスク用の1スレッド(またはディスクごとに1つの重いスレッド)、残りの3/15を他のものに使用することを考えていました。ネットワークのバランスをとります。

12/48スレッドのみをサポートするハードウェアに12/48スレッド以上あるべきですか? CPUがより遅いスロットリングモードにならないように、必要な量を減らしますか(それが何と呼ばれるかは忘れますが、一度にアクティブになっているチップが多すぎると発生すると聞きました)。スレッドをロードしてリソースのバランスをとる必要がある場合、どうすればよいですか?

8
Eric Stotch

Linux:

Linuxカーネルは問題に優れた実装を備えており、実行中のプロセスのリソース(CPUガバナー、sysctl、またはcgroupを介して)を管理することを目的とした多くの機能/設定があります。基本的には、デフォルトの機能モードをアプライアンスに適合させることをお勧めします。

変更を適用した後のベンチマーク、ストレステスト、および状況分析は、特に運用サーバーでは必須です。カーネル設定が必要な使用法に調整されている場合、パフォーマンスの向上は非常に重要です。一方、これには、管理者にとって時間のかかるさまざまな設定のテストと十分な理解が必要です。

Linuxは governors を使用して、実行中のアプリケーション間でCPUリソースを負荷分散します。多くのガバナーを使用できます。ディストリビューションのカーネルによっては、一部のガバナーが使用できない場合があります(カーネルの再構築を行うと、欠落している、または上流でないガバナーを追加できます)。 現在のガバナーは何ですか変更する 、そしてこの場合はさらに重要な 設定を調整する を確認できます。

追加のドキュメント: readingguidesimilar questionfrequency scalingchoice of知事 =、 パフォーマンスガバナー および cpufreq

SysCtl:

Sysctl は、実行時にカーネルパラメータを検査および変更するためのツールです。構成ファイル/etc/sysctl.confを使用して調整を永続的に行うことができます。これは、多くのカーネル設定を変更できるため、この回答の重要な部分ですSysctlでは、使用可能な設定の完全なリストをコマンドsysctl -aで表示できます。詳細は this および this article で確認できます。

Cgroup:

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

出典、参考文献 および 質問 問題について。

羊:

これは、システムのRAMの量が限られている場合に役立ちます。そうでない場合は、スワップを無効にして主にRAMを使用できます。スワップシステムは プロセスごと または swappiness設定 で調整できます。必要に応じて、リソース(ram)をプロセスごとに limit で制限できます(他のリソースを制限するためにも使用されます)。

ディスク:

ディスクI/O設定( I/Oスケジューラ )および cluster サイズが変更される場合があります。

代替案:

Nicecpulimitcpusettaskset または limit などの他のツールを使用できます問題の代わりとして。

6
intika

これに対する最良の答えは、「吸い込んで見る」です...いくつかのストレステストを実行し、最良の結果が得られるものを確認してください。これは、スレッドの動作の微妙な微妙な違いがパフォーマンスの違いを引き起こす可能性があるためです。


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

どこから始めれば?

Linuxの機能は、スレッドが枯渇するのを防ぐのに優れています。これは、必ずしもすべてのスレッドが円グラフの均等なシェアを取得することを意味するわけではありませんが、すべてのスレッドが少なくともいくつかの円グラフを取得します。 CPU時間をめぐって競合する2つのスレッドがある場合... 100%のCPUを使用しようとするスレッドと10%だけを使用しようとするスレッドがあるとします...それが91%と9%またはどこかでバランスが取れていても驚かないでくださいその周り。

全体的なパフォーマンスは、特定のリソースが重いでサブスクライブされている場所を減らす可能性があります。これは特にディスクの場合に当てはまりますIO回転しているハードディスクの場合。ヘッドは物理的にディスク上の場所間を移動(シーク)し、継続的に振動する異なるファイルは大幅な速度低下を引き起こす可能性があります。ただし、1つのスレッドが大幅にIOバインドされ、別のスレッドがを実行したい場合、この影響はかなり小さいことがよくありますIO。

これらの2つのことを一緒にすると、多くの場合、サブスクライブされている20%よりもサブスクライブされている20%の方が優れています。つまり、CPUをあまり使用しないスレッドのためにCPU時間を予約しないでください。

例:CPUにバインドされたスレッドがあり、ディスクがある場合IOバインドされたスレッドで、8つのコアと1つのハードディスクがある場合、8つのCPUで始まりますバインドされたスレッドと1つのハードディスクIOバインドされたスレッド。7と1は、ほとんどの場合、コアをアイドル状態のままにする可能性があります。8と1は、HDスレッドを完全に枯渇させないため、両方のHDを完全に使用します。そしてCPU。

短命のスレッドの危険性

Linuxはたくさんの短命のスレッドと格闘することに注意してください。これは システムに損傷を与える意図的な試み でより明白になります。ただし、継続的にスレッド/プロセスを生成すると、Linuxの動作が低下する可能性があります。

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

ロンドンバス効果

バスを30分待ってから、一度に5人が集まります。これは、フロントバスに乗っている乗客がバスを減速させるために発生します。後のバスの乗客の欠如は彼らを加速させ、群集効果を引き起こします。

同じ問題がスレッディング、特にリソースをめぐって競合するスレッドで発生する可能性があります。たとえば、あるディスクから読み取り、次に別のディスクに書き込むなど、タスク間でスレッドが予測どおりに交互に発生する場合、スレッドは予想どおりに確率的に分散するのではなく、束になる傾向があります。したがって、1つのリソースが別のリソースの使用を遅くする可能性があります。このため、スレッドのタスクをさらに細分する方が良い場合があります。

cgroup

あまり詳細には触れません。ただし、Linuxには「cgroups」と呼ばれる機能があり、プロセスをグループ化してそれらの集合リソースを制限できることを述べておきます。これは、さらにパフォーマンスを調整する際に非常に役立ちます。

それらについての短い議論があります here 。しかし、私はあなたが長期的にあなたを助けるかもしれないので、それらの完全な機能を確認するためにグーグルに少し時間を費やすことをお勧めします。

3
Philip Couling

あなたはそれを間違った方法で行っているかもしれません。単純な同期IOを実行していますか?

2つのアプローチは次のとおりです。

Apacheの方法:同期IO、接続ごとに1つのプロセス、タスクの作成と破棄を回避するプロセスプール。これはコーディングが簡単で、強力な機能、1秒あたりの接続数は多くても、同時接続数は少なくて済みます。

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

これらの両方により、OSはスレッドのバランスを取り、コア、ディスク、ネットワークを最大限に活用できます。コアごとに1つのスレッドと同期IOを使用する場合、ほとんどの場合、ほとんどのコアがアイドル状態になります。

selectpollepollシステムコールを検索します。

1
ctrl-alt-delor