uptime 指的是 time since boot (開機多久、開機計時),但指令 uptime 除了顯示開機多久外,還有目前時間、和平均負載等。
在 busybox,目前時間是透過 time() 取得,透過 localtime() 轉成顯示格式。開機多久和平均負載是透過 sysinfo() 取得。sysinfo() 是 Linux 特有的系統呼叫 (大部分使用編號 116),busybox 的 free、ps (ENABLE_FEATURE_PS_TIME 時) 和 init (ENABLE_SWAPONOFF 時) 也有用到。
在 Linux kernel,系統呼叫 sysinfo() 是 sys_sysinfo(),主要工作是由 do_sysinfo() 完成。
開機多久在 Linux kernel 稱為 monotonic clock,意思是這個時間是嚴格線性增加的,也就是說只能隨著時間穩定增加不能調整。實際上開機多久是紀錄開機時 wall clock (變數 xtime) 轉為負值 (變數 wall_to_monotonic),所以 xtime 加上 wall_to_monotonic 就是開機多久。(為什麼不用 jiffies 轉換就好?)
理想上,開機時 wall_to_monotonic 初始化為 xtime 的負值之後就不用再動,但 xtime 除了「隨著時間穩定增加」外,可能會調整而有突然的跳躍。這調整不屬於計時的一部分,需要同時補償調整 wall_to_monotonic,包括 do_settimeofday() 改設時間、second_overflow() 閏秒調整、和 timekeeping_resume() (suspend 期間不算 uptime?)。
系統呼叫 clock_gettime(CLOCK_MONOTONIC) 也可以取得開機多久,包含較精確的 nsec,沒有平均負載部份。/proc/stats 的 btime 是開機時間點,也就是將 wall_to_monotonic 轉回正值。
kernel 應用:ktime_get_ts()、hrtimer_get_softirq_time()、retrigger_next_event() 會使用開機時間。
參考
- busybox、uClibc、和 Linux kernel 的原始碼
- https://stackoverflow.com/questions/3523442/difference-between-clock-realtime-and-clock-monotonic
- https://lirobo.blogspot.com/2014/12/linux-time.html
- 指令 top 或 busybox-top
- jiffies
- sysinfo: how to extract systems' information:/proc/stat、/proc/meminfo
沒有留言:
張貼留言