
htop
命令が各CPUコアとプロセスの使用率を別々に報告することを確認しました。
私たちは、CPUで一度に1つのプロセスしか実行できないことを知っています。プロセスがCPUの特定の「比率」を占めることはどのように可能ですか?
これはそれと関係がありますか?コマンドパイプライン?
答え1
上部には経時的な使用量が表示されます(デフォルトでは約3秒)。デフォルトでは、その間隔中に特定のプロセスIDによって使用されるCPU時間の割合が表示されます。この割合は100%を超えることがあります。デュアルコアシステムで2つのスレッドを実行し、両方のコアを使用しているプロセスがある場合、そのプロセス番号の%CPU列に約195%が表示されます。
マニュアルページに記載されているように詳細を追加するには、次の手順を実行します。
k: %CPU - CPU 使用量 最後の画面表示以降、このジョブで使用したCPU時間のシェア 合計CPU時間の割合として表示される更新。本当のSMPでは 環境で「Irix Mode」をオフにすると、top は「Solaris」で実行されます。 モード'、ここでジョブのCPU使用量は総使用量に分けられます。 CPUの数。 「I」を使用して、「Irix / Solaris」モードを対話式に切り替えることができます。 注文する。 ... -d:遅延間隔は次のとおりです。 -d ss.tt(秒.十分の日) 画面の更新とオーバーライドの間の遅延を指定します。 個人プロファイルの応答値または デフォルト値を開始します。後で「d」または「s」を使用して変更できます。 対話型コマンド。 ... グローバルデフォルト 'A' - 代替ディスプレイをオフにする(全画面) * 'd' - 遅延時間3.0秒 'I' - Irixモードオン( 'solaris' smpではない) * 'p' - PIDモニタリングオフ * 's' - セーフモードオフ(安全ではない) 'B' – 太字で無効
したがって、%CPU列は、最後の画面更新以降のコンピュータの合計CPU時間に対する割合です。コマンドラインまたはインタラクティブに画面の更新間隔を変更できますが、デフォルトは3秒です。 Irixモードはデフォルトで有効になっており、%CPUはマルチプロセッサシステムで100%を超えることができますが、Irixモードはコア数に応じてパーセンテージが減少するように無効にできます。
答え2
短い答え
- Linuxカーネル統計の使用ジフィス(CPU時間単位)は、
/proc/<PID>/stat
単一プロセスが開始されてからどのくらいのjifiesを使用したかを示します。 htop
jiffies合計(CPUスレッド数で割った)の2つのスナップショットを比較します。これら2つの時点の間隔は、-d --delay=DELAY
10分の1秒単位で設定できます。たとえば、1s
更新間隔(デフォルトは1.5s
)です-d 15
。
htop -d 10
100%
1.5
これは、観測された期間(秒単位)の間、単一のプロセスが常に1つのCPUスレッドを使用することを意味します。この値は長期間にわたって代表性がない可能性があります。- +/ キーを使用して-更新間隔を変更できます。
より長い説明
最高のソースはソースコード:) (Linux ルックアップLinuxProcessList_scanCPUTime
機能用).
htop
読み取りはPROCSTATFILE
に保存されているシステム全体の統計情報を指し/proc/stat
、それを直接確認できます。
$ cat /proc/stat
各プロセスの値については、以下を参照してください。
/proc/<PID>/stat
- 最初の行には合計 CPU 使用率が表示され、列には次の値が表示されます。
usertime, nicetime, systemtime, idletime, ioWait, irq, softIrq, steal, guest, guestnice
- 次の行は、各CPUコア(スレッド)に対して同じ値を示しています。
- 合計時間は次のように計算されます。
totaltime = usertime + nicetime + systemalltime + idlealltime + steal + virtalltime
totaltime
CPUの数($ nproc
Linuxの値)で割ります。
double period = (double)this->cpus[0].totalPeriod / cpus;
最後に、LinuxProcessList_recurseProcTree
パーセンテージは2つのタイムスタンプ間の使用量として計算されます。
percent_cpu = (period < 1e-6) ? 0.0f : ((lp->utime + lp->stime - lasttimes) / period * 100.0);
utime
ユーザーコードが費やしたCPU時間(クロック周期で測定)stime
クロック周期で測定されたカーネルコードで費やされたCPU時間lasttimes
以前の「時間」lp->utime + lp->stime
(クロックサイクル)です。
- 最後に、この計算に使用される時間単位は jiffies によって異なります。
man 7 time
詳しくは参考資料をご覧ください。
t * 100 / jiffy
jiffy
通常の時間ではなく、1秒あたりのクロックティック数はどこにありますか?
jiffy = sysconf(_SC_CLK_TCK);
以下を使用してクロックティック値を取得できます。
$ getconf CLK_TCK
100
(つまり、特別なハードウェアやリアルタイムLinuxなどを使用していない場合は、この計算を無視できます。)
答え3
統計は次のとおりです。 50%は「一定期間のCPUの半分」を意味し、詳しく見ると、その期間が何であるかがわかります。