Cpu idle expedition
Post on 02-Jul-2015
228 Views
Preview:
DESCRIPTION
Transcript
CPU使用率の探検🔦cota2n
話すひと:こたに
• 沖縄プログラマ
• 組み込みやりたさにさいきん転職したけど、なぜか.NetとかJSとか書いてる。。
CPUの使用率ってどうやってだしてるのってお話
概要👀• 参考ソース :linux kernel 3.14
• 調べること :vmstat コマンドで表示される、CPUのアイドル時間(id)がどこからひっぱてきてるのか。
• jiffiesとかxtimeとかに詳しい人は見なくてもいいかもしんないです。。
• あんまり心臓が強くないのでマサカリは優しく、致命傷で済むようにお投げ下さい。
vmstat コマンド
• procpsパッケージから提供されるコマンド(コードのバージョンは3.2.8をみました)
main()
new_format()
getstat()
/proc/stat を読み込んで表示してるっぽい。。😔
procps-3.2.8/vmstat.c
/proc/statのなか
• 1 user ユーザーモードで消費した時間。
• 2 nice 低い優先度 (nice) のユーザーモードで消費した時間。
• 3 system システムモードで消費した時間。
• 4 idle タスク待ち (idle task) で消費した時間。Man Page of Proc より
/proc/stat の更新処理をみる👀
stat_open()
show_stat()
get_idle_time()
get_cpu_idle_time_us()からidleを取ってるみたいですね🐦
/fs/proc/stat.c
/kernel/time/tick-sched.c
get_cpu_idle_time_us()
tick_sched構造体のidle_sleeptimeに起動からのidle時間が格納されているぽい。
tick_sched構造体(include/linux/tick.h)
• 各CPUごとに生成されるみたい。
• per_cpuマクロで変数を宣言・参照します。
tick_sched->idle_sleeptime の更新関数
update_ts_time_stats()
• idle_sleeptime = idle_sleeptime + (now - idle_entrytime)
呼び出し元はtick_nohz_stop_idle()
tick_sched->idle_entrytime の更新関数
tick_nohz_start_idle()
tick_nohz_start_idle() tick_nohz_stop_idle()
idle_sleeptime更新
idle_entrytime更新
idle時間(now - idle_entrytime)
update_ts_time_stats()
idle状態
idle時間の算出の流れ
時間→
ktime_get()
• xtime(システム時刻)の現在時刻のktime構造体を返却する。
• ktime_tはlonglongなサイズ
• xtimeはクロックソース(外部のHW機能)を使用する。
• TSCとかHPET
• ちなみにxtimeの更新はクロックリソースの差分で更新される。
まとめ
• CPUアイドル時間はidle_entrytimeからidleを抜けた時刻の差分から計算する。
• xtimeやjiffiesの更新タイミングも近しいみたい
• (/kernel/time/ 以下を読みつくせ)
• 昔(ちょこっと)読んだUNIX v6コードよりは、読みやすい。(ただしドキュメント無しではよくわからない。)
• ちなみに今回の探索方法はひたすらソースコード読むマンでした。。。
• デバッグ探索マンしたいね。
top related