VPS上的cpu load average

本文原创,转载请注明来源:http://www.1or9.com/post/227.html

我经常为这个问题困惑,所以研究了一段时间。

首先:cpu load average 不是cpu负载。那个数字表示的意思是:cpu任务队列的长度。以下讨论基于1个核,如果是N核,情况完全一样。只是放大N倍。

如果cpu load average 比1小,则说明:CPU队列里面没有任务排队,也就是CPU非常闲。问题是如果这个数字比1大,就说明负责太高,CPU承受不了吗?不是的!如果这个数字稳定在一个数值不持续变大,恰恰说明CPU可以承受这个负载。就像超市排队check out,如果顾客的队伍一直保持在5个人或者10个人而不持续增长,说明这个柜台的营业员还是能够来得及处理的。唯一的问题就是每个用户可能要花一点时间排队。那到底要排队多少时间呢?如果CPU平均处理一个任务的时间是1毫秒,如果队列是10,也就是说每个任务的处理时间从1毫秒变成11毫秒(10毫秒的等待时间+1毫秒的真正处理时间)。从用户角度来说,1毫秒和11毫秒是区别不出来的。但是如果我们假设CPU平均处理一个任务的时间是1秒,如果队列是10,也就是说每个任务的处理时间从1秒变成11秒(10秒的等待时间+1秒的真正处理时间)。从用户角度来说,1秒和11秒的区别是非常大的。

结论就是:有的机器cpu load average是几十,但是一点慢的感觉都没有。但是有的机器cpu load average 才5就感觉非常慢。

回到VPS的情况,一个机器上有多个虚拟系统(VPS),各自有自己的任务队列,但是公用CPU资源。这里只讨论CPU资源是Equal Share的那种,有的VPS的CPU是按照用户来分频率或者CPU Core的不在讨论范围内。

假设一共只有2个VPS,每个VPS里面的任务平均处理时间是1毫秒,任务产生的速度都是10毫秒1个。也就是1秒钟共有200个任务产生,处理这些任务只需要200毫秒的时间。套用非常流行的一句话,这个机器的CPU闲的蛋疼(80%的时间是没事干)。

现在一个VSP保持不变,另外一个VPS变成1秒产生一个任务,并且他任务变的复杂了,所以平均处理时间要0.5秒。结果会如何??首先对这个机器而言仍然很闲,1秒钟共有101个任务(100+1),处理这些任务需要600毫秒(0.5秒+100毫秒),所以40%的时间是空的。

看看cpu load average吧。。在某个特定的时刻,CPU正在处理第2个VPS的0.5秒的那个任务,而第1个VPS还在以10毫秒每个的速度产生任务。极端情况,你可以在第一vps上看到cpu load average是50。而第二个vps的cpu load average基本不会高于2(整整2秒CPU时间都给第1个VPS占着,可能吗)。从用户角度说,第一个vps的用户觉得速度变慢了,第二个vps的用户基本感觉不到。从主机提供商的角度,觉得问题一定出在第一vps那里,他会把第一vps重启甚至停掉。

真正的VPS情况,要复杂的多,首先不是单核,而且不是2个VPS,一般都是几十个。并且那种突发性的耗CPU的任务是随机的。象上面的例子,可能某1分钟,第2个VPS变成1秒产生一个任务,平均处理时间要0.5秒,而下1分钟又变回原来的了。这就使得第一个VPS突然出现一个很高的cpu load average,然后慢慢小下去。这样的现象我是经常看到的。其实压根和这个vps一点关系都没有。完全是由于别的vps引起的。

结论:有钱还是用独立服务器吧。

One Reply to “VPS上的cpu load average”

  1. 那四核CPU 底下的值正常嘛 搜索了半天没发现有人对这个进行解释
    load average: 6.22, 4.67, 2.22

Leave a Reply

Your email address will not be published.