二.性能监测工具
Linux开放和灵活的特性使得它有很多的性能监测软件,这些工具中有的是传统UNIX系统的Linux版本,其他是专门为Linux设计的工具,大部分Linux性能监测工具都是基于proc虚拟文件系统的。
在这一章里我们介绍一些常用性能监测工具和讨论一些有用的命令。所有我们讨论的工具,除了Capacity Manager,都是Red Hat Enterprise Linux (RHEL)所提供的,不需要从网络下载或者其他途径得到。
1.uptime
Uptime命令的显示结果包括服务器已经运行了多长时间,有多少登陆用户和对服务器性能的总体评估(load average)。load average值分别记录了上个1分钟,5分钟和15分钟间隔的负载情况,load average不是一个百分比,而是在队列中等待执行的进程的数量。如果进程要求CPU时间被阻塞(意味着CPU没有时间处理它),load average值将增加。另一方面,如果每个进程都可以立刻得到访问CPU的时间,这个值将减少。
load average的最佳值是1,这说明每个进程都可以立刻被CPU处理。在不同的系统间这个值也是不同的,例如一个单CPU的工作站,load average为1或者2都是可以接受的,但是在一个多CPU的系统中这个值通常为8或者10。
你可以使用uptime判断一个性能问题是出现在服务器上还是网络上。例如,如果一个网络应用运行性能不理想,运行uptime检查系统负载是否比较高,如果不是这个问题更可能出现在你的网络上。
Uptime命令执行示例
Tip:你可以用w命令代替uptime,w命令也可以提供目前登陆用户的信息。
2.Dmesg
Dmesg的主要功能是显示内核信息,当硬件或者内核中加载的模块出现问题的时候dmesg可以提供一些有用的信息。另外,利用dmesg你可以查看有哪些硬件安装在你的服务器上。在每次启动的时候,Linux检查硬件并且记录这些信息。你可以使用/bin/dmesg命令来查看这些信息。
3.Top
Top命令显示了实际CPU使用情况,默认情况下,它显示了服务器上占用CPU的任务信息并且每5秒钟刷新一次。你可以通过多种方式分类它们,包括PID、时间和内存使用情况。
下图是一个top命令结果的示例,
你可以使用renice命令为一个进程分配新的优先级。如果一个进程宕掉或者占用了太多的内存,可以使用kill命令杀死进程。下面是输出值的介绍,
PID:进程标识
USER;进程所有者的用户名
PRI:进程的优先级
NI:nice级别
SIZE:进程占用的内存数量(代码+数据+堆栈)
RSS;进程使用的物理内存数量
SHARE;该进程和其他进程共享内存的数量
STAT:进程的状态:S=休眠状态,R=运行状态,T=停止状态,D=中断休眠状态,Z=僵尸状态
%CPU:共享的CPU使用
%MEM;共享的物理内存
TIME:进程占用CPU的时间
COMMAND:启动任务的命令行(包括参数)
Top命令有下面几个有用的热键,包括
t:是否显示概要信息
m:是否显示内存信息
A:通过不同的系统资源情况分类显示结果,对快速判断系统中影响性能的进程十分有效
f:输入一个top的交互式的配置画面
o:激活交换式的分类的选择
进程的优先级和nice级别
进程优先级是一个决定进程被CPU执行优先顺序的参数,内核会根据需要调整这个值。Nice值是一个对优先权的限制。进程优先级的值不能低于nice值。(nice值越低优先级越高)
进程优先级是无法去手动改变的,只有通过改变nice值去间接的调整进程优先级。如果一个进程运行的太慢了,你可以通过指定一个较低的nice值去为它分配更多的CPU资源。当然,这意味着其他的一些进程将被分配更少的CPU资源,运行更慢一些。Linux支持nice值的范围是19(低优先级)到-20(高优先级),默认的值是0。如果需要改变一个进程的nice值为负数(高优先级),必须使用su命令登陆到root用户。下面是一些调整nice值的命令示例,
以nice值-5开始程序xyz
#nice –n -5 xyz
改变已经运行的程序的nice值
#renice level pid
将pid为2500的进程的nice值改为10
#renice 10 2500
僵尸进程
当一个进程被结束,在它结束之前通常需要用一些时间去完成所有的任务(比如关闭打开的文件),在一个很短的时间里,这个进程的状态为僵尸状态。在进程完成所有关闭任务之后,会向父进程提交它关闭的信息。有些情况下,一个僵尸进程不能关闭它自己,这时这个进程状态就为z(zombie)。不能使用kill命令杀死僵尸进程,因为它已经标志为“dead”。如果你无法摆脱一个僵尸进程,你可以杀死它的父进程,这个僵尸进程也就消失了。然而,如果父进程是init进程,你不能杀死init进程,因为init是一个重要的系统进程,这种情况下你只能通过一次重新启动来摆脱僵尸进程。
4.iostat
iostat是sysstat的一部分,如果你没有安装这个包,在Red Hat Enterprise Linux光盘中找到sysstat的rpm包进行安装。Iostat显示自系统启动后的平均CPU时间(与uptime类似),它也可以显示磁盘子系统的使用情况,iostat可以用来监测CPU利用率和磁盘利用率。下图是一个命令输出的示例,
CPU利用率分四个部分:
%user:user level(应用)的CPU占用率情况
%nice:加入nice优先级的user level的CPU占用率情况
%sys:system level(内核)的CPU占用情况
%idle:空闲的CPU资源情况
磁盘占用率有下面几个部分:
Device:块设备名
Tps:设备每秒进行传输的数量(每秒的I/O请求)。多个单独的I/O请求可以被组成一个传输操作,因为一个传输操作可以是不同的容量。
Blk_read/s, Blk_wrtn/s:该设备每秒读写的块的数量。块可能为不同的容量。块的大小一般为1024、2048、4048byte。例如,块设备/dev/sda1的块大小可以通过下面命令查看
# dumpe2fs -h /dev/sda1 |grep -F "Block size"
会得到类似下面的输出
dumpe2fs 1.34 (25-Jul-2003)
Block size: 1024
Blk_read, Blk_wrtn:自系统启动以来读写的块设备的总量。
5.Vmstat
Vmstat命令提供了对进程、内存、页面I/O块和CPU等信息的监控,vmstat可以显示检测结果的平均值或者取样值,取样模式可以提供一个取样时间段内不同频率的监测结果。下面是一个vmstat命令的输出结果的示例。
注:在取样模式中需要考虑在数据收集中可能出现的误差,将取样频率设为比较低的值可以尽可能的减小误差的影响。
下面介绍一下各列的含义
·process(procs)
r:等待运行时间的进程数量
b:处在不可中断睡眠状态的进程
w:被交换出去但是仍然可以运行的进程,这个值是计算出来的
·memoryswpd:虚拟内存的数量
free:空闲内存的数量
buff:用做缓冲区的内存数量
·swap
si:从硬盘交换来的数量
so:交换到硬盘去的数量
·IO
bi:向一个块设备输出的块数量
bo:从一个块设备接受的块数量
·system
in:每秒发生的中断数量, 包括时钟
cs:每秒发生的context switches的数量
·cpu(整个cpu运行时间的百分比)
us:非内核代码运行的时间(用户时间,包括nice时间)
sy:内核代码运行的时间(系统时间)
id:空闲时间,在Linux 2.5.41之前的内核版本中,这个值包括I/O等待时间
等待I/O操作的时间,在Linux 2.5.41之前的内核版本中这个值为0
Vmstat命令提供了大量的附加参数,可以参考vmstat的man手册去查询所有的参数,下面列举几个十分有用的参数。
·m:显示内核的内存利用率
·a:显示内存页面信息,包括活跃和不活跃的内存页面
·n:显示报头行,这个参数在使用取样模式并将命令结果输出到一个文件时非常有用。例如root#vmstat –n 2 10以2秒的频率显示10输出结果
·当使用-p {分区}时,vmstat提供对I/O结果的统计
6.ps和pstree
ps和pstree命令是系统分析最常用的基本命令,ps命令提供了一个正在运行的进程的列表,列出进程的数量取决于命令所附加的参数。例如ps –A 命令列出所有进程和它们相应的进程ID(PID),进程的PID是使用其他一些工具之前所必须了解的,例如pmap或者renice。
在运行java应用的系统上,ps –A 命令的输出很容易就会超过屏幕的显示范围,这样就很难得到所有进程的完整信息。这时,使用pstree命令可以以树状结构来显示所有的进程信息并且可以整合子进程的信息。Pstree命令对分析进程的来源十分有用。下面是命令的示例,
7.Numastat
随着NUMA架构的不断发展,例如eServer xSeries 445及其后续产品eServer xSeries 460,现在NUMA架构已经成为了企业级数据中心的主流。然而,NUMA架构在性能调优方面面临了新的挑战,例如内存分配的问题在NUMA系统之前并没人感兴趣,Red Hat Enterprise Linux 4提供了一个监测NUMA架构的工具。Numastat命令提供了本地内存与远程内存使用情况的对比和各个节点的内存使用情况。Numa_miss列显示分配失败的本地内存,numa_foreign列显示分配远程内存(访问速度慢)信息,过多的调用远程内存将增加系统的延迟从而影响整个系统的性能。使运行在一个节点上的进程都访问本地内存将极大的改善系统的性能。
8.sar
sar程序是sysstat安装包的一部分,如果你没有安装这个包,在Red Hat Enterprise Linux的源文件中寻找这个rpm包进行安装,sar命令用于收集、报告和保存系统的信息。Sar命令由三个应用组成:sar,用与显示数据;sa1和sa2,用于收集和存储数据。关于sar工具的详细参数说明可以参考man手册。
为了以后分析日志,可以使用sa1和sa2配置系统获得并且记录日志信息。为了实现这个目的,如下图例所示向/etc/crontab中加入相应的内容。注意默认的情况下cron每天都会定时的运行sar命令,如果系统安装了sar相应的安装包。
sar命令所生成的数据保存在/var/log/sa/目录下,数据按照时间保存,可以根据时间来查询相应的性能数据。例如,显示21号的网络信息使用下面的命令sar -n DEV -f sa21|less,命令结果如下,
你也可以使用sar在命令行下得到一个实时的执行结果,收集的数据可以包括CPU利用率、内存页面、网络I/O等等。如下例所示,
9.KDE System Guard
KDE System Guard (KSysguard)是一个KDE的任务管理器和性能监测工具。它是一个客户端/服务器结构的应用,因此可以监测本地或者远程主机。
图形界面中可以用左侧的Sensor选择显示的信息,一个Sensor可以返回一个简单的值或者更复杂的信息例如表格。针对每一类信息都提供了一个或多个显示信息,这些显示信息可以保存或者互相独立的在工作表中加载。
KSysguard窗口中包括菜单栏、工具栏和状态栏,页面浏览和工作区。当你第一次打开时,可以看到默认的情况:本地主机做为localhost列在Sensor浏览里,在工作区中有两个表格。每个Sensor监测某些系统参数,所有的Sensor显示可以在工作区中以拖拽的形式操作,有下面三个选项:
·可以在工作区中删除和代替Sensor
·可以编辑工作表的属性以增加显示的行数和列数
·可以建立新的工作表并且加入新的Sensor以满足应用的需要
下面介绍一下工作区,如下图所示工作区中显示两张表,
·system load:在启动KSysguard中默认显示的
·process Table
System load工作表中包括四个Sensor窗口,cpu负载、平均负载、物理内存和交换空间。多个Sensor可以被显示在一个窗口中,如果想查看窗口中正在监测的分Sensor信息,将鼠标移到图标上,相应的说明会显示出来。也可以在图标上点鼠标右键选择Properties,然后选择页面表,就可以看到相应的说明信息。
点击Process Table表将显示所有在服务器上运行进程的信息,这个表默认显示的是系统CPU的利用率,但是它可以通过选择其他分页来显示其他信息。
因为环境或者应用的需要,你可能有多种不同的Sensor需要监测,实现这个最好的方法就是自定义一个工作表。下面就简单的指导一下如何根据需要建立自定义的工作表。
(1).创建一个空的工作表,点击File → New。
(2).输入标题、工作表的行数和列数,也就是监测窗口的数量,在例子中是4个。当信息输入完成后,点击ok建立空工作表。
(3).在窗口左边将需要的Sensor拖到右边的窗口中。
(4).点击File → Save保存新的工作表。
如果想要了解关于KDE System Guard的更多信息请访问下面的链接
10.Gnome System Monitor
虽然没有KDE System Guard那么强大的功能,Gnome桌面环境也有自己的图形化的性能监测工具。Gnome System Monitor可以图形化的显示系统性能相关的参数,所有的统计结果都是实时的,如果需要长时间的统计结果需要通过其他的性能监测工具来实现。
11.free
free命令显示系统的所有内存的使用情况,包括空闲内存、被使用的内存和交换内存空间。Free命令显示也包括一些内核使用的缓存和缓冲区的信息。下面是命令结果的示例,
当使用free命令的时候,需要记住linux的内存结构和虚拟内存的管理方法,比如空闲内存数量的限制,还有swap空间的使用并不标志一个内存瓶颈的出现。
Free命令有用的参数:
·-b,-k,-m和-g分别按照bytes, kilobytes, megabytes, gigabytes显示结果。
·-l区别显示low和high内存
·-c {count}显示free输出的次数
12.Pmap
pmap命令显示一个或者多个进程使用内存的数量,你可以用这个工具来确定服务器上哪个进程占用了过多的内存从而导致内存瓶颈。
命令格式:pmap
关于pmap命令的详细语法可以使用下面命令查询
pmap -?
13.Strace
strace截取和记录进程的系统调用信息,还包括进程接受的命令信号。这是一个有用的诊断和调试工具,系统管理员可以通过strace来解决程序上的问题。
命令格式,需要指定需要监测的进程ID,下图是一个命令结果的示例。
strace -p
使用下面命令可以获得关于strace的完整语法信息
strace -?
注:当针对某个进程执行strace命令时,对该进程的运行性能将产生很大的影响,所以这个命令仅仅应该用在收集数据的时候。
14.ulimit
这个命令是基于bash的,可以通过ulimit来控制系统资源的使用,使用-a参数列出所有可调的参数。
ulimit –a
-H和-S参数可以对指定的资源进行软限制和硬限制,如果超过了软限制,系统管理员会接收到一个警告,在达到硬限制的时候命令就会提示报错。
例如,为系统打开文件的数量设定一个硬限制
ulimit -Hn 4096
为打开文件设定一个软限制
ulimit -Sn 1024
查看硬限制和软限制的值
ulimit -Hn
ulimit -Sn
这是一个很有用的命令,例如现在想在系统启动时对Oracle用户进行限制,在/etc/security/limits.conf中加入如下两行:
soft nofile 4096
hard nofile 10240
另外确保/etc/pam.d/system-auth文件有下面内容
session required /lib/security/$ISA/pam_limits.so
这一行确保系统会执行这个限制。
如果要查看ulimit命令的详细语法,可以执行
ulimit -?
15.Mpstat
mpstat命令是sysstat包的一部分,如果没有安装sysstat包,可以在Red Hat Enterprise Linux安装源文件中找到并且安装这个rpm包。Mpstat命令用于监测一个多CPU系统中每个可用CPU的情况。Mpstat命令可以显示每个CPU或者所有CPU的运行情况,同时也可以像vmstat命令那样使用参数进行一定频率的采样结果的监测。下面是使用mpstat -P ALL命令的显示结果的示例,
关于完整的命令语法请用下面命令查看
mpstat -?
16. Capacity Manager
Capacity Manager是IBM Director系统管理的一个附加组件,可以提供对不同平台下的多个系统进行长期的性能监测。除了对性能的监测,Capacity Manager还包括对容量的计划,提供对系统将来可能的容量的分析和建议。Capacity Manager可以输出多种文件格式包括HTML, XML和GIF。IBM Director可以被应用在不同操作系统平台下,这样就为在异构环境下对数据的收集和分析提供了有力的工具。
如果使用Capacity Manager,必须在系统中安装相关的rpm包。安装完成后在IBM Director Console中选择Capacity Manager →Monitor Activator
拖拽Monitor Activator图标到一个单独的或者一组已经安装相应程序的系统,在接下来的窗口中可以选择多种子系统进行监测。Capacity Manager在Linux下会有少部分功能受一些参数的限制。
Monitor Activator窗口在右边的窗口中显示相关系统目前的状态,在左边的窗口中显示显示可用的性能监测。添加一个新的监测,选择相应的监测图标点击On。改变将在Monitor Activator窗口关闭后马上生效,配置完成后,IBM Director将开始收集并且存储所要求的性能数据。如果要为收集的信息创建一个报告,选择Capacity Manager → Report Generator并且拖拽操作你想监测的单个或者一组系统,IBM Director将显示下面的界面,
在这里根据你的需要选择是立刻执行或者指定时间执行。在生产环境中,在固定的时间收集Capacity Manager报告是一个比较好的方法,我们可以选择在每周末系统并不繁忙的时候产生一次系统报告。一旦报告收集完成将存储在IBM Director服务器上,可以通过Report Viewer任务来查看。
下图是一个报告结果的示例
在Report Viewer窗口中可以选择需要查看的不同性能参数,Capacity Manager的结果可以被输出为HTML或者XML文件,为了分析需要可以被显示在内部的web服务器上。