cpu idle expedition

18
CPU使用率の探検 cota2n

Upload: cota2n

Post on 02-Jul-2015

245 views

Category:

Software


0 download

DESCRIPTION

Kernel/VM探検隊@沖縄 2014/09/21

TRANSCRIPT

Page 1: Cpu idle expedition

CPU使用率の探検🔦cota2n

Page 2: Cpu idle expedition

話すひと:こたに

• 沖縄プログラマ

• 組み込みやりたさにさいきん転職したけど、なぜか.NetとかJSとか書いてる。。

Page 3: Cpu idle expedition

CPUの使用率ってどうやってだしてるのってお話

Page 4: Cpu idle expedition

概要👀• 参考ソース :linux kernel 3.14

• 調べること :vmstat コマンドで表示される、CPUのアイドル時間(id)がどこからひっぱてきてるのか。

Page 5: Cpu idle expedition

• jiffiesとかxtimeとかに詳しい人は見なくてもいいかもしんないです。。

• あんまり心臓が強くないのでマサカリは優しく、致命傷で済むようにお投げ下さい。

Page 6: Cpu idle expedition

vmstat コマンド

• procpsパッケージから提供されるコマンド(コードのバージョンは3.2.8をみました)

Page 7: Cpu idle expedition

main()

new_format()

getstat()

/proc/stat を読み込んで表示してるっぽい。。😔

procps-3.2.8/vmstat.c

Page 8: Cpu idle expedition

/proc/statのなか

• 1 user ユーザーモードで消費した時間。

• 2 nice 低い優先度 (nice) のユーザーモードで消費した時間。

• 3 system システムモードで消費した時間。

• 4 idle タスク待ち (idle task) で消費した時間。Man Page of Proc より

Page 9: Cpu idle expedition

/proc/stat の更新処理をみる👀

Page 10: Cpu idle expedition

stat_open()

show_stat()

get_idle_time()

get_cpu_idle_time_us()からidleを取ってるみたいですね🐦

/fs/proc/stat.c

Page 11: Cpu idle expedition

/kernel/time/tick-sched.c

get_cpu_idle_time_us()

tick_sched構造体のidle_sleeptimeに起動からのidle時間が格納されているぽい。

Page 12: Cpu idle expedition

tick_sched構造体(include/linux/tick.h)

• 各CPUごとに生成されるみたい。

• per_cpuマクロで変数を宣言・参照します。

Page 13: Cpu idle expedition

tick_sched->idle_sleeptime の更新関数

update_ts_time_stats()

• idle_sleeptime = idle_sleeptime + (now - idle_entrytime)

呼び出し元はtick_nohz_stop_idle()

Page 14: Cpu idle expedition

tick_sched->idle_entrytime の更新関数

tick_nohz_start_idle()

Page 15: Cpu idle expedition

tick_nohz_start_idle() tick_nohz_stop_idle()

idle_sleeptime更新

idle_entrytime更新

idle時間(now - idle_entrytime)

update_ts_time_stats()

idle状態

idle時間の算出の流れ

時間→

Page 16: Cpu idle expedition

ktime_get()

• xtime(システム時刻)の現在時刻のktime構造体を返却する。

• ktime_tはlonglongなサイズ

• xtimeはクロックソース(外部のHW機能)を使用する。

• TSCとかHPET

• ちなみにxtimeの更新はクロックリソースの差分で更新される。

Page 17: Cpu idle expedition

まとめ

• CPUアイドル時間はidle_entrytimeからidleを抜けた時刻の差分から計算する。

• xtimeやjiffiesの更新タイミングも近しいみたい

• (/kernel/time/ 以下を読みつくせ)

• 昔(ちょこっと)読んだUNIX v6コードよりは、読みやすい。(ただしドキュメント無しではよくわからない。)

Page 18: Cpu idle expedition

• ちなみに今回の探索方法はひたすらソースコード読むマンでした。。。

• デバッグ探索マンしたいね。