前言
2019双11还有不到2个月就要到来了,大家也都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高。因此趁着这个时机正好再好好学习、巩固一下cpu和load的概念,为双11做准备的同时也是增加自己的技能储备。
不过cpu和load这块真的还是很需要积累的,我自己经验尚浅,感觉还是有许多写的不到位与不对的地方,也是希望如果有错误,大家可以帮助指正。
top命令
既然说了cpu和load,那总需要监控吧,没有监控就不知道cpu和load,后面的一切也就无从谈起了。
top命令是最常见的查看cpu和load的命令,拿我自己虚拟机上装的ubuntu系统执行一下top命令(默认3秒刷1次,-d可指定刷新时间):
做了一张表格比较详细地解释了每一部分的含义,其中重要属性做了标红加粗:
内存与SWAP输出格式是一样的,因此放在了一起写。
cpu如何计算
当我们执行top命令的时候,看到里面的值(主要是cpu和load)值是一直在变的,因此有必要简单了解一下Linux系统中cpu的计算方式。
cpu分为系统cpu和进程、线程cpu,系统cpu的统计值位于/proc/stat下(以下的截图未截全):
cpu、cpu0后面的这些数字都和前面的us、sy、ni这些对应,具体哪个对应哪个值不重要,感兴趣的可以网上查一下文档。
进程cpu的统计值位于/proc/{pid}/stat下:
线程cpu的统计值位于/proc/{pid}/task/{threadId}/stat下:
这里面的所有值都是从系统启动时间到当前时间的一个值。因此,对于cpu的计算的做法是,采样两个足够短的时间t1、t2:
将t1的所有cpu使用情况求和,得到s1
将t2的所有cpu使用情况求和,得到s2
s2 - s1得到这个时间间隔内的所有时间totalCpuTime
第一次的空闲idle1 - 第二次的空闲idle2,获取采样时间内的空闲时间
cpu使用率 = 100 * (totalCpuTime - idle) / totalCpuTime
其他时间例如us、sy、ni都是类似的计算方式,总结起来说,cpu这个值反应的是某个采样时间内的cpu使用情况。因此有时候cpu很高,但是打印线程堆栈出来发现高