转载:https://blog.csdn.net/ty_hf/article/details/63394960
一. 前言
为了更方便的理解本篇内容含义,所以请最好看看如下繁琐的概念,更容易理解。
没懂这些概念,就算看完你就只能知道,运行下vmstat ,看看linux反馈结果而已,更要知其所以然嘛~
先说说内存的概念。
不是讲cpu吗讲它干嘛?因为这个内存在互相转换的时候是会消耗cpu的。至于为什么要转换?耐心往下看吧。
Linux系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用硬盘空间补充物理内存(很关键,他俩速度不一样有区别呀),将暂时不使用的内存页写到硬盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从硬盘(虚拟内存)中读回内存。这一切对于用户来说是透明的。通常对Linux系统来说,虚拟内存就是swap分区。
好了,下面引出本次的重头戏: vmstat 。
vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU的一个负载情况。
在系统中运行的每个进程都需要使用到物理内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。【这就是上边说的内存转换的过程】
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。
当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。【上边为什么会消耗cpu的原因】
二.效果展示
vmstat 3 5 //每三秒输出一条信息,共输出5条
新手来说,是不是有些蒙,别说联合各项数据分析瓶颈了,先说说各个参数啥意思吧。
或者,换一种看法,下边的注意很重要哦:
三.实际分析
1. r:运行队列的等待进程数
r(run:运行队列正在执行进程数)和 b(block等待CPU资源的进程个数)。当r超过了CPU数目,就会出现CPU瓶颈了。
查看CPU的核的数量:cat /proc/cpuinfo|grep processor|wc -l
在评估cpu的性能优劣时完全照搬网上说的几倍几倍是不准确的,不能只看top里的参数,还得你自己动手看看vmstat显示的run值和blocked值,当出现明 显较多的blocked的时候,就说明cpu产生了瓶颈。而top命令和uptime命令显示的负载均值,只能作为判断系统过去某个时间段的状态的参照, 与cpu的性能关系不大。
当r值超过了CPU个数,就会出现CPU瓶颈,解决办法大体几种:
1. 最简单的就是增加CPU个数和核数
2. 通过调整任务执行时间,如大任务放到系统不繁忙的情况下进行执行,进尔平衡系统任务
3. 调整已有任务的优先级
(tips: vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。
但要注意的是,CPU 满负荷工作并不能说明什么,Linux总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。
唯一能够确定CPU瓶颈的还是r(运行队列)的值。)
2.cpu使用率
如果CPU的id(空闲率)长期低于10%,那么表示CPU的资源已经非常紧张,应该考虑进程优化或添加更多地CPU。
wa(等待IO)表示CPU因等待IO资源而被迫处于空闲状态,这时候的CPU并没有处于运算状态,而是被白白浪费了,所以“等待IO应该越小越好。”
【top命令和uptime命令显示的负载均值,只能作为判断系统过去某个时间段的状态的参照, 与cpu的性能关系不大。】
文章推荐:
2.sar命令
检查CPU性能的第二个工具是sar,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。
下面是sar命令对某个系统的CPU统计输出:
点击(此处)折叠或打开
- [root@webserver ~]# sar -u 3 5
- Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)
- 11:41:24 AM CPU %user %nice %system %iowait %steal %idle
- 11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83
- 11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50
- 11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92
- 11:41:36 AM all 0.29 0.00 0.13 0.00 0.00 99.58
- 11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41
- Average: all 0.34 0.00 0.16 0.05 0.00 99.45
对上面每项的输出解释如下:
%user列显示了用户进程消耗的CPU 时间百分比。
%nice列显示了运行正常进程所消耗的CPU 时间百分比。
%system列显示了系统进程消耗的CPU时间百分比。
%iowait列显示了IO等待所占用的CPU时间百分比
%steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。
%idle列显示了CPU处在空闲状态的时间百分比。
这个输出是对系统整体CPU使用状况的统计,每项的输出都非常直观,并且最后一行Average是个汇总行,是上面统计信息的一个平均值。
需要注意的一点是:第一行的统计信息中包含了sar本身的统计消耗,所以%user列的值会偏高一点,不过,这不会对统计结果产生多大影响。
在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致 了整体CPU使用率不高,而应用缓慢 现象的发生 。
针对这个问题,可以对系统的每个CPU分开查询,统计每个CPU的使用情况:
点击(此处)折叠或打开
- [root@webserver ~]# sar -P 0 3 5
- Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
- 06:29:33 PM CPU %user %nice %system %iowait %steal %idle
- 06:29:36 PM 0 3.00 0.00 0.33 0.00 0.00 96.67
- 06:29:39 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
- 06:29:42 PM 0 0.00 0.00 0.33 0.00 0.00 99.67
- 06:29:45 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
- 06:29:48 PM 0 1.00 0.00 0.33 0.33 0.00 98.34
- Average: 0 1.07 0.00 0.33 0.07 0.00 98.53
这个输出是对系统的第一颗CPU的信息统计,需要注意的是,sar中对CPU的计数是从0开始的,因此,“sar -P 0 3 5”表示对系统的第一颗CPU进行信息统计,“sar -P 4 3 5”则表示对系统的第五颗CPU进行统计。依次类推。可以看出,上面的系统有八颗CPU。
3 iostat命令
iostat指令主要用于统计磁盘IO状态,但是也能查看CPU的使用信息,它的局限性是只能显示系统所有CPU的平均信息,看下面的一个输出:
点击(此处)折叠或打开
- [root@webserver ~]# iostat -c
- Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 2.52 0.00 0.30 0.24 0.00 96.96
在这里,我们使用了“-c”参数,只显示系统CPU的统计信息,输出中每项代表的含义与sar命令的输出项完全相同,不再详述。
1.4 uptime命令
uptime是监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况,输出的信息依次为:系统现在的时间、系统从上次开机到现在运行了多长时间、系统目前有多少登陆用户、系统在一分钟内、五分钟内、十五分钟内的平均负载。看下面的一个输出:
点击(此处)折叠或打开
- [root@webserver ~]# uptime
- 18:52:11 up 27 days, 19:44, 2 users, load average: 0.12, 0.08, 0.08
这里需要注意的是load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。