引言:
应同学的要求,分享些基础的知识。
没有比Linux更基础了,关键问题来了,你真的认真看了和转发了吗?
O(∩_∩)O哈哈~
要实现对Linux的调优,就需要用到一些Linux系统命令和工具来观察与监控系统的性能。下面介绍几个最常用的Linux调优命令和工具。
top命令经常用来监控Linux的系统状态,如CPU、内存的使用情况。下面通过一个运行中的Web服务器的top监控截图,讲述top视图中各种数据的含义,以及视图中各进程(任务)的字段的排序。
top进入视图,如图4.17所示。
图4.17
下面结合该视图讲解各个数据的含义。
在top基本视图中,按键盘数字“1”,即可监控每个逻辑CPU的状态,如图4.18所示。
图4.18
观察图4.18,服务器有16个逻辑CPU,实际上是4个物理CPU。
进程字段排序:在进入top时,各进程默认是按照CPU的占用量来排序的,在【top视图01】中进程ID为14210的Java进程排在第一位(CPU占用100%),进程ID为14183的Java进程排在第二位(CPU占用12%)。
可通过键盘指令来改变排序字段。比如,想监控哪个进程占用MEM最多,方法如下:按“b”键(打开/关闭加亮效果),top视图变化如图4.19所示。
图4.19
我们发现进程ID为10704的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(running)的那个进程,可以通过按“y”键关闭或打开运行态进程的加亮效果。
按“x”键(打开/关闭排序列的加亮效果),top视图变化如图4.20所示。
图4.20
可以看到,top默认的排序列是“%CPU”。通过按“Shift+>”或“Shift+<”组合键可以向右或向左改变排序列。图4.21是按一次“Shift+>”组合键的效果图。
图4.21
视图现在已经按照%MEM来排序了。
按“f”键,top进入另一个视图,在这里可以编辑基本视图中的显示字段,如图4.22所示。
这里列出了所有可在top基本视图中显示的进程字段,有“*”并且标注为大写字母的字段是可显示的,没有“*”并且标注为小写字母的字段是不显示的。如果要在基本视图中显示“CODE”和“DATA”两个字段,可以分别按“r”和“s”键。
图4.22
按回车键返回基本视图,可以看到多了“CODE”和“DATA”两个字段,如图4.23所示。
图4.23
top命令是Linux上进行系统监控的首选命令,但有时却达不到我们的要求,如当前这台服务器,top监控就有很大的局限性。top命令的监控最小单位是进程,所以看不到我们关心的Java线程数和客户连接数,而这两个指标是Java的Web服务非常重要的指标,通常可以用ps和netstat两个命令来补充top命令的不足。
ps -eLf|grep java|wc -l
netstat -n|grep tcp|grep侦听端口|wc -l
上述两个命令可改变grep的参数来达到更细致的监控要求。在Linux系统“一切都是文件”的思想贯彻指导下,所有进程的运行状态都可以用文件来获取。在系统根目录/proc中,每个数字子目录的名字都是运行中的进程的PID,进入任一个进程目录,都可以通过其中的文件或目录来观察进程的各项运行指标,例如,task目录就是用来描述进程中的线程的,因此,也可以通过下面的方法来获取某进程中运行的线程数量(PID指的是进程ID):
ls /proc/PID/task|wc -l
在Linux中还有一个命令pmap,可以用来输出进程内存的状态,也可以用来分析线程堆栈,如下:
pmap PID
2. vmstat命令[2]
vmstat命令用来获取有关进程、虚拟内存、页面交换空间及CPU活动的信息,这些信息反映了系统的负载情况。
在系统中运行的每个进程都需要使用内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存时,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次被调用,并将释放出来的内存提供给有需要的进程使用。
在Linux内存管理中,主要通过“调页(Paging)”和“交换(Swapping)”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面交换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。
当系统内核发现可运行内存减少时,就会通过Page-Out来释放一部分物理内存。尽管Page-Out不经常发生,但是如果Page-Out频繁地发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能就会急剧下降。这时的系统运行已经非常缓慢或进入暂停状态,这种状态也被称作Thrashing(颠簸)。
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
各参数的含义如下。
-a:显示活跃和非活跃内存。
-f:显示从系统启动至今的fork进程数量。
-m:显示/proc/slabinfo。
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,则只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷次。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息。
-S:使用指定单位显示。参数有k、K、m、M,分别代表1000、1024、1 000 000、1 048 576字节(Byte)。默认单位为K(1024Bytes)。
-V:显示vmstat版本信息。
字段含义说明如表4.1所示。
表4.1
类 别 | 项 目 | 含 义 | 说 明 |
---|---|---|---|
Procs(进程) | r | 等待执行的任务数 | 显示了正在执行和等待CPU资源的任务个数。当这个值超过CPU个数时,就会出现CPU瓶颈 |
b | 置于等待队列(等待资源,等待输入/输出)的内核线程数目 | ||
Memory(内存) | swpd | 正在使用的虚拟内存大小,单位为k | |
free | 空闲内存大小 | ||
buff | 已用的buff大小,对块设备的读/写进行缓冲 | ||
cache | 已用的cache大小,文件系统的cache | ||
inact | 非活跃内存大小,即被标明可回收的内存,区别于free和active | 具体含义见概念补充(当使用-a选项时显示) | |
active | 活跃的内存大小 | 具体含义见概念补充(当使用-a选项时显示) | |
pi | 从调页空间调度进的页面 | ||
po | 调出到调页空间的页面 | ||
Swap | si | 每秒从交换区写入内存的大小(单位为kbit/s) | |
so | 每秒从内存写到交换区的大小 | ||
I/O | bi | 每秒读取的块数(读磁盘) | 现在的Linux版本,块的大小为1024Bytes |
bo | 每秒写入的块数(写磁盘) | ||
system | in | 每秒中断数,包括时钟中断 | 这两个值越大,看到的由内核消耗的CPU时间会越多 |
cs | 每秒上下文切换数 | ||
CPU(以百分比表示) | us | 用户进程执行消耗CPU时间(usertime) | us的值比较高时,说明用户进程消耗的CPU时间多。但是如果长期超过50%地使用,那么就应该考虑优化程序算法或其他措施了 |
续表
类 别 | 项 目 | 含 义 | 说 明 |
---|---|---|---|
CPU(以百分比表示) | sy | 系统进程消耗CPU时间(systemtime) | sy的值过高时,说明系统内核消耗的CPU资源多。这个不是良性的表现,我们应该检查原因 |
Id | 空闲时间(包括I/O等待时间) | ||
wa | 等待I/O时间 | wa过高时,说明I/O等待比较严重。这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈 |
CPU瓶颈判断和解决办法。
(1)如果r经常大于4,且id经常小于40,则表示CPU的负荷很严重。
(2)如果pi、po长期不等于0,则表示内存不足。
(3)如果disk经常不等于0,且在b中的队列大于3,则表示I/O性能不佳。
(4)如果在processes中运行的序列(processr)是连续的,且大于在系统中的CPU个数,则表示系统现在运行比较慢,有很多进程正在等待CPU。
(5)如果r的输出数大于系统中可用CPU个数的4倍,则系统面临CPU资源短缺的问题,或者CPU的速率过低,系统中有很多进程正在等待CPU,造成系统中进程运行过慢。
(6)如果空闲时间(cpu id)持续为0,并且系统时间(cpu sy)是用户时间的两倍(cpu us),则系统面临CPU资源短缺的问题。
当发生以上问题时,请先调整应用程序对CPU的占用情况,使应用程序能够更有效地使用CPU,同时可以考虑增加更多的CPU。关于CPU的使用情况,还可以结合mpstat、ps aux、top、prstat -a等相应的命令来综合考虑关于具体CPU的使用情况,以及哪些进程正在大量占用CPU时间。一般情况下,应用程序的问题会比较大,如一些SQL语句不合理等都会造成这种现象。
内存的瓶颈是由 scanrate(sr)来决定的。scanrate是通过每秒的时钟算法来进行页扫描的。如果scanrate(sr)连续大于每秒200页,则表示可能存在内存缺陷。同样,page项中的pi和po两栏表示页面每秒调入的页数和每秒调出的页数,如果该值经常为非零值,则也有可能存在内存瓶颈。当然,如果个别的时候不为0,则属于正常的页面调度。这就是虚拟内存的主要原理。
3. iostat命令[3]
iostat命令可以给我们提供丰富的I/O状态数据。
$iostat –d –k 1 10
参数-d表示设备(磁盘)的使用状态;-k表示某些以Block为单位的列强制使用Kilobytes为单位;1 10表示数据显示每隔1秒刷新一次,共显示10次。示例代码如下:
$iostat -d -k 1 10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 39.29 21.14 1.44 441339807 29990031
sda1 0.00 0.00 0.00 1623 523
sda2 1.32 1.43 4.54 29834273 94827104
sda3 6.30 0.85 24.95 17816289 520725244
sda5 0.85 0.46 3.40 9543503 70970116
sda6 0.00 0.00 0.00 550 236
sda7 0.00 0.00 0.00 406 0
sda8 0.00 0.00 0.00 406 0
sda9 0.00 0.00 0.00 406 0
sda10 60.68 18.35 71.43 383002263 1490928140
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 327.55 5159.18 102.04 5056 100
sda1 0.00 0.00 0.00 0 0
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备读取的数据量;kB_wrtn/s:每秒向设备写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数据量;这些值的单位都为Kilobytes。
在上面的例子中,可以看到磁盘sda及它的各个分区的统计数据,当时统计的磁盘总TPS是39.29,下面是各个分区的TPS(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)。
使用-x参数可以获得更多的统计信息。
iostat -d -x -k 1 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20
rrqm/s:每秒这台设备相关的读取请求有多少被合并了(当系统调用需要读取数据的时候,VFS将请求发送到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,那么FS会将这些请求合并)。
wrqm/s:每秒这台设备相关的写入请求有多少被合并了。
rsec/s:每秒读取的扇区数。
wsec/s:每秒写入的扇区数。
r/s:每秒读请求。
w/s:每秒写请求。
await:每个I/O请求处理的平均时间(单位是微秒或毫秒)。这里可以理解为I/O的响应时间。一般情况下,系统I/O响应时间应该低于5ms。
%util:在统计时间内所有处理I/O时间除以总统计时间。例如,如果统计间隔为1s,该设备有0.8s在处理I/O,而有0.2s在闲置,那么该设备的%util=0.8/1=80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%,则表示设备已经接近满负荷运行了(当然,如果是多磁盘,即使%util为100%,由于磁盘的并发能力,磁盘使用未必达到瓶颈)。
iostat命令还可以用来获取CPU部分状态值,如下:
iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle
1.98 0.00 0.35 11.45 86.22
avg-cpu: %user %nice %sys %iowait %idle
1.62 0.00 0.25 34.46 63.67
$iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 #查看cpu状态
$$iostat -d -k 1 |grep sda10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda10 60.72 18.95 71.53 395637647 1493241908
sda10 299.02 4266.67 129.41 4352 132
sda10 483.84 4589.90 4117.17 4544 4076
sda10 218.00 3360.00 100.00 3360 100
sda10 546.00 8784.00 124.00 8784 124
sda10 827.00 13232.00 136.00 13232 136
可以看到,磁盘每秒传输次数平均约为400;每秒磁盘读取约5MB,写入约1MB。
iostat -d -x -k 1
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24
可以看到,磁盘的平均响应时间小于5ms,磁盘使用率大于80%。这说明磁盘响应正常,但是已经很繁忙了。
4. nmon工具使用[4]
前面介绍的都是零散的命令,nmon是分析AIX和Linux性能的免费工具。它综合收集系统的信息,以图形化的形式展现出来,方便系统管理对性能的分析。
根据CPU的类型选择下载相应的版本 ② 初始化nmon工具。
根据不同的平台,初始化对应平台的nmon工具,然后直接运行nmon即可。
直接运行nmon可以实时监控系统资源的使用情况,执行下面的步骤可以展现一段时间内系统资源消耗的报告。
如图4.24所示是直接执行nmon命令实时监控系统资源消耗情况的截图。可以看到,CPU、内存、磁盘和网络的消耗情况都被很直观地展现出来。
图4.24
a. 采集数据:
#nmon - s10 -c60 –f –m /home/
参数解释:
-s10:每10秒采集一次数据。
-c60:采集60次,即采集10分钟的数据。
-f:生成的数据文件名中包含文件创建的时间。
-m:生成的数据文件的存放目录。
这样就会生成一个nmon文件,每10秒更新一次,直到10分钟后。生成的文件名如<hostname>_ 090824_1306.nmon,其中“hostname”是这台主机的名称。
使用nmon -h命令可以查看更多帮助信息。
b. 生成报表,下载nmon analyser(生成性能报告的免费工具)。
将之前生成的nmon数据文件上传到Windows机器中,用Excel打开分析工具nmonanalyserv 33C.xls。单击Excel文件中的“Analyzenmondata”按钮,选择nmon数据文件,这样就会生成一个分析后的结果文件hostname_090824_1306.nmon.xls,用Excel打开生成的文件就可以看到结果。
如果宏不能运行,则需要执行以下操作:工具→宏→安全性→中,然后打开文件并允许运行宏。
如图4.25所示是在测试环境中生成的nmon报告截图,图中画框区域为不同指标的分析报告。
图4.25
c. 自动按天采集数据。
在crontab中增加一条记录:
0 0 * * * root nmon -s300 -c288 -f -m /home/ > /dev/null 2>&1
300288=86 400(秒),正好是一天的数据。
参考文献