contributed by < HeatCrab
>
在作業三的 Load Average 說明中提到 Linux 核心計算 load average 的公式是使用指數平滑運算(Exponential smoothing)推導而成的。指數平滑運算公式的公式定義如下:
但是在作業說明中使用的是:
可以發現兩者在定義實際值 的時間點不同,兩個都可以使用,但若是要推導到 Linux 核心使用的公式的話,應該要使用 而非 。原因如下:
Linux 核心在 include/linux/sched/loadavg.h
中使用的公式:
active
這個變數根據定義是 'RUNNABLE + TASK_UNINTERRUPTIBLE' Process 總數,也就是 calc_load_tasks
這個全域變數。所以 active
是 newload
當下時間點的實際值,應該要是 而非 ?
此外,從原本的指數平滑公式推導至 Linux 核心使用的 load averge 公式,我有些疑惑。原本的 在指數平滑公式代表的是平滑因子,依據泰勒展開後得到近似值是: 可是 Linux 核心使用的 exp
變數是 ,又因為他是定點數,也可以說 。
那問題就來了,原本的指數平滑公式, 是直接乘上 ,而 則是乘上 ,我的理解是 在此處是代表一個權重,如果 的值越靠近 ,則 受到 值的影響越大,反之, 越靠近 則 的影響較大。相較於原本的指數平滑公式,Linux 核心使用的公式不是直觀的直接使用原本的指數平滑公式而來的,而是調整了一下 load
與 active
的乘數對像。但是同理來說,如果 exp
的值越靠近 ,則 load
對於 newload
的影響就越大,反之 active
對於 newload
的影響就越大?是這樣子想的嗎?
如果真是這樣,那我會覺得說為什麼要畫蛇添足改變原本的指數平滑公式中定義的乘數對象?
是因為 load
才是 newload
變數影響的主因,所以讓他直接乘上 exp
,而不是如同原本的指數平滑公式一樣直接讓 active
乘上 exp
呢?或是有其他的原因嗎?
後續探討呢?