2022年3月19日 星期六

Linux uptime

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() 會使用開機時間。

參考

  1. busybox、uClibc、和 Linux kernel 的原始碼
  2. https://stackoverflow.com/questions/3523442/difference-between-clock-realtime-and-clock-monotonic

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...