版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明。
原文名称:《Linux Performance and Tuning Guidelines》
原文地址:http://www.redbooks.ibm.com/abstracts/redp4285.html
-------------------------------------------------------------------------------------------
本章我们将讨论监控工具,这些工具大部分都来源于Linux企业版。你应该熟练掌握这些工具。
top命令显示实际进程的运行情况。在默认情况下,它显示服务器上占用CPU最多的任务并每5秒刷新列表一次。
你也可以按PID(数值)、age(最新的排第一)、time(累计的时间)、常驻内存或时间(自启动开始进程所占用的CPU时间)排序。
你可以使用renice命令来修改进程的优先级。如果进程挂起或占据过多的CPU,你可以使用kill命令杀死此进程。
输出的栏位有:
PID: 进程ID
USER: 进程所有者的用户名
PRI: 进程优先级(参见1.1.4“进程优先级和Nice值”)
NI: Nice值(Whether the process tries to be nice by adjusting the priority by the number given. See below for details.)
SIZE: 进程使用的内存大小(code+data+stack),单位为KB
RSS: 所使用的物理内存大小,单位为KB
SHARE: 与其它进程共享的内存大小,单位为KB
STAT: 进程状态:S=sleeping, R=running, T=stopped or traced,D=interruptible sleep, Z=zombie。在1.1.7“进程状态”讨论关于进程的状态
%CPU: 使用的CPU百分比
%MEM: 物理内存百分比
TIME: 进程使用的CPU时间(自从此启动)
COMMAND:启动任务所使用的命令(包括参数)
top支持多个有用的热键,如下:
t: 隐藏或显示摘要信息
m:隐藏或显示内存信息
A:分类显示各种系统资源,可用于快速找出系统中影响性能的任务。
o:在交互模式下选择排序的栏位
r: renice命令
k: kill命令
注意:在取样模式中需要考虑实际数据搜集中存在误差的可能,设定较低的取样频率能减少这样的可能。
实例2-2 vmstat输出示例
注释:vmstat输出结果中第一行展示的是自最后一次启动以来的平均值,所以此行可以忽略。
输出栏位如下:
Process(procs) 平均负载的最佳值是1,这意味着每个进程都可以立即执行不会错过CPU周期。
负载的正常值在不同的系统中有着很大的差别。在单处理器的工作站中,1或2都是可以接受的。然而在多处理器的服务器上你可能看到8到10。
你能使用uptime来确定是服务器还是网络出了问题。
例如如果网络应用程序运行,运行uptime来了解系统负载是否很高。如果负载不高,这个问题很有可能是由于网络引起的而你也非服务器。
提示:你可以使用w命令来代替uptime。w也提供关于当前系统登录用户和用户所进行工作的相关信息。
例子2-3:uptime输出示例
ps和pstree是用于系统分析的基本命令。
ps有3中不同风格的命令选项,UNIX风格、BSD风格和GNU风格。这里我们只介绍UNIX风格选项。
ps命令可以显示当前运行的进程列表。
top命令也可以显示进程信息,但ps可以提供更加详细的内容。
使用相应选项可以影响进程显示的数量。
ps -A命令可以列出所有进程及其相应的进程ID(PID),当我们使用如pmap或renice等工具时会用到此PID。
当系统运行java应用时,ps -A产生的输出结果很容易填满整个显示区域,这导致很难得到所有运行中进程的完整视图。
在这种情况下,pstree命令就派上用场了,它使用树状显示所有运行中的进程并合并所有的子进程(例如java线程),
pstree命令有助于确认原始进程。还有另一个ps变种pgrep也非常有用。
例子2-4:ps输出示例
下面我们来了解一些常用的选项
-e :所有进程。等同于-A
-l :显示长格式
-F :附加全格式
-H :显示进程的层次结构
-L :显示线程,可能出现LWP和NLWP栏位
-m :在进程后显示线程
下面的命令演示输出进程的详细信息:
ps -elFL
例子2-5:输出进程详细信息示例
输出栏位说明:
你可以使用ps -L查看线程信息。
例子2-6:使用ps -L查看线程信息
例子2-7:free命令输出结果示例
在使用free命令时,回忆一下Linux内存架构和虚拟内存管理方法。
空闲内存值的用处市非常有限的,单纯统计交换空间使用率也不表示存在内存瓶颈。
图2-1:描述了free命令输出结果的基本含义。
图2-1:free命令的输出结果
free命令常用的参数包括:
-b, -k, -m, -g :分别使用byte、KB、MB、GB为单位显示。
-l :区分低内存和高内存(参见1.2“Linux内存架构”)
-c
内存区【Zone】中使用的内存
使用-l选项,你可以了解到在每个内存区中有多少内存被使用。
例子2-8和例子2-9分别展示了在32位系统和64位系统中free -l的输出结果。注意在64位系统中不再使用高内存。
例子2-8:32位系统中free命令的输出结果
例子2-9:64位系统中free命令的输出结果
你可以从/proc/buddyinfo文件中了解到每个内存区中有多少块内存可以使用。
每列数值代表所需求大小的块可用的数量。
例子2-10中,在ZONE_DMA中有5块2^2*PAGE_SIZE可用,在ZONE_DMA32中有16块2^3*PAGE_SIZE可用。
回忆一下伙伴系统是怎样分配内存分页的(参见“伙伴系统”)。
下面输出结果显示系统内存碎片的具体情况并让我们了解有到底多少分页可以分配。
例子2-10:64位系统中伙伴系统相关信息
例子2-11:iostat输出结果
CPU使用情况分为四个部分:
%user :显示用户级别(应用)所占用CPU的百分比。
%nice :显示拥有Nice优先级用户级别所占用CPU的百分比。(优先级和nice级别会在2.3.7“nice,renice”中做相应介绍)
%sys :显示系统级别(内核)所占用CPU的百分比。
%idle :显示空闲CPU的百分比。
设备使用情况分为下面几个部分:
Device :块设备名称
tps :设备每秒钟传输的数量(每秒钟I/O请求数)。多个单独的I/O请求可以合并到一个传输请求中,因为每个传输请求可以有不同的大小。
Blk_read/s,Blk_wrtn/s :每秒钟块设备读写块的数量。可以设置不同的块大小,一般为1024,2048,4048字节,这取决于分区的容量。
例如使用下面的命令来获得/dev/sda1的块大小:
dumpe2fs -h /dev/sda1 |grep -F "Block size"
产生类似如下的输出:
dumpe2fs 1.34 (25-Jul-2003)
Block size: 1024
Blk_read,Blk_wrtn :显示自系统启动后读写块的总数。
iostat提供很多选项,对于性能来说最为常用的就是-x,它可以显示进阶的统计信息,示例如下。
例子2-12:iostat -x输出结果
rrqm/s,wrqm/s :每秒钟合并的读写请求数。多个单独的I/O请求可以合并到一个传输请求中,因为每个传输请求可以有不同的大小。
r/s,w/s : 每秒钟读写请求数。
rsec/s,wsec/s : 每秒钟读写的扇区数。
rkB/s,wkB/s : 每秒钟读写了多少KB。
avgrq-sz : 请求的平均大小,此值是以扇区为单位。
avgqu-sz : 请求队列的平均长度。
await : 显示系统级别(内核)所占用CPU的百分比。
svctm : I/O请求的平均服务时间(单位为毫秒)。
%util : I/O请求过程中CPU时间的百分比(设备的带宽使用率)。当接近100%时设备处于饱和状态。
计算I/O平均大小对于调整硬盘子系统访问模式非常有用。如下使用iostat -x -d,只显示有关于硬盘子系统的相关信息。
例子2-13:使用iostat -x -d分析I/O平均大小
在例子2-13的输出结果中,设备dasdc每秒钟写入12300.99KB的数据(kB_wrtn/s),这些数据被在一秒钟内分为2502.97次(w/s)I/O写入硬盘。
I/O平均大小或请求平均大小为9.83块(avgrq-sz),本例中块大小为512字节。
异步写操作平均I/O大小通常为奇数,然而大多数应用程序是以4KB的倍数(例如4KB,8KB,16KB,32KB等)来执行读写操作的。
在上面的例子中应用程序随机写操作请求的大小为4KB,然而iostat显示平均请求大小为4.915KB,
这种差别主要是由于Linux文件系统引起的,尽管我们执行的是随机写操作,确发现一些I/O被合并以便更有效地向硬盘写入数据。
注释:当文件系统使用默认的异步模式时,在iostat中只有请求平均大小的显示是正确的。
尽管应用程序在执行写操作时求有明确请求的大小,但I/O层仍可能将大多数请求合并从而导致I/O平均大小的改变。
利用sa1和sa2,可以配置获得系统相关信息并记录下来用于后续的分析。
提示:我们建议在你的绝大多数系统上运行sar。
这样一旦系统出现性能方面的问题,你手头就可以有个非常详细的系统信息,而这只需要少量的系统开销而且并不会增加额外的成本。
为达成这样的目的,需要在/etc/crontab添加相应配置(例子2-14)。在系统安装sar后,会自动建立一个cron工作每天执行sar。
例子2-14:使用cron启动日志自动报告
sar的原始数据保存于/var/log/sa/并根据月日分别保存在不同的文件中。
要查阅你的结果,可以选择日期和所需的性能数据。
例如要想显示从21日开始的网络计数器,使用sar -n DEV -f sa21命令并通过管道传给less,如例子2-15。
例子2-15:使用sar显示系统相关信息
你也可以通过命令行执行sar获得接近实时的报告(例子2-16)。
例子2-16:监控特定CPU
通过搜集到的数据,你可以看到CPU使用率(%user,%nice,%system,%idle)、内存分页、网络I/O和传输情况、进程创建活动、块设备活动和每秒钟的中断数量。
在多处理器服务器上使用mpstat命令可以显示所有可用处理器的使用情况,也会显示所有CPU活动的平均值。
mpstat是sysstat工具包的一部分。
mpstat能显示每个CPU的全面信息。mpstat也可以像vmstat命令设定取样频率和取样次数来使用取样模式生成相关统计信息。
在例子2-17中执行mpstat -P ALL来显示所有处理器的CPU平均使用率。
例子2-17:多处理器系统中mpstat命令的输出结果
使用下面的命令,每间隔一秒钟显示一次所有处理器的使用情况:
mpstat -P ALL 1 2
例子2-18:在两路服务器中mpstat的输出示例
要了解mpstat完整的语法规则,输入:
mpstat -?
例子2-19:numastat输出结果示例
例子2-20:init进程相关的内存信息
在输出结果的最后一行显示了一些重要的信息,如下:
mapped :映射到文件的内存数量
writable/private :进程所占用的私有地址空间数量
shared :与其它进程共享的地址空间数量
你也可以查看地址空间所存储的信息。当分别在32位和64位系统中执行pmap,你能发现一个有趣差异。
关于pmap的完整语法,请执行:
pmap -?