在平时的运维工做中,当一台服务器的性能出现问题时,一般会去看当前的CPU使用状况,尤为是看下CPU的负载状况(load average)。对通常的系统来讲,根据cpu数量去判断。好比有2颗cup的机器。若是平均负载始终在1.2如下,那么基本不会出现cpu不够用的状况。也就是Load平均要小于Cpu的数量。ios
对于cpu负载的理解,首先须要搞清楚下面几个问题: 1)系统load高不必定是性能有问题。 由于Load高也许是由于在进行cpu密集型的计算 2)系统Load高不必定是CPU能力问题或数量不够。 由于Load高只是表明须要运行的队列累计过多了。但队列中的任务实际多是耗Cpu的,也多是耗i/0或者其余因素的。 3)系统长期Load高,解决办法不是一味地首先增长CPU 由于Load只是表象,不是实质。增长CPU个别状况下会临时看到Load降低,但治标不治本。 4)在Load average 高的状况下须要鉴别系统瓶颈究竟是CPU不足,仍是io不够快形成或是内存不足形成的。 =============================================================================================================== 要想得到服务器的CPU负载状况,有下面几种命令: 1)w命令 [root@localhost ~]# w 12:12:41 up 167 days, 20:46, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.5 10:01 1.00s 0.11s 0.00s w root pts/2 192.168.1.5 10:19 1:47m 0.04s 0.04s -bash 2)uptime命令(通常首先会根据最后那个15分钟的load负载为准) [root@localhost ~]# uptime 12:12:55 up 167 days, 20:46, 2 users, load average: 0.00, 0.01, 0.05 3)top命令 [root@localhost ~]# top top - 12:13:22 up 167 days, 20:47, 2 users, load average: 0.00, 0.01, 0.05 Tasks: 272 total, 1 running, 271 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 65759080 total, 58842616 free, 547908 used, 6368556 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 64264884 avail Mem ................ 对上面第三行的解释: us(user cpu time):用户态使用的cpu时间比。该值较高时,说明用户进程消耗的 CPU 时间比较多,好比,若是该值长期超过 50%,则须要对程序算法或代码等进行优化。 sy(system cpu time):系统态使用的cpu时间比。 ni(user nice cpu time):用作nice加权的进程分配的用户态cpu时间比 id(idle cpu time):空闲的cpu时间比。若是该值持续为0,同时sy是us的两倍,则一般说明系统则面临着 CPU 资源的短缺。 wa(io wait cpu time):cpu等待磁盘写入完成时间。该值较高时,说明IO等待比较严重,这可能磁盘大量做随机访问形成的,也多是磁盘性能出现了瓶颈。 hi(hardware irq):硬中断消耗时间 si(software irq):软中断消耗时间 st(steal time):虚拟机偷取时间 以上解释的这些参数的值加起来是100%。 4)vmstat [root@localhost ~]# vmstat procs -----------memory---------------------swap-------io---------system--------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 1639792 724280 4854236 0 0 4 34 4 0 19 45 35 0 0 解释说明: ----------------------------- procs部分的解释 r 列表示运行和等待cpu时间片的进程数,若是长期大于1,说明cpu不足,须要增长cpu。 b 列表示在等待资源的进程数,好比正在等待I/O、或者内存交换等。 ----------------------------- cpu部分的解释 us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,可是若是长期大于50%,须要考虑优化用户的程序。 sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,若是us+sy 大于 80%说明可能存在CPU不足。 wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,若是wa超过30%,说明IO等待严重,这多是磁盘大量随机访问形成的,也可能磁盘或者 磁盘访问控制器的带宽瓶颈形成的(主要是块操做)。 id 列显示了cpu处在空闲状态的时间百分比 ----------------------------- system部分的解释 in 列表示在某一时间间隔中观测到的每秒设备中断数。 cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。 ----------------------------- memory部分的解释 swpd 切换到内存交换区的内存数量(k表示)。若是swpd的值不为0,或者比较大,好比超过了100m,只要si、so的值长期为0,系统性能仍是正常 free 当前的空闲页面列表中内存数量(k表示) buff 做为buffer cache的内存数量,通常对块设备的读写才须要缓冲。 cache: 做为page cache的内存数量,通常做为文件系统的cache,若是cache较大,说明用到cache的文件较多,若是此时IO中bi比较小,说明文件系统效率比较好。 ----------------------------- swap部分的解释 si 由内存进入内存交换区数量。 so由内存交换区进入内存数量。 ----------------------------- IO部分的解释 bi 从块设备读入数据的总量(读磁盘)(每秒kb)。 bo 块设备写入数据的总量(写磁盘)(每秒kb) 5)也可使用dstat命令查看cpu信息 [root@localhost ~]# dstat ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 19 45 35 0 0 0| 30k 265k| 0 0 | 0 0 |9025 12k 9 18 73 0 0 0| 0 144k|2578k 65k| 0 0 |3956 4343 6)可使用iostat查看IO负载 [root@localhost ~]# iostat 1 1 Linux 2.6.32-696.16.1.el6.x86_64 (nc-ftp01.kevin.cn) 2017年12月29日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 19.32 0.00 45.44 0.06 0.26 34.93 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn xvda 14.17 29.94 265.17 63120486 558975100 解释说明: avg-cpu: 整体cpu使用状况统计信息,对于多核cpu,这里为全部cpu的平均值 %user: 在用户级别运行所使用的CPU的百分比. %nice: nice操做所使用的CPU的百分比. %sys: 在系统级别(kernel)运行所使用CPU的百分比. %iowait: CPU等待硬件I/O时,所占用CPU百分比. %idle: CPU空闲时间的百分比. Device段:各磁盘设备的IO统计信息 tps: 每秒钟发送到的I/O请求数. Blk_read /s: 每秒读取的block数. Blk_wrtn/s: 每秒写入的block数. Blk_read: 读入的block总数. Blk_wrtn: 写入的block总数. [root@localhost ~]# iostat -x -k -d 1 Linux 2.6.32-696.el6.x86_64 (centos6-vm02) 01/04/2018 _x86_64_ (4 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.36 0.36 0.00 0.36 0.00 vda 0.01 0.13 0.04 0.13 0.60 0.89 18.12 0.00 2.78 0.19 3.53 2.55 0.04 dm-0 0.00 0.00 0.04 0.22 0.58 0.88 11.25 0.00 3.27 0.25 3.82 1.61 0.04 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.13 0.13 0.00 0.04 0.00 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 7.91 0.00 0.19 0.10 5.00 0.16 0.00 解释说明: rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并 wrqm/s: 每秒对该设备的写请求被合并次数 r/s: 每秒完成的读次数 w/s: 每秒完成的写次数 rkB/s: 每秒读数据量(kB为单位) wkB/s: 每秒写数据量(kB为单位) avgrq-sz:平均每次IO操做的数据量(扇区数为单位) avgqu-sz: 平均等待处理的IO请求队列长度 await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位) svctm: 平均每次IO请求的处理时间(毫秒为单位) %util: 采用周期内用于IO操做的时间比率,即IO队列非空的时间比率 若是 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 idle小于70% IO压力就较大了,通常读取速度有较多的wait。 同时能够结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
简单说下CPU负载和CPU利用率的区别算法
0)load average:系统平均负载是CPU的Load,它所包含的信息不是CPU的使用率情况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息, 也就是CPU使用队列的长度的统计信息,这个数字越小越好。 1)CPU使用率:显示的是程序在运行期间实时占用的CPU百分比。 2)CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。CPU使用率高,并不意味着负载就必定大。 举例来讲:若是我有一个程序它须要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,可是CPU的工做负载则是趋近于"1",由于CPU仅负责一个工做啊。 若是同时执行这样的程序两个呢?CPU的使用率仍是100%,可是工做负载则变成2了。因此也就是说,当CPU的工做负载越大,表明CPU必需要在不一样的工做之间进行频繁 的工做切换。 3)CPU利用率高,并不意味着负载就必定大。 举例来讲: 若是有一个程序它须要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,可是CPU的工做负载则是趋近于"1",由于CPU仅负责一个工做! 若是同时执行这样的程序两个呢?CPU的使用率仍是100%,可是工做负载则变成2了。因此也就是说,当CPU的工做负载越大,表明CPU必需要在不一样的工做之间 进行频繁的工做切换。 ------------------------下面经过一个电话亭打电话的比喻来讲明这二者之间的区别------------------------ 某公用电话亭,有一我的在打电话,四我的在等待,每人限定使用电话一分钟,如有人一分钟以内没有打完电话,只能挂掉电话去排队,等待下一轮。 电话在这里就至关于CPU,而正在或等待打电话的人就至关于任务数。 在电话亭使用过程当中,确定会有人打完电话走掉,有人没有打完电话而选择从新排队,更会有新增的人在这儿排队,这我的数的变化就至关于任务数的增减。 为了统计平均负载状况,咱们5分钟统计一次人数,并在第一、五、15分钟的时候对统计状况取平均值,从而造成第一、五、15分钟的平均负载。 有的人拿起电话就打,一直打完1分钟,而有的人可能前三十秒在找电话号码,或者在犹豫要不要打,后三十秒才真正在打电话。若是把电话看做CPU,人数看 做任务,咱们就说前一我的(任务)的CPU利用率高,后一我的(任务)的CPU利用率低。固然, CPU并不会在前三十秒工做,后三十秒歇着,只是说,有的程 序涉及到大量的计算,因此CPU利用率就高,而有的程序牵涉到计算的部分不多,CPU利用率天然就低。但不管CPU的利用率是高是低,跟后面有多少任务在排队 没有必然关系。
=========正确理解%iowait和CPU使用率=========centos
1)%steal 通常是在虚拟机中才能看到数值,好比CPU overcommitment很严重的VPS,而%guest和%nice通常都很低,因此也能够 根据/proc/stat或者top可得,user + nice + system + idle + iowait + irq + softirq + steal = 100 2)Linux进程状态 运行状态(TASK_RUNNING): 是运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示此状态 可中断睡眠状态(浅度睡眠)(TASK_INTERRUPTIBLE): 进程正在睡眠(被阻塞),等待资源到来是唤醒,也能够经过其余进程信号或时钟中断唤醒,进入运行队列。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。 不可中断睡眠状态(深度睡眠状态)(TASK_UNINTERRUPTIBLE): 其和浅度睡眠基本相似,但有一点就是不可被其余进程信号或时钟中断唤醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此状态。 暂停状态(TASK_STOPPED): 进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。 僵死状态(TASK_ZOMBIE): 进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE 宏表示此状态。 3)%iowait 的正确认知 %iowait 表示在一个采样周期内有百分之几的时间属于如下状况:CPU空闲、而且有仍未完成的I/O请求。 对 %iowait 常见的误解有两个: 一是误觉得 %iowait 表示CPU不能工做的时间, 二是误觉得 %iowait 表示I/O有瓶颈。 首先 %iowait 升高并不能证实等待I/O的进程数量增多了,也不能证实等待I/O的总时间增长了。 例如: 在CPU繁忙期间发生的I/O,不管IO是多仍是少,%iowait都不会变; 当CPU繁忙程度降低时,有一部分IO落入CPU空闲时间段内,致使%iowait升高。 再好比:IO的并发度低,%iowait就高;IO的并发度高,%iowait可能就比较低。 可见%iowait是一个很是模糊的指标,若是看到 %iowait 升高,还需检查I/O量有没有明显增长, avserv/avwait/avque等指标有没有明显增大,应用有没有感受变慢,若是都没有,就没什么好担忧的。 4)查看CPU使用率,推荐以下Linux命令: # top # sar -u 1 5 # vmstat -n 1 5 # mpstat -P ALL 1 5 查看Load的值,推荐以下Linux命令: # top # uptime # sar -q 1 5
load average相关梳理(一分钟,五分钟,十五分钟的平均CPU负载,最重要的指标是最后一个数字,即前15分钟的平均CPU负载,这个数字越小越好。所谓CPU负载指的是一段时间内任务队列的长度,通俗的讲,就是一段时间内一共有多少任务在使用或等待使用CPU。(当前的"负载值除以cpu核数"就是cpu的利用率))bash
load average表示的是系统的平均负荷,即CPU的Load。 它所包含的信息不是CPU的使用率情况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。 它包括3个数字,分别表示系统在一、五、15分钟内进程队列中的平均进程数量(即处理的进程状况), 原则上来讲这3个数字越小越好,数字越小表示服务器的工做量越小,系统负荷比较轻 当CPU彻底空闲的时候,平均负荷为0(即load average的值为0);当CPU工做量饱和的时候,平均负荷为1。 这里须要注意的是: load average这个输出值,这三个值的大小通常不能大于系统逻辑CPU的个数 好比一台服务器有4个逻辑CPU,若是load average的三个值长期大于4时,说明CPU很繁忙,负载很高,可能会影响系统性能; 可是偶尔大于4时,倒不用担忧,通常不会影响系统性能。 相反,若是load average的输出值小于CPU的个数,则表示CPU还有空闲,好比本例中的输出,CPU是比较空闲的。 -------------load average举例理解--------------- 判断系统负荷是否太重,必须理解load average的真正含义。假设当前个人一台服务器只有一个CPU,全部的运算都必须由这个CPU来完成。 不妨把这个CPU想象成一座大桥,桥上只有一根车道,全部车辆都必须从这根车道上经过(很显然,这座桥只能单向通行)。 1)系统负荷为0,意味着大桥上一辆车也没有。 2)系统负荷为0.5,意味着大桥一半的路段有车。 3)系统负荷为1.0,意味着大桥的全部路段都有车,也就是说大桥已经"满"了。可是必须注意的是,直到此时大桥仍是能顺畅通行的。 4)系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。 以此类推,系统负荷2.0,意味着等待上桥的车辆与桥面的车辆同样多; 系统负荷3.0,意味着等待上桥的车辆是桥面车辆的2倍。 总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。 CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工做量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。 若是CPU每分钟最多处理100个进程,那么: 系统负荷0.2,意味着CPU在这1分钟里只处理20个进程; 系统负荷1.0,意味着CPU在这1分钟 里正好处理100个进程; 系统负荷1.7,意味着除了CPU正在处理的100个进程之外,还有70个进程正排队等着CPU处理。 为了服务器顺畅运行,系统负荷最好不要超过1.0,这样就没有进程须要等待了,全部进程都能第一时间获得处理。 很显然,1.0是一个关键值,超过这个值,系统就不在最佳状态了,就须要动手干预了。 --------1.0是系统负荷的理想值吗?----------- 不必定,系统管理员每每会留一点余地,当这个值达到0.7,就应当引发注意了。 以往经验是这样的: 当系统负荷持续大于0.7,必须开始调查了,问题出在哪里,防止状况恶化。 当系统负荷持续大于1.0,必须动手寻找解决办法,把这个值降下来。 当系统负荷达到5.0,就代表系统有很严重的问题,长时间没有响应,或者接近死机了。觉不能让系统达到这个值。 上面,假设个人这台服务器只有1个CPU。若是它装了2个CPU,就意味着服务器的处理能力翻了一倍,可以同时处理的进程数量也翻了一倍。 仍是用大桥来类比,两个CPU就意味着大桥有两根车道了,通车能力翻倍了。 因此,2个CPU代表系统负荷能够达到2.0,此时每一个CPU都达到100%的工做量。推广开来,n个CPU的服务器,可接受的系统负荷最大为n.0。 ---------至于load average是多少才算理想,这个有争议,各有各的说法--------- 我的比较赞同CPU负载小于等于"内核数乘以0.5-0.7"算是一种理想状态。 好比4核CPU的服务器,理想负载是小于等于2,最好不要超过2.8,不然性能多少会受影响。 无论某个CPU的性能有多好,1秒钟能处理多少任务,能够认为它可有可无,虽然事实并不是如此。 在评估CPU负载时,只以5分钟为单位作统计任务队列长度。若是每隔5分钟统计的时候,发现任务队列长度都是1,那么CPU负载就为1。 假如如今某台服务器只有一个单核的CPU,负载一直为1,意味着没有任务在排队,还不错。 可是这台服务器是双核CPU,等因而有4个内核,每一个内核的负载为1的话,总负载为4。这就是说,若是这台服务器的CPU负载长期保持在4左右,还能够接受。 可是每一个内核的负载为1,并不能算是一种理想状态!这意味着服务器的CPU一直很忙,不得悠闲。 -----------load average返回三个平均值应该参考哪一个值?------------ 若是只有1分钟的系统负荷大于1.0,其余两个时间段都小于1.0,这代表只是暂时现象,问题不大。 若是15分钟内,平均系统负荷大于1.0(调整CPU核心数以后),代表问题持续存在,不是暂时现象。 因此应该主要观察"15分钟系统负荷",将它做为服务器正常运行的指标。 ----------如何来下降服务器的CPU负载?-------------- 最简单办法的是更换性能更好的服务器,不要想着仅仅提升CPU的性能,那没有用,CPU要发挥出它最好的性能还须要其它软硬件的配合。 在服务器其它方面配置合理的状况下,CPU数量和CPU核心数(即内核数)都会影响到CPU负载,由于任务最终是要分配到CPU核心去处理的。两块CPU要比一块 CPU好,双核要比单核好。所以,须要记住的是:除去CPU性能上的差别,CPU负载是基于内核数来计算的。有一个说法是"有多少内核,即有多少负载"。