
Linux でユーザーが使用しているプロセッサの合計数を知るにはどうしたらよいでしょうか。たとえば、ユーザー「X」は 2 つ (またはそれ以上) のプロセスを実行し、合計 3 つのプロセッサを使用しています。どうすればそれを知ることができますか。不可能な場合、ユーザーが使用できるプロセッサの数を知るにはどうしたらよいでしょうか。たとえば、ユーザー「X」は 2 つのプロセッサ (可能な 8 つのうち) でセッションを開きました。
ユーザー名 (たとえば「root」) を取得し、スカラー番号 (可能な値のうちの 1 つ) を返す Perl 関数を作成する必要があります。1. ユーザーが使用したプロセッサの合計数 (たとえば、8 個のうちの 2 個) 2. ユーザーが使用したコアの合計数 3. ユーザーが使用できるプロセッサ 私の場合、ユーザーは数日間実行される 1 つの (おそらくそれ以上の、それほど多くはない) 大きなプロセスを実行し、(特別なユーザーの) プロセスがマシンにどのように負荷をかけるかを知りたいのです。なぜなら、ユーザーがリソースを大量に使用した場合、それを停止する必要があるからです。
答え1
特定のプログラムがどのコアを使用したかを知ることはできません。CPU は、多数の要因に基づいて、目に見えない形で自動的にスレッドをコアに割り当て、各スレッドに処理時間を割り当てる際にタイムスライスが行われている場合でも、すべてが同期して実行されているように見せるためにさまざまな工夫を凝らしています。
結局のところ、セッションはコアのセットにマップできません。 1 つ以上のコアでスレッドを実行するプログラムの使用にセッションをマップすることはできますが、それはすべてのプロセスの現在の状態に基づいて厳密に必要な場合に限られます。
サリーに 2 つのコア、ボブに 2 つのコア、トムに 4 つのコアを割り当てて、コアが不足するようなことはありません。サリー、ボブ、トムのプログラムはすべて最大 8 つのコアを使用でき、システムはスレッドを処理機能に割り当てる最適な方法を決定します。
答え2
使用できますsched_getaffinity と sched_setaffinityユーザーのプロセスがどのコアで実行できるかを調べます。ただし、すべてのコアで実行されるわけではありません。
プロセスを実行できるコア数を制限するには、CPUセット(特定の部分cグループ)
例:参照このガイドRed Hat 6でcgroupにプロセスを追加する方法についてこのガイドグループごと (つまりユーザーごと) に CPU とメモリを効果的に分割する方法について説明します。
特定のユーザーが使用している CPU% を取得することだけに興味がある場合は、次のワンライナーを使用できます。
top -b -n 1 -u <username> | awk 'NR>7 { sum += $9; } END { print sum; }'