Linux 的系統平均負載可在 uptime、top、cat /proc/loadavg、w(ho) 等看到,有三組數字,分別表示最近 1 分鐘、5 分鐘、和 15 分鐘的平均負載。
平均負載在 Linux kernel 紀錄在 avenrun[],每 5 秒更新一次,公式為
new = old * exp_n + active * (1 - exp_n)
採用定點表示,計算式變成
new = old * EXP_N + active * (FIXED_1 - EXP_N);
if (active >= old)
new += FIXED_1 - 1;
new /= FIXED_1;
小數部份有 11 bits,相乘擴充為 22 bits,所以精確度為 10 bits 整數,加上 11 bits 小數。FIXED_1 為 1.0,是 (1<<11)。EXP_N 在 1 分鐘、5 分鐘、和 15 分鐘分別是
#define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ #define EXP_5 2014 /* 1/exp(5sec/5min) */ #define EXP_15 2037 /* 1/exp(5sec/15min) */
1/exp5/60 * FIXED_1 = 1884
包含 TASK_UNINTERRUPTIBLE?
參考
- Dr. Neil Gunther 的 UNIX Load Average Part 1: How It Works, Part 2: Not Your Average Average
https://hackmd.io/@RinHizakura/S1K4fQtaF