《Linux 性能及调优指南》2.3 监控工具

翻译:飞哥 ( http://hi.baidu.com/imlidapeng )

版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明。

原文名称:《Linux Performance and Tuning Guidelines》

原文地址:http://www.redbooks.ibm.com/abstracts/redp4285.html

-------------------------------------------------------------------------------------------

本章我们将讨论监控工具,这些工具大部分都来源于Linux企业版。你应该熟练掌握这些工具。

2.3.1 top

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.3.2 vmstat

vmstat能提供进程、内存、分页、块I/O、traps和CPU活动相关信息。
​vmstat命令可以显示平均值或实际取样值。使用取样频率和取样时间等参数启用vmstat取样模式。

注意:在取样模式中需要考虑实际数据搜集中存在误差的可能,设定较低的取样频率能减少这样的可能。


​实例2-2 vmstat输出示例

注释:vmstat输出结果中第一行展示的是自最后一次启动以来的平均值,所以此行可以忽略。

输出栏位如下:

Process(procs)

r :等待运行时间的进程数。
b :处于不可中断睡眠状态的进程数。

Memory

swpd :虚拟内存使用量(KB)。
free :空闲内存量(KB)。
buff :用作buffer的内存量(KB)。
cache :用作cache的内存量(KB)。

swap

si :从硬盘交换到内存的数量(KBps)。
so :交换到硬盘的内存数量(KBps)。

IO

bi:发送到块设备的块的数量(blocks/s)。
bo:从块设备获取的块的数量(blocks/s)。

System

in :每秒钟的中断数量,包括时钟中断。
cs :每秒钟上下文交换的数量。

CPU(整个CPU时间的百分比)

us :花费在非内核代码的CPU时间(用户时间,包括Nice时间)。
sy :花费在内核代码的CPU时间(系统时间)。
id :空闲时间。在2.5.41内核以前,还包括I/O等待时间。
wa :IO等待时间。在2.5.41内核以前,显示为0。

vmstat命令提供了许多命令行参数,使用man手册查看参数的详细文档。常用的参数有:

-m :显示内核的内存使用情况(slabs)

-a :显示活动和非活动内存分页相关信息

-n :只显示一次栏位名称行,当在取样模式通下将输出信息存储到文件时非常有用。(例如,root#vmstat –n 2 10 以每2秒钟的频率执行10次取样)

当使用-p{ 分区 }参数时,vmstat也可以提供I/O相关统计信息。

2.3.3 uptime

uptime命令可以用来查看服务器已经运行了多久和曾经登录过的用户有多少,以及服务器的平均负载值是多少
(参见1.6.1“处理器性能指标”)。
​它可以显示过去1分钟、5分钟、15分钟的系统平均负载值。

平均负载的最佳值是1,这意味着每个进程都可以立即执行不会错过CPU周期。
​负载的正常值在不同的系统中有着很大的差别。在单处理器的工作站中,1或2都是可以接受的。然而在多处理器的服务器上你可能看到8到10。


你能使用uptime来确定是服务器还是网络出了问题。
例如如果网络应用程序运行,运行uptime来了解系统负载是否很高。如果负载不高,这个问题很有可能是由于网络引起的而你也非服务器。

提示:你可以使用w命令来代替uptime。w也提供关于当前系统登录用户和用户所进行工作的相关信息。


​例子2-3:uptime输出示例


2.3.4 ps和pstree

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:输出进程详细信息示例


​输出栏位说明:

F :进程标志
S :进程状态。S=sleeping,R=running,T=stopped/traced,D=interruptable sleep,Z=zombie。参见1.1.7“进程状态”中关于这些状态的介绍。
UID :进程所有者(可能是启动者)用户名
PID :进程ID
PPID :父进程ID
LWP :LWP(轻量级进程【light weight process】,也称作线程)ID
C :处理器使用率百分比
NLWP :进程中lwp(线程)的数量。(别名thcount)
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)
ADDR :进程地址空间(不显示)
SZ :进程所有内存(code+data+stack)总数,单位为KB。
WCHAN :内核功能名称,如果进程正在运行中
RSS :常驻集大小,任务所使用的非交换物理内存(KB)
PSR :当前执行进程的处理器
STIME :开始时间
TTY :终端名称
TIME :进程所用的CPU时间总数(自从启动)
CMD :启动任务的命令行(包括参数)

线程信息

你可以使用ps -L查看线程信息。

例子2-6:使用ps -L查看线程信息


​​ 2.3.5 free
​命令/bin/free显示系统中内存空闲及使用情况。它也包括内核使用的buffer与cache的相关信息。

例子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.3.6 iostat

iostat名利可以显示自从系统启动开始的CPU平均时间(与uptime相似)。

它也可以产生关于服务器硬盘子系统活动情况的报告,

报告包括两部分内容:CPU使用情况和硬盘使用情况。

iostat可以用来获得I/O瓶颈的详细信息和系统性能调优,参见3.4.1“查找硬盘瓶颈”。

iostat是sysstat工具包的一部分。

例子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平均大小的改变。


2.3.7 sar

sar命令用来搜集、报告和保存系统活动信息。

sar命令由3个应用程序组成:sar,用来显示数据;sa1和sa2,用来搜集和保存数据。

sar有非常多的选项,关于这些选项可以参看man手册。sar是sysstat工具包的一部分。

利用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和传输情况、进程创建活动、块设备活动和每秒钟的中断数量。

2.3.8 mpstat

在多处理器服务器上使用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.3.9 numastat

使用非一致性内存架构(NUMA)的系统如IBM System x 3950,如今NUMA架构在企业数据中心已经成为主流。

然而NUMA却为性能调优过程带来新的挑战。如内存局部性问题在NUMA系统出现前是不用考虑的。

幸运的是,企业版Linux提供监控NUMA架构行为的工具。numastat能提供关于使用本地内存与远端内存的比例和各节点内存配置的相关信息。

在numa_miss栏中显示分配失败的本地内存,在numa_foreign栏中显示分配的远端内存(较慢的内存)。

过多分配远端内存会增加系统延迟并可能降低整体性能。绑定节点的进程使用本地RAM的内存映射可以大大提高系统性能。


例子2-19:numastat输出结果示例

2.3.10 pmap

pmap命令可以显示一个或多个进程所使用的内存数量。

你可以使用这个工具来了解服务器上的某个进程分配了多少内存,并以此来判断这是否是导致内存瓶颈的原因。

要得到更加详细的信息,使用pmap -d选项。

例子2-20:init进程相关的内存信息

在输出结果的最后一行显示了一些重要的信息,如下:

mapped :映射到文件的内存数量

writable/private :进程所占用的私有地址空间数量

shared :与其它进程共享的地址空间数量

你也可以查看地址空间所存储的信息。当分别在32位和64位系统中执行pmap,你能发现一个有趣差异。

​关于pmap的完整语法,请执行:

pmap -?

你可能感兴趣的:(Linux:,系统相关)