ん~C言語読めない(ぉぃ
あとはてなブログの書き方がわからんw
基本的には/proc/statをfopenして、行頭に「cpu」と言うキーワードがある行の数字をatoiで文字->数値変換して格納するだけです。
— youichi (@yo_1) 2019年5月20日
CPU使用率(system.cpu.util)取得値について - ZABBIX-JP https://t.co/gdSwwbVBPM
知らんかった。
https://github.com/zabbix/zabbix/blob/66626de6ba09a7bab4ea15a728309e3971676eb3/configure.ac#L987
にあるように、/proc/statがあれば、 そいつを読み込んでパースしてるっぽい。で、man で/proc/statのとこをみると
/proc/statカーネル/システムの統計。 アーキテクチャーによって異なる。 共通エントリーには以下のものが含まれる。
-
- cpu 3357 0 4313 1362393
- 各種状態で消費された時間の合計値。 時間は USER_HZ を単位として計測される (ほとんどのアーキテクチャーでは USER_HZ は 1/100 秒で、 正しい値は sysconf(_SC_CLK_TCK) を使って取得できる)。
-
- user
- (1) ユーザーモードで消費した時間。
- nice
- (2) 低い優先度 (nice) のユーザーモードで消費した時間。
- system
- (3) システムモードで消費した時間。
- idle
- (4) タスク待ち (idle task) で消費した時間。 この値は擬似ファイル /proc/uptime の 2 番目のエントリーの値を USER_HZ 倍した値になるはずである。
- iowait (Linux 2.5.41 以降)
- (5) I/O の完了待ちの時間。
- irq (Linux 2.6.0-test4 以降)
- (6) 割り込みの処理に使った時間。
- softirq (Linux 2.6.0-test4 以降)
- (7) ソフト割り込みの処理に使った時間。
- steal (Linux 2.6.11 以降)
- (8) 盗まれた時間 (stolen time)。仮想化環境での動作時に他のオペレーティングシステムにより消費された時間である。
- guest (Linux 2.6.24 以降)
- (9) Linux カーネルの制御下のゲストオペレーティングシステムの仮想 CPU の 実行に消費された時間。
- guest_nice (Linux 2.6.33 以降)
- (10) nice が適用されたゲスト (Linux カーネルの制御下のゲストオペレーティングシステムの仮想 CPU) の 実行に消費された時間。
-
となる。
sysinfo.hをみると
#define ZBX_CPU_STATE_USER 0 #define ZBX_CPU_STATE_SYSTEM 1 #define ZBX_CPU_STATE_NICE 2 #define ZBX_CPU_STATE_IDLE 3 #define ZBX_CPU_STATE_INTERRUPT 4 #define ZBX_CPU_STATE_IOWAIT 5 #define ZBX_CPU_STATE_SOFTIRQ 6 #define ZBX_CPU_STATE_STEAL 7 #define ZBX_CPU_STATE_GCPU 8 #define ZBX_CPU_STATE_GNICE 9 #define ZBX_CPU_STATE_COUNT 10
zabbix/sysinfo.h at 86e41ec878b740666af51e0c04adb5b1541e3a4e · zabbix/zabbix · GitHub
となっててniceとsystemの順序が/proc/statの順序と違うような...
sscanfしてるあたりでなんかつじつま合わせしてるっぽい...
zabbix/cpustat.c at master · zabbix/zabbix · GitHub
ちなみにSolarisだと
/* CPU instance numbers on Solaris can be non-contiguous, we don't know them yet */
とか書いてあった。最近触ってないなぁ...