atop
私は(私のFedora 30インストールで)輝く新しいラインがあることを発見しました。
PSI - 圧力失速情報。
この行には、各カテゴリーの3つのパーセンテージ、つまり過去10秒、60秒、および300秒間の平均圧力の割合(スラッシュで区切られた)が含まれています。カテゴリは、「一部」CPU(
cs
)、「一部」メモリ(ms
)、「フル」メモリ(mf
)、「一部」I / O(is
)、および「フル」I / O(if
)です。
詳しくは、「」をご覧ください。圧力失速情報追跡「[LWN.net, 2018]。
5分10秒間隔で走ってdd if=/dev/zero bs=1M of=test
見守りました。最も高いis
値はif
63%です。その高い値に達するには数回待つ必要があります。
この指標は、「すべてのIO遅延によるCPUの潜在的な損失」になると予想しました。[1]/"タスクはioが完了するのを待っています。"[2]100%同じでしょう...
私の初期の期待は現実ではありませんでした。atop
私の著者は、dd
既存のプロセスリストでCPUの15〜20%を使用しているからです。しかし、この数字を加えてもまだ100%ではありません:-)。
対照的に、(O_DIRECTなしで)ファイルを読むことは約43%dd
に増加しis
、CPUの約9%を使用しているようです。それは少なくともそうだここに大きなギャップがあるように:-)。
dd
ライターを実行すると、oflag=direct
IO圧力が51%に達し、CPU使用率が6%になります。
dd
リーダーを実行すると、iflag=direct
IO圧力は47%に達し、CPU使用率は3%です。
この明らかな違いをどのように理解していますか?
IOスケジューラはmq-deadline
機械式ハードディスクです。私のカーネルはv5.2-rc5-290-g4ae004a9bca8
3つのext4パッチで構成されていますが、これは重要ではありません。
答え1
この質問に対する私の最初の答えは、「IO圧力」が「CPU IOレイテンシ」の概念と密接に関連していることです。私が見たCPU IOの待ち時間も短すぎるようです。したがって、「IO圧力」が何の意味もないとは限りません。
しかし今は少なくともそれを持っています。CPU iowait時間問題に対する解決策。言い換えれば、iowaitで始まると、nohz=off
予想されるiowait時間が与えられます。あるいは、CPUアイドルの代わりにポーリングを強制して同じ効果を得ることもできます。これにより、スケジューラティックが決して止まらないようになります。
cd /sys/devices/system/cpu
# Disable all cpuidle states, including C1 ("halt"), but not POLL
for i in cpu*/cpuidle/state[1-9]*/disable; do echo 1 | sudo tee $i; done
# Reset to default (C-states enabled)
for i in cpu*/cpuidle/state*/disable; do echo 0 | sudo tee $i; done
起動すると、nohz=off
「IO圧力」の値も増加するようです。私はまだ新しい価値に自信を持っていません。私が予想したものに近づいたようです...
nohz=off
コードを正しく理解しても、iowaitのようにIO圧力を上げることは意味がありません!少なくとも圧力ストール情報の元のパッチは完全にイベントベースのようです。スケジューラに頼ることは見えません!
実行中(最小60秒)、次のatop
行が使用されました。dd if=test iflag=direct bs=1M of=/dev/null
CPU | sys 2% | user 1% | irq 1% | idle 300% | wait 96%
cpu | sys 1% | user 0% | irq 0% | idle 89% | cpu003 w 10%
cpu | sys 1% | user 0% | irq 0% | idle 23% | cpu001 w 76%
cpu | sys 0% | user 0% | irq 0% | idle 98% | cpu000 w 1%
cpu | sys 0% | user 0% | irq 0% | idle 90% | cpu002 w 9%
CPL | avg1 0.76 | avg5 0.92 | avg15 0.84 | | numcpu 4
PSI | cs 0/0/0 | ms 0/0/0 | mf 0/0/0 | is 83/57/44 | if 83/57/44
- CPU3のアイドル時間以外の時間(100〜89)は11%です。 10%は「iowait」と計算されます。
- CPU1はアイドル時間ではなく時間(100〜23)の77%を持ちます。 76%は「iowait」と計算されます。
- cpu2+cpu0の非アイドル時間は12%です。 10%は「iowait」と計算されます。
ms
0です。したがって、いくつかの(無視できない)iowait時間を「IO待機停止」ではなく「メモリ競合停止」として計算することは不可能です。 (しかし、これがより一般的かどうかはわかりません)。
psi は各 CPU に関連する作業状態を追跡し、停止状態で費やされた時間をサンプリングします。 2秒ごとに、サンプルはCPU全体で平均を取得し(使用していないCPUからアーティファクトを削除するためにCPUがアイドル状態ではない時間で重みを付けて)、停止時間の割合に変換されます。
たとえば、CPU1のIO圧力は76/77 = 98.7%(全体)です。これは加重平均で最大の項でなければなりません。それで、まだ報告された価値が予想よりはるかに低いと思います。
上記のテストでは、「全体」値は「部分」値と基本的に同じです。したがって、これらの不思議な違いは、「IO圧力(一部)」にも適用されると予想されます。
重要なのは、加重平均に使用される「非アイドル」時間は純粋なアイドル時間だけを除外することです。したがって、「非アイドル」時間は単なるCPU使用量ではありません。 「非アイドル」時間には「CPU IOレイテンシ」も含まれます。
構造体 psi_group_cpu { /* このグループに属するジョブの状態 */ 符号なし整数操作[NR_PSI_TASK_COUNTS]; /*実行可能ファイルがありますまたはD状態仕事*/ 無料ではありません。
groupc->nonidle = ジョブ[NR_RUNNING] || ジョブ[NR_IOWAIT] ||ジョブ[NR_MEMSTALL];
注:PSIは実際に報告されたCPU固有の「iowait」を使用しません。自己会計を実行します。繰り返しますが、私のリンクの質問によると、「iowait」が深刻に過小評価されている可能性がありますが、考える「iowait」に対応するPSIは、この問題を回避するように設計されています。
このコマンドを単一のCPUに固定すると、抑制されdd
た場合はtaskset -c 0
IO圧力が96%、そうでない場合は90%になります。NO_IDLE_HZ
私にとっては、この数字はもっと信頼できるようです。