linux的loadavg计算在低负荷时存在严重系统误差
系统负荷是bbs开发者最关心的问题之一. 我曾经一直为
一个简单的问题困扰. 为什么load在1以后增长比0.1左右
时增长要快得多?
比如bbs在线100人时load可能是15分钟load平均值是0.01,
而在线200人时就达到了0.1, 当然bbs本身有一部分原因.
但经研究发现这里更重要的原因是linux得loadavg算法本身
存在的巨大系统误差.(不考虑它5秒采样引起的随机误差)
linux的loadavg采用定点计算,整数部分10bit(这是前面提
到过的load>1024时溢出的原因), 小数部分11bit. 按理说有
效位数可以达到小数点后第3位.
但实际上, loadavg15在真实load<0.1时已经非常得不准确.
误差来源是定点代替浮点引起的舍入误差. 这个系统误差可
以用解析或数值的的方法计算出来. 也可以用实测的方法得
到.
已经把这个bug提交给了linux kernel dev小组, 不知他们
会不会做改进.
真实平均负荷 loadavg15 给出值的平均 误差
1.00 0.91 9%
0.60 0.55 8%
0.30 0.26 12%
0.20 0.17 17%
0.100 0.071 29%
0.090 0.043 52%
0.080 0.017 78%
0.070 0.0087 87%
0.060 0.0050 92%
真实负荷0.06时, loadavg15给出的值已经比真实值小了10倍,
误差已经大得失去了意义.
loadavg1的情况要好得多:
真实平均负荷 loadavg1 给出值的平均 误差
1.00 0.994 0.6%
0.60 0.597 0.6%
0.30 0.297 1%
0.20 0.197 1%
0.10 0.097 3%
0.05 0.047 6%
--
FROM dsl.nju.edu.cn