4

私の職場には、ジョブを実行する共有の強力な 24 コア サーバーがあります。マルチコア CPU の能力を最大限に活用するために、各コアで 24 のスレッドが同時に実行されるように、長時間実行プログラムのマルチスレッド バージョンを作成しました (threadingライブラリを介してJython)。

他のジョブが実行されていない場合、プログラムは迅速に実行されます。ただし、1 つのコアで同時に大きなジョブを実行していたため、その特定のコアで実行されているスレッドに時間がかかり、プログラム全体の速度が低下しました (スレッドが最後にデータを結合する必要があるため)。ただし、他のCPUのスレッドは長い間実行を終了していたため、基本的に23コアがアイドル状態で、1コアがスレッドと重いジョブを実行していました。少なくともこれが私の診断です。これは、コマンドの出力を調べることでさらに確認されましたtime。sys 時間は、ユーザー時間と比較して非常に短かった (つまり、多くの待機があったことを意味します)。

オペレーティング システム (Linuxこの場合) は、1 つの CPU がロードされ、他の CPU がアイドル状態の場合、ジョブを別の CPU に切り替えませんか? そうでない場合、私のプログラムでそれを行うことはできますか (でJython)。時々さまざまな CPU 負荷を照会してから、比較的空いている負荷に切り替えることは難しくありません。

ありがとう。

4

1 に答える 1

1

ソースhttp://www.ibm.com/developerworks/linux/library/l-scheduler/ :

CPU 間でバランスのとれたワークロードを維持するために、過負荷の CPU から仕事を受け取り、負荷の低い CPU に与えることで、作業を再分配できます。Linux 2.6 スケジューラは、負荷分散を使用してこの機能を提供します。プロセッサは 200 ミリ秒ごとに、CPU 負荷のバランスが取れていないかどうかを確認します。そうである場合、プロセッサはタスクのクロス CPU バランスを実行します。

このプロセスのマイナス面は、新しい CPU のキャッシュが移行されたタスクに対してコールドであることです (データをキャッシュにプルする必要があります)。

Linux はしばらくの間、コア間でスレッドのバランスを取っているようです。

ただし、Linux の負荷分散が即座に行われると仮定すると (実際にはそうではありません)、問題は依然として 23 コアと 24 タスクの問題に縮小されます。最悪の場合 (すべてのタスクに同じ時間がかかる場合)、23 個のタスクしかない場合の 2 倍の時間がかかります。これは、すべてのタスクが完了するまでにかかる時間が同じである場合、最後のタスクは別のタスクの実行が完了するまで待機する必要があるためです。フリーコアがあります。

プログラムのウォールクロック時間が約 2 倍遅くなる場合は、おそらくこれが問題です。

2x より大幅に悪い場合は、古いバージョンの Linux スケジューラを使用している可能性があります。

于 2013-09-22T22:48:03.440 に答える