每天线上服务检查一下,发现有一个接口的速度变得很慢,从以前的2秒左右,最长变成了十几秒,影响体验。查看机器负载,发现负载确实高了 load average
高的时候到了8以上,上面部署了好几个业务的服务,查看了一下发现是其他人用的hive服务占据了很多资源,这里查找资料记录一下理解的Linux服务器的负载。
在Linux中,可以使用uptime
或者top
显示Linux的平均负载,其中uptime
只显示负载,而top
显示的内容会更加丰富一些。
uptime
top
平均负载:1.08、2.01、1.85
上述三个数字代表逐渐长时间内的平均值(1分钟、5分钟和15分钟的平均值),数字越低越好。数字越高代表问题或机器过载。 平时也应该重点关注5或15分钟的平均值。一般来说,如果服务器在一分钟的平均值上超过1.0,此时仍然是很好。
那么,什么时候是过载呢,这肯定是跟一个最大的合理值进行比较,当出现高的负载的时候应该尽快修复,避免对服务性能的影响。
下面介绍一些背景知识,从最简单的情况开始:一台具有单核处理器的机器。
单核中央处理器就像一条单行道。假设你是一名饭店打饭工作人员,每天到了饭点的时候,排队买饭的人会非常多,这个时候你会非常繁忙,速度慢一点的话窗口就会排起长队。如何表示此时的繁忙时刻呢,一个合适的指标是在特定时间有多少人在等着
。如果窗口没有人在等着,买饭的人知道可以立马买到饭菜并开始吃饭。如果窗口排起长队,则表明需要等一会才能吃上饭菜。
0.00意味着此时窗口根本没有人来 。事实上,在0.00到1.00之间意味着没有更多的顾客,此时到来的顾客就能直接安排好。
1.00意味着这座窗口完全满负荷 。此时是能够刚刚好满足要求,但如果来的人变得更多了,窗口就会变得有点拥挤,事情就会变慢。
超过1.00意味着有排起了长队。 多少钱?2.00意味着总共有双倍的人等着安排,3.00意味着有三倍的人在等着安排。
上述过程基本上就是中央处理器的负载。使用一段中央处理器时间(“打饭”)或排队使用中央处理器的进程。Unix将此称为运行-队列长度
:当前正在运行的进程数量加上等待(排队)运行的进程数量的总和。
所以,理想情况下,CPU负载应该保持在1.00以下。此外,像打饭人员一样,如果在1.00以上有一些临时峰值,仍然是可以完成的,但是当你一直在1.00以上时,就需要担心是否忙的过来了。
不完全是。负载为1.00的问题是此时没有余量。在实践中,许多系统管理员会限制在0.70:
“需要调查一下”:0.70 。 如果平均负载保持在0.70以上,是时候在事情变得更糟之前进行调查。
“立即修复”:1.00 。 如果平均负载保持在1.00以上,现在就找到问题并修复它。
经验法则:5.0 。如果平均负载高于5.00,可能会遇到严重的麻烦,服务要么挂掉,要么变慢,需要尽快解决。
如果是四个处理器系统,负载为3.00仍然是很健康的。在多处理器系统上,负载是相对于可用的处理器内核数量而言的,“100%利用率”标记为单核系统为1.00,双核为2.00,四核为4.00等。
继续用类比的方式,“1.00”实际上意味着只有一个打饭人员。如果是单个排队的人来看,这意味着工作人员停不下来。但是如果安排了两个人打饭,负载为1.00意味着达到了极限的50%——只有一个工作人员是需要干活的,所以还有另外一个工作人员等着顾客。
与CPU相同:在单核盒子上,负载为1.00是100%的CPU利用率。在双核盒子上,负载为2.00是100%的CPU利用率。
出于性能目的,一台拥有单个双核处理器的机器基本上等同于一台拥有两个处理器的机器, 为了评估CPU负载值,内核的总数
才是最重要的,不管这些内核分布在多少物理处理器上**。
这就引出了两个新的规则:
内核数量=最大负载
:在多核系统上,负载不应超过可用的内核数量。
内核就是内核
:内核如何分布在CPU上并不重要。两个四核四个双核八个单核,都是八个内核。
如何查看自己系统有多少个内核,可以运行下面的命令:
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
如果发现电脑负载在5-15分钟内高于所能提供的太多,则需要尽快修复,避免引起线上事故。