运维入门的时候,掌握的其中两个命令是top、uptime。
这两个命令在某一个点其实是一样的,就是对于cpu平均负载这个点上。如下图所示
这两个命令得到的load average(平均负载)是一样的。这里一共有三个数值。分别代表了cpu在1分钟、5分钟、15分钟的平均负载。 通过观察这里。我们可以以三个时间段cpu的平均负载情况来判断。服务器的cpu平均负载的趋势。
1、假设服务器是有2个核心的cpu,那么怎么样才算是一个较为合理的平均负载呢。一般来说,我们都是已达到70%的数值来判断是较为合理的,当然了这个数值不是绝对的,在不同的场景可以有不同的判断,但最为粗暴。我们理论上来说,平均负载是2,就是实现cpu核心处理刚刚好,1.4是较为合理的状态。
2、cpu平均负载≠cpu利用率,两者有着很大的区别。其中影响到cpu平均负载的,我能了解到的有正在使用cpu的进程、正在等待cpu的进程、IO进程,这些都会影响到cpu的平均负载,所以不能单纯的就直接判断cpu平均负载等于cpu利用率。
在这里我们使用到2个工具,stress、sysstat
stress是专业的cpu压力测试模拟工具,例如
stress --cpu 1 --timeout 600 # 打满1个cpu,运行600秒
stress -i 1 --timeout 600 $ 模拟IO
watch -d uptime # 查看uptime负载均衡情况,默认2秒刷新一次
mpstat -P ALL 5 # 查看cpu的使用详细情况5次
pidstat -u 5 1 # 查看cpu使用最大的5个进程情况,打印1次
通过各种组合,我们可以发现cpu的平均负载,是一个综合情况来的。可以结合专业的工具进行排查,找到正常的原因。
cpu上下文
cpu里面有两个概念,分别是寄存器和计时器。一个是负责记录cpu切换上下文的记录的。计数器没晓得是干啥的。
cpu切换上下文,说白了就是为了确保任务看起来,并且确保任务的连续性,同时性的。
cpu切换上下文,从位置来分,可以分为用户态和内核态。用户态无法直接访问底层的资源,而内核态可以。举个例子。用户有个命令让cpu去执行。顺序应该是用户指令(用户态)---调用器---cpu记录执行中指令的记录、下一个待执行指令的记录---执行完毕后更新记录---调用器---用户态
从使用方式来说,分为线程上下文切换、进程上下文切换、中断上下文切换
最高优先级是中断(内核态)
较优的是线程(资源共享)
常见的是进程(资源不共享)
但过多的上下文切换,会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降