最近对我的本本(4核8线程)用top命令看系统状况出现了CPU利用率超过200%的情况,非常诧异,查了下相关资料,把这个问题弄清楚了。
首先来分析下CPU Loadload average: 0.09, 0.05, 0.01
分别是1分钟、5分钟、15分钟的平均Load。
Load这个东西怎么理解呢,就像一条马路,有N个车道,如果N个进程进入车道,那么正好一人一个,再多一辆车就占不到车道,要等有一个车空出车道。在CPU中可以理解为CPU可以并行处理的任务数,那么就是“CPU个数 * 核数”,如果CPU Load = CPU个数 * 核数 那么就是说CPU正好满负载,再多一点,可能就要出问题了,有任务不能被及时分配处理器,那么保证性能的话,最好是小于CPU个数 * 核数 *0.7。查看CPU核数可以通过:grep ‘model name’ /proc/cpuinfo
那么以哪个平均值为准呢?如果1分钟平均出现大于CPU个数 * 核数的情况,还不用担心,如果5分钟平均也是,那就要警惕了,15分钟平均也是这样,就要分析哪里出问题了,防范于未然
CPU利用率超过100%的问题,也是差不多,top命令应该是把每个核的CPU占用率加起来,算一个和,于是多核情况下会出现超过100%。另外Context Switch Rate也是个非常值得注意的值,因为线程间切换的代价也是非常高的。
引用一个公式:Context Switch Rate = Interrupt Rate + TPS* N
对于一个多线程的程序,我觉得准备一个控制线程来调度任务是非常必要的,免得线程过于高并发,导致资源的争用和线程切换带来性能问题,最好控制并发的线程数基本等于CPU的总核数,减少这个N,获得更好的处理器性能。
参考了如下几篇文章:
# 总核数 = 物理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
查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
查看内 存信息
# cat /proc/meminfo