前書き
CPU
負荷の理解
ここでは、CPU負荷とCPU使用率を区別する必要があります。これらは2つの異なる概念ですが、それらの情報は同じトップコマンドで表示できます。
CPU使用率は、プログラムの動作中にプログラムがリアルタイムで占有しているCPUの割合を示し、CPU負荷は、一定期間にCPUを使用していて使用を待機しているタスクの平均数を示します。CPU使用率が高いからといって、必ずしも負荷が大きいとは限りません。インターネット上の記事は、2つの違いを説明するために電話を使用して、興味深いアナロジーを与えました。
公衆電話ボックスでは、1人が電話をかけ、4人が待機しています。各人は1分間の電話の使用に制限されています。誰かが1分以内に電話を終了しない場合、電話を切って列に並ぶことしかできません。次のラウンド。ここでは、電話はCPUに相当し、電話をかけている、または電話を待っている人の数は、タスクの数に相当します。
電話ボックスを使用している間、電話を切った後に必ず立ち去る人もいれば、電話を切らずに再度列に並ぶ人もいれば、ここに新しい人が列を作る人もいます。人数の変化は増加に相当します。またはタスクの数の減少。平均負荷状況をカウントするために、5秒ごとに人数をカウントし、最初の1、5、および15分の統計を平均して、最初の1、5、および15分の平均負荷を作成します。
電話を手に取って1分間電話をかける人もいれば、30秒前に電話番号を探したり、電話をためらったりして、実際には30秒後に電話をかける人もいます。電話機をCPU、人数をタスクとすると、前者(タスク)のCPU使用率は高く、後者(タスク)のCPU使用率は低いと言えます。 。
もちろん、CPUは最初の30秒間は動作せず、次の30秒間は休止します。これは、一部のプログラムが多くの計算を必要とするため、CPU使用率が高く、一部のプログラムがほとんど計算を必要としないことを意味します。、CPU使用率は当然低いです。ただし、CPU使用率が高いか低いかに関係なく、キューに入れられているタスクの数は必ずしも重要ではありません。
top
マシンの負荷を表示する
Tasks: 2244 total, 1 running, 2151 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.3 us, 1.6 sy, 0.0 ni, 92.2 id, 1.7 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 49199592 total, 21400612 free, 21820432 used, 5978548 buff/cache
KiB Swap: 16653308 total, 3981452 free, 12671856 used. 26274108 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18142 mfeng 20 0 19.715g 3.565g 8704 S 46.7 7.6 9:22.22 java
6986 root 0 -20 0 0 0 I 12.1 0.0 4:44.67 kworker/11:1H
20692 mfeng 20 0 11.883g 0.012t 2168 D 11.8 25.3 1:12.41 ld
9889 root 20 0 0 0 0 I 2.0 0.0 0:24.43 kworker/11:2
21495 root 20 0 37512 5672 3048 R 1.6 0.0 0:00.15 top
20656 root 20 0 0 0 0 I 0.7 0.0 0:00.23 kworker/4:0
21341 root 20 0 0 0 0 I 0.7 0.0 0:00.10 kworker/4:2
8 root 20 0 0 0 0 I 0.3 0.0 0:06.17 rcu_sched
`load average`代表CPU的平均负载值,这些数据来自于文件`/proc/loadavg`,内核会负责统计出这些数据。`top`和`uptime`命令显示的内容就来自于这个文件,根据proc的帮助文件可知,这里的值就是单位时间内**处于运行状态以及等待磁盘 I/O状态的平均job数量**。
- 1、 对于内核而言,进程和线程都是job
- 2、 job处于运行状态指job处于内核的运行队列中,正在或等待被`CPU`调度(用户空间的进程正在运行不代表需要被CPU调度,有可能在等待I/O,也有可能在sleep等等)
シングルコアの例
- 1. 1未満:平均して一度に1つ未満のジョブがビジーであることを意味します。シングルコアCPUの場合、処理できます。
- 2. 1に等しい:平均して、毎回ビジーなジョブが1つだけあることを意味します。シングルコアCPUの場合、それを処理できます。
- 3. 1より大きい:平均して一度に複数のジョブがビジーであることを意味します。シングルコアCPUの場合、一度に処理できるタスクは1つだけなので、待機中のタスクが必要であり、システムの負荷を示します。が大きく、スケジューリングを実行できません。待機するジョブがあります。
シングルコアCPUの場合、1を超えると、ジョブを時間内にスケジュールできず、システムパフォーマンスに影響します。2コアの場合、2より大きい値は、CPUがビジーすぎることを意味します。
%Cpu(s)
load average
実行を待機しているジョブの平均数を%Cpu(s)
カウントCPU
し、さまざまな状態の時間を直接カウントすることでCPUのビジー状態を推測します。これは上記よりもload average
直感的であるため、実際にはより多く使用されます。
一般的に、CPUは次の3つの状態のいずれかになります。
-1 Idle
、:アイドル状態、タスクをスケジュールする必要はありません
-2 User space
、:ユーザースペースコードの実行(ユーザーモード)
-3 Kernel
。:カーネルの実行コード(カーネル状態で)
上記の3つの状態のうち、カーネルはさらに多くの状態に細分されます。これは、上記で出力された8つの状態の例です
。-1。us:CPUが2.5%の時間実行されていることを意味しますユーザーモードコード(つまり、ユーザーモードプログラムが実行されている)
-2。sy:CPUがカーネルモードコードを1.8%の時間実行していることを意味します。カーネルは、システムのすべてのプロセスとハードウェアリソースを管理する責任があります。すべてのカーネルコードはカーネルモードで実行されます。ユーザーモードのプロセスがメモリの割り当て、I / Oの読み取りと書き込みなど、ハードウェアリソースにアクセスする必要がある場合は、それらもシステム呼び出しを介してカーネルモードに入る必要があります。カーネルコードを実行します。高い%syは、カーネルが使用するリソースが多すぎるか、ユーザープロセスが開始したシステムコールが多すぎることを示します。
-3。ni:これは、CPUが3.1%の時間、niceが0ではないプロセスコードを実行していることを意味します。デフォルトでは、プロセスのniceness値は0ですが、プロセスを開始して、niceコマンドを使用してそのniceness値を指定できます。niceness値の範囲は-20〜19です。値が小さいほど、優先度が高くなり、高くなります。優先度。カーネルによってスケジュールされます。
-4。id:CPUが90.5%の時間アイドル状態であることを示します
-5。wa:CPUが1.7%の時間I / O待機状態にあることを示します。通常、CPUがI / O操作に遭遇すると、最初にI / O操作をトリガーし、次に他のことを実行します。I/ O操作が完了した後、CPUは引き続き動作しますが、システムが比較的この時点でアイドル状態の場合、CPUは他に何もすることがないため、CPUは待機状態になります。この待機状態の時間はI / O待機にカウントされます。つまり、CPUはI / O状態にあります。待機状態、つまりCPUはアイドル状態であり、何の関係もありません。I/ O操作が終了すると、アイドル状態とほぼ同じになります。高い値はCPUがアイドル状態であり、I / O操作または低速I / O操作が多いことを示しますが、低い値はI / O操作または高速I / O操作がないことを示しません。CPUが原因である可能性があります。他の何かで忙しいので、これは単なる参照値であり、他の統計項目と一緒に分析する必要があります。
- 6、ハイテク&SI:この2つの値は、割り込み処理に費やさどのくらいのCPU時間を反映してhi(hardware interrupts)是硬件中断
、si(softirqs)是软件中断
。ハードウェア割り込みは通常、ネットワークカードやディスクなどのI / Oデバイスによって発生します。ハードウェア割り込みが発生した後、CPUはすぐにそれを処理する必要があります。ハードウェア割り込みで処理するものが多い場合、カーネルは対応するソフト割り込みを生成しますが、これには時間がかかり、すぐに処理する必要のない操作はソフト割り込みで実行されます。たとえば、ネットワークカードがネットワークパケットを受信すると、CPUはデータをすぐにコピーする必要があります。ネットワークカードのキャッシュが小さいため、メモリ。時間内に処理されないと、次のデータパケットが入り込めず、パケットが失われます。データがメモリにコピーされた後は、必要ありません。このとき、ソフト割り込みでデータパケット(プロトコルスタック)を処理するためのコードを実行することができます。
-7。st:%stは仮想マシンに関連しています。システムが仮想マシンで実行されている場合、現在の仮想マシンはCPUをホストマシンおよび他の仮想マシンと共有します。%stは、現在の仮想マシンがCPUがその時間を提供するのを待っています。値が大きいほど、物理CPUがホストマシンや他の仮想マシンによって占有される時間が長くなり、現在の仮想マシンのCPUリソースが不足します。%stが長期間0より大きい場合は、CPUリソースが満たされていないことを意味します。このとき、仮想マシンを別のマシンに移動するか、現在のマシンで実行されている仮想マシンの数を減らすことを検討できます。
上記の統計項目の合計は100%に等しくなります。%idleを除いて、値が高すぎる場合は、システムに問題があることを示しています。
問題が解決しました。
- 1.%usが高すぎる:ユーザーモードプロセスがCPUを占有しすぎていることを意味します。topコマンドを使用すると、どのプロセスが実行されているかを明確に確認できます。これが予期しない動作である場合は、対応するプロセスを強制終了するか、再起動できます。キルコマンドを介してそれ
- 2.%syが高すぎる:たまにしか高くない場合でも心配はいりませんが、上昇し続ける場合は注意が必要です。一部のプロセスのシステムコールが頻繁すぎる可能性があります。たとえば、プロセスは引き続きログをコンソールに出力します。ただし、ユーザーモードプロセスに問題がない場合は、カーネル内のコード、特にコードの記述が不十分なドライバーモジュールに問題がある可能性があります。
- 3.%niが高すぎる:誰かがCPUを消費するプロセスを実行するために素晴らしいプログラムを使用したことを意味します。niceness値が0より大きい場合、その優先度はデフォルトの優先度よりも低く、CPUパフォーマンスに影響を与えないため、心配する必要はありませんが、プロセスがシステムの他のリソースをプリエンプトしないことを確認することをお勧めします。システムの全体的なパフォーマンスに影響を与えないようにするための、メモリ、ディスクI / Oなど。niceness値が0未満の場合は、プロセスの優先度が高く、多くのCPUリソースを占有していることを意味します。プロセスが占有しているCPUリソースが期待どおりであることを確認する必要があります。そうでない場合は、次を使用できます。それを見つけて殺すか再起動するためのトップコマンド。
- 4.%waが高すぎる:システム内に多くのI / O操作を実行するプロセスがあるか、ディスクの読み取りと書き込みが頻繁に行われるなど、読み取りと書き込みの速度が遅いI / Oデバイスがあることを意味します。 iotopコマンドを使用して、どのプロセスがI / Oを占めるかを確認し、それに応じてさまざまなプロセスを処理できます。システムがスワップパーティションを頻繁に使用している別の状況があり、この時点で解決する必要があるのはメモリの問題です。 、I / Oの問題ではありません。
- 5.%hiまたは%siが高すぎる:%hiが高すぎる(通常はハードウェアの問題が原因)、%siが高すぎる(通常はカーネル内のコードが原因)。
- 6.%stが高すぎる:前述のように、%stが高すぎるため、現在の仮想マシンが十分なCPUリソースを取得できないことを示します。この時点で、現在の仮想マシンを別のホストに再配置することを検討するか、他の仮想マシンをオフにするなど、現在のホストの負荷を軽減する方法を見つけることができます。