linux-5.1/documentation/cpu-load.txt
[...]
ほとんどの場合、この
/proc/stat
情報は現実を非常に密接に反映していますが、カーネルがこのデータを収集する方法/タイミングの性質のために、まったく信頼できない場合があります。[...]
システムに次のようにサイクルを定期的に使い果たす作業があるとします。
time line between two timer interrupts |--------------------------------------| ^ ^ |_ something begins working | |_ something goes to sleep (only to be awaken quite soon)
上記の場合、システムの負荷は
/proc/stat
(システムがアイドルハンドラを実行するとタイマー割り込みが常に発生するため)0%になりますが、実際には負荷は99%に近くなります。
このファイルは2007年に追加されました。
たとえば、プロセスが実行可能状態からスタンバイ状態に移行するたびに時間を測定するように変更されたCPUスケジューラ(Schedule()関数など)がありますか?十分に安価で信頼できるタイムソース(信頼できるTSC)?
ドキュメントには、smallhog.c
LKML.orgのリンクされたスレッドによると、CPUが大量に利用可能になり、カーネルにはCPU使用率のわずか数パーセント以下を報告するサンプルプログラムが含まれています。
現在システムでコンパイルして実行してみました。カーネルは、プログラムのCPU使用量が約80%と報告します。だから状況が少し変わったと思います。smallhog.c
このシステムがなぜ効率が悪いのか正確に知っていますか?
私は、「Intel(R)Core(TM)i5-5300U CPU」で64ビットモードで動作するFedora 30、Linuxカーネルv5.2.0-rc5(約)を使用しています。
lscpu
マークconstant_tsc
とnonstop_tsc
。journalctl -k | grep -iE "TSC|clocksource"
カーネルがTSCの問題を検出しないようです。cat /sys/devices/system/clocksource/clocksource0
「tsc」を表示します。
リンクされたスレッドを見る
これはすべてのアーキテクチャに当てはまるわけではなく、一部のアーキテクチャはユーザー/カーネル/割り込み切り替えタイミングを記録してより正確な統計を実行します。もちろん。しかし、これは間違いなくコンピュータアーキテクチャへの一般的でより退屈なアプローチです。
(おそらくヘティック開発がこの問題に影響を与える可能性はありますか?ただ、悪用をより難しくするものであっても。それとももっと簡単ですか?それとも悪用するには少し異なるコードが必要ですか? )。
答え1
smallhog
プロセスのCPU時間が80%で表示されると言われました。 CPUの残りの20%時間は割り込みに費やされます! Smallhog.cが私のシステムでCPU使用率を100%未満で表示するのはなぜですか?
smallhog
割り込み集約的なタスクを実行します。その具体的な戦術は明らかに敗北したIRQ_TIME_ACCOUNTING
。下記をご覧ください。
私はタイマーがカチカチするのを避ける方法がまだあると思います:-)。ダニがいつ発生するかを予測するには、賢い方法が必要な場合があります。たとえば/proc/interrupts
。
config IRQ_TIME_ACCOUNTING
bool "Fine granularity task level IRQ time accounting"
depends on HAVE_IRQ_TIME_ACCOUNTING && !VIRT_CPU_ACCOUNTING_NATIVE
help
Select this option to enable fine granularity task irq time
accounting. This is done by reading a timestamp on each
transitions between softirq and hardirq state, so there can be a
small performance impact.
If in doubt, say N here.
この機能はFedoraカーネル設定で有効になります(参考資料を参照/boot/config-*
)。 x86 CPUはTSCを使用します。この機能は、起動オプションtsc=noirqtime
.[*]を使用して無効にできます。
より正確な会計方法
質問で述べたように、PowerPC / S390には、各コンテキスト切り替えのCPU時間を計算する特定のコードがあります。これは…呼ばれるVIRT_CPU_ACCOUNTING_NATIVE
。しかし、x86カーネルにはこれはありません。
VIRT_CPU_ACCOUNTING_GEN
.(GENは「general」の略)という一般的な同等項目があります。この機能はFedoraカーネルに組み込まれています。ただし、この機能はデフォルトでは有効になっていません。
注意深く読む必要があります:-). VIRT_CPU_ACCOUNTING_GEN
ただ「完全なdynticksシステム」を有効にします。 Fedora カーネルの構成には以下が含まれます。NO_HZ_FULL
、Fedoraはデフォルトで「フルダイナミクス」を有効にしません。 「フルダイナミクス」を有効にするには、起動時にnohz_full=
「adaptive-ticks CPU」リストと一緒にオプションを指定する必要があります。 (「最後のものいいえ-adaptive-tick CPUはオンラインにしておく必要があります...」)
バラよりLinux-5.2-rc5/init/Kconfig:
メニュー「CPU/作業時間と統計」 VIRT_CPU_ACCOUNTINGの構成 ブール値 選ぶ 「CPU時間統計」プロンプト !PPC64の場合、デフォルト値TICK_CPU_ACCOUNTING PPC64の場合、デフォルト値VIRT_CPU_ACCOUNTING_NATIVE #純粋にクロックサイクルベースのCPU時間を計算するためのスタブ構成 TICK_CPU_ACCOUNTINGの設定 bool "シンプルなティックベースのCPU時間の計算" に従って! S390&&!NO_HZ_FULL 助ける 基本クロック周期に基づくCPUTime統計。 各 jiffies で消費されたユーザー、システム、アイドル時間に関する統計 粒度。 よくわからない場合はYを選択してください。 VIRT_CPU_ACCOUNTING_NATIVEの設定 bool "決定的なタスクとCPU時間統計" HAVE_VIRT_CPU_ACCOUNTING && !NO_HZ_FULL によって異なる VIRT_CPU_ACCOUNTINGを選択してください。 助ける より正確なジョブとCPU時間を有効にするには、このオプションを選択します。 会計。これは、各プロセッサのCPUカウンタを読み出すことによって行われます。 カーネルの起動と終了、カーネル内の切り替え システム、ソフト割り込み、ハード割り込み状態の間 パフォーマンスへの影響は小さいです。 s390またはIBM POWER> 5の場合、 これにより、論理区画で盗まれた時間に関する統計も可能になります。 システム。 VIRT_CPU_ACCOUNTING_GENの設定 bool "完全動的CPU時間統計" HAVE_CONTEXT_TRACKINGによって異なる HAVE_VIRT_CPU_ACCOUNTING_GENによって異なる GENERIC_CLOCKEVENTSによって異なる VIRT_CPU_ACCOUNTINGを選択してください。 コンテキスト別トレースの選択 助ける ジョブとCPU時間統計を完全に有効にするには、このオプションを選択します。 ディンティクスシステム。この会計処理は各項目を観察することによって行われます。 コンテキストを使用して、サブシステムのカーネルとユーザーの境界を追跡します。 したがって、会計は、いくつかの重要なコストを犠牲にして実行されます。 高い。現在、これは完全な操作を実行する場合にのみ便利です。dynticksサブシステムの開発よくわからない場合は、Nを選択してください。 最終選択
最後の段落は古いので線を引いた。今、「完全なdynticksサブシステム」が開発されました。
[*]TSCに関する注意事項
x86 CPUにTSCがない場合、カーネルはIRQ_TIME_ACCOUNTING
(またはVIRT_CPU_ACCOUNTING_GEN
)に別のハードウェアクロックソースを使用しようとしません。
このコードは、使用可能なTSCが承認されたことを示します。 CPUなしでCPUでこれがどのように機能するかわかりませんconstant_tsc
:-)。関連するメンテナンス者が問題を知っていて、それが許される理由を尋ねると99.9%確信しているが。
バラよりNative_sched_clock()そしてtsc_init():
/*
* Fall back to jiffies if there's no TSC available:
* ( But note that we still use it if the TSC is marked
* unstable. We do this because unlike Time Of Day,
* the scheduler clock tolerates small errors and it's
* very important for it to be as fast as the platform
* can achieve it. )
*/