Part 2 系统性能的监控与进程的管理
监测和管理系统性能是系统管理员一项非常重要的任务。监测结果可以判断当前用户的应用和系统服务是否有效执行;管理系统进程是系统性能调优的重要手段。本章将介绍系统性能的监控和进程的管理方法。
监控系统性能
Solaris提供了许多监控工具来监控设备和核心部件的运行情况。本节将介绍一些传统的监控工具。值得一提的是,Solaris 10推出的dtrace超越了传统的UNIX系统提供的性能工具,可以用dtrace的sysinfo provider来完成所有的性能分析工作。有关dtrace的详细介绍。
虚拟内存的统计显示
可以使用vmstat命令来报告虚拟内存的统计信息和系统事件信息,如CPU负载、内存分页、设备中断、系统调用等。此外,vmstat命令还可以显示SWA区交换、缓存和中断的统计信息。
vmstat命令的输出
2008-4-12 01:201.显示虚拟内存的统计信息
使用vmstat n命令可以显示虚拟内存的统计信息,其中n为每次报告的时间间隔秒数。
例15-1 使用vmstat命令每5秒报告一次虚拟内存信息。
$ vmstat 5
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr dd f0 s1 -- in sy cs us sy id
0 0 0 863160 365680 0 3 1 0 0 0 0 0 0 0 0 406 378 209 1 0 99
0 0 0 765640 208568 0 36 0 0 0 0 0 0 0 0 0 479 4445 1378 3 3 94
2.显示系统事件的信息
例15-2 使用vmstat –m来显示系统启动以后发生的多个系统事件信息。
$ vmstat -s
0 swap ins
0 swap outs
0 pages swapped in
0 pages swapped out
522586 total address trans. faults taken-----地址解析错误数量
17006 page ins
25 page outs
23361 pages paged in
28 pages paged out
45594 total reclaims
45592 reclaims from free list
0 micro (hat) faults
522586 minor (as) faults
16189 major faults
98241 copy-on-write faults
137280 zero fill page faults
45052 pages examined by the clock daemon
0 revolutions of the clock hand
26 pages freed by the clock daemon
2857 forks
78 vforks
1647 execs
34673885 cpu context switches
65943468 device interrupts
711250 traps
63957605 system calls
3523925 total name lookups (cache hits 99%)
92590 user cpu
65952 system cpu
16085832 idle cpu
7450 wait cpu
3.显示交换数据统计信息
例15-3 显示交换数据统计信息。
$ vmstat -S
kthr memory page disk faults cpu
r b w swap free si so pi po fr de sr dd f0 s1 -- in sy cs us sy id
0 0 0 862608 364792 0 0 1 0 0 0 0 0 0 0 0 406 394 213 1 0 99
4.显示系统中每个设备的中断信息
例15-4 显示系统中每个设备的中断信息。
$ vmstat -i
interrupt total rate
------------------------------------------------------------------------------------------
clock 52163269 100
esp0 2600077 4
zsc0 25341 0
zsc1 48917 0
cgsixc0 459 0
lec0 400882 0
fdc0 14 0
bppc0 0 0
audiocs0 0 0
------------------------------------------------------------------------------------------
Total 55238959 105
显示磁盘的使用信息
使用iostat命令可以报告磁盘的输入/输出(I/O)的统计信息,并检测磁盘的吞吐量、利用率、队列、处理速率和服务时间。
1.显示磁盘的利用率信息
例15-5 每5秒钟采集一次磁盘使用信息。
$ iostat 5
tty sd0 sd6 nfs1 nfs49 cpu
tin tout kps tps serv kps tps serv kps tps serv kps tps serv us sy wt id
0 0 1 0 49 0 0 0 0 0 0 0 0 15 0 0 0 100
0 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100
2.显示扩展磁盘的信息
例15-6 显示扩展磁盘信息。
$ iostat -xtc
extended device statistics tty cpu
device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id
fd0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 100
sd0 0.0 0.0 0.4 0.4 0.0 0.0 49.5 0 0
sd6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
nfs1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
nfs49 0.0 0.0 0.0 0.0 0.0 0.0 15.1 0 0
nfs53 0.0 0.0 0.4 0.0 0.0 0.0 24.5 0 0
可见,也采集了远程NFS的磁盘信息。
每一列数据的具体意思为:
device:显示设备名。
r/s:每秒读磁盘的次数。
w/s:每秒写磁盘操作的次数。
kr/s:显示每秒读数据总量(单位为KB)。
km/s:显示每秒写数据总量(单位为KB)。
wait:显示平均的等待事物数量。
actv:显示正在处理的平均事物数量。
svc_t:显示平均服务周期(单位为ms)。
%w:显示等待时间的百分数。
%b:显示磁盘工作时间的百分数。
15.1.3 显示CPU负载信息
下面的命令是每5秒产生两次处理器的统计数据报告。命令显示了处理器集合与每个CPU的成员关系。默认用户和系统操作的输出是按照CPU号,处理器集合排序。默认用户和系统操作的输出是按照CPU号或者处理器集合排序的。(本例中是按处理器集合排序的。)
例15-7 使用mpstat命令显示cpu负载。
mpstat输出说明
变 量--说 明
SET--SET是处理器集合
minf--一般错误的个数
mjf--主要错误的个数
xcal--处理器间的交叉调用
intr--中断
ithr--线程中断,不包括时钟中断
csw--上下文切换数
icsw--非主动的上下文切换数
migr--转移到其他CPU的线程数
smtx--在互斥锁mutexes上的自旋(第一次试图获得锁,未果)的次数
srw--在读/写锁上自旋(第一次试图获得锁,未果)的次数
syscl--系统调用
usr--用户时间百分比
sys--系统时间百分比
wt--等待时间百分比
idl--CPU空闲时间百分比
sze--请求的处理器集合中的处理器个数
有关mpstat输出的几点说明:
CPU占用率的统计由于舍入错误,可能存在百分比数字的总和不是100的情况。
CPU处理的总时间是用户和系统操作报告的usr和sys值的和。而wt报告的值是处理器空闲等待IO操作的时间。idl报告的值是CPU因除去等待磁盘IO操作外其他任何原因而空闲的时间。所以,CPU空闲的时间总数应该是wt和idl输出值之和。
wt的值高意味着磁盘系统的问题,不是CPU和其他部分的问题。过高的wt时间百分比必须通过提高磁盘设备性能来解决。
当在一个分区(zone)里执行,如果pools facility处于活动状态,mpstat将只提供属于zone绑定的pool的处理器集合的成员的那些处理器的信息。
监控系统活动信息
收集系统性能数据的一种最通用的方法是使用sar命令。sar命令功能强大,参数众多。sar命令的常用格式:
sar [options] [-A] [-o file] t [n]
在命令行中,n和t两个参数组合起来定义采样间隔和次数:t为采样间隔,是必须有的参数;n为采样次数,是可选的,默认值是1。-o file表示将命令结果以二进制格式存放在文件中,file在此处不是关键字,是文件名。options为命令行选项,sar命令的选项很多,下面只列出常用选项:
-A 所有报告的总和。
-u CPU利用率。
-v 进程、I节点、文件和锁表状态。
-d 硬盘使用报告。
-r 没有使用的内存和swap硬盘块。
-g 串口I/O的情况。
-b 缓冲区使用情况。
-a 文件读写情况。
-c 系统调用情况。
-R 进程的活动情况。
-y 终端设备活动情况。
-w 系统交换活动。
例15-8 使用sar命令,每60秒采样一次,连续采样5次,观察CPU的使用情况,并将采样结果以二进制形式存入当前目录下的文件text中。
# sar -u -o text 60 5
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
14:43:50 %usr %sys %wio %idle(-u)
14:44:50 0 1 4 94
14:45:50 0 2 4 93
14:46:50 0 2 2 96
14:47:50 0 2 5 93
14:48:50 0 2 2 96
Average 0 2 4 94
对显示内容进行解释:
%usr CPU处在用户模式下的时间百分比。
%sys CPU处在系统模式下的时间百分比。
%wio CPU等待输入输出完成时间的百分比。
%idle CPU空闲时间百分比。
在上面的显示内容中,我们应特别注意%wio和%idle值。%wio的值过高,表示硬盘存在I/O瓶颈;%idle值高,表示CPU较空闲。如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量;%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统需要更换处理能力更强的CPU。
如果要查看二进制文件text中的内容,则需键入如下sar命令:
# sar -u -f text
可见,sar命令既可以实时采样,又可以对以往的采样结果进行查询。
sar命令的用法很多,有时判断一个问题,需要结合运行有不同选项sar命令,比如,怀疑CPU存在瓶颈,可用sar -u和sar -q来看;怀疑I/O存在瓶颈,可用sar -b、sar -u和sar-d来看。对于sar命令其他参数的使用请读者自己去参考使用,这里不再多说。
系统进程的管理
优化管理系统进程可在不增加更多的硬件资源的情况下,提升系统性能。本节主要介绍系统进程的优化管理。
进程管理概述
众所周知,Solaris是个多用户多任务的操作系统,多用户多任务就意味着有更多的进程。为了统一管理系统上正在运行的进程,所有进程都被赋予一个惟一的标志号(PID),内核根据PID来跟踪和管理进程。PID也可以被root和普通用户用来标识和控制他们的进程。
要运行程序,必然要为其分配其相应的资源。我们监控进程,目的是在保证应用服务可以有效地进行的同时,消耗与服务相适应的资源。整个系统的稳定运行,也依赖于对资源的合理分配。经验证明,系统性能的降低往往是因为应用程序所产生的某些进程消耗了过多的系统资源。
系统进程的管理,是系统管理员的基本工作之一。主要是检查那些没有必要而长期占用资源的进程。处理这些问题进程的方法通常是将它们关闭。在管理进程的时候需要特别注意不要轻易杀死系统本身的进程,这样有可能造成系统的故障甚至崩溃。
进程管理的方法介绍
1.使用ps命令报告进程状态
使用ps命令报告进程状态,可以确定哪个进程正在进行;查看一个进程是否完成;查看一个进程是被挂起了还是遇到困难了;确定进程已经运行了多久;查看进程使用的资源;在杀掉一个进程前找到它的PID。所有这些对用户和系统管理员均有用处。
用户用不带任何参数的ps命令来查看自己的进程列表,不包括任何系统或其他用户的进程。如下:
$ ps
PID TTY TIME CMD
1664 pts/4 0:06 csh
2081 pts/4 0:00 ps
默认的ps列表内容一般只包括:进程标志号(PID)、执行命令的终端(TTY)、进程的CPU耗时(TIME),以及执行的命令(CMD)。
ps命令的主要选项
选 项--说 明
-a--列出最常被请求的进程
-A,-e--列出所有进程
-c--以调度程序格式列出进程
-d--列出所有进程
-f--打印进程的详细信息
-g--打印指定用户组的进程信息
-G--以组为单位打印不同用户组的信息
-j--在输出中包括SID和PGID
-l--打印完整的进程信息
-L--显示LWP的详细资料
-p--根据指定进程列表列出进程的详细资料
-P--列出进程绑定的CPU ID
-s--列出会话线索
-t--列出与特定终端有关的所有进程
-u--列出与一个特定用户有关的所有进程
显示系统进程时最常用的命令就是ps –ef。-e参数是列出系统中所有的进程,-f参数是列出进程的细节信息。
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 Dec 20 ? 0:17 sched
root 1 0 0 Dec 20 ? 0:00 /etc/init -
root 2 0 0 Dec 20 ? 0:00 pageout
root 3 0 0 Dec 20 ? 4:20 fsflush
root 374 367 0 Dec 20 ? 0:00 /usr/lib/saf/ttymon
……
其中,UID为进程拥有者的用户ID;PPID为父进程的ID;C为处理器的利用率;STIME为进程开始的时间;TTY为进程或者它的父进程开始的终端。
另外,在综合反映系统进程的工具中,top也不错,它可对进程按照CPU负载的大小进行排序。限于篇幅,这里不再展开。
2.使用proc工具操作数据
proc工具主要用来操作/proc文件系统中数据。每个工具都以PID为参数,并执行与该PID相关的操作。
proc工具命令列表:
进程命令--描 述
pcred--显示进程的可信度
Pfiles--显示已打开文件的fstat和fcntl信息
pflags--显示每个lwp的/proc跟踪标志,等待和待有信号量及其他状态信息
pldd--显示链接到每个进程的动态链接库
pmap--显示地址映射空间
psig--显示信号操作
pstack--显示每个lwp的十六进制与符号堆跟踪
ptree--显示包含指定PID的进程树
pwdx--显示当前工作目录
pstop--停止进程
prun--重新启动进程
ptime--使用微状态计算进程时间
pwait--等待指定的进程终止
例15-9 分析cron进程。
(1)查找cron的进程号:
# pgrep cron
4780
(2)显示cron进程工作的目录:
# pwdx 4780
4780: /var/spool/cron/atjobs
(3)显示进程树:
# ptree 4780
4780 /usr/sbin/cron
(4)显示已打开文件的fstat和fcntl信息,这对于确定数据文件和应用程序之间的依赖关系十分有用。
# pfiles 4780
4780: /usr/sbin/cron
Current rlimit: 256 file descriptors
0: S_IFCHR mode:0666 dev:290,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_RDONLY|O_LARGEFILE
[url=]/devices/pseudo/mm@0:null[/url]
1: S_IFREG mode:0600 dev:32,128 ino:42054 uid:0 gid:0 size:9771
O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
/var/cron/log
2: S_IFREG mode:0600 dev:32,128 ino:42054 uid:0 gid:0 size:9771
O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
/var/cron/log
3: S_IFIFO mode:0600 dev:32,128 ino:42049 uid:0 gid:0 size:0
O_RDWR|O_LARGEFILE
/etc/cron.d/FIFO
4: S_IFIFO mode:0000 dev:293,0 ino:4630 uid:0 gid:0 size:0
O_RDWR|O_NONBLOCK
5: S_IFIFO mode:0000 dev:293,0 ino:4630 uid:0 gid:0 size:0
O_RDWR
例15-10 启动和关闭dtpad进程。
(1)显示dtpad进程PID:
# pgrep dtpad
2921
(2)停止进程:
# pstop 2921
(3)重新启动进程:
# prun 2921
3.终止进程
当某个进程处于死循环,或者进程运行时间比较长的时候,管理员或用户就需要结束这些进程。一般而言,用户可以结束他自己的任何进程;超级用户可以结束除了PID为1、2、3和4的其他任何进程。结束进程需要小心谨慎,否则可能会导致系统的崩溃。
kill命令
使用kill命令可以终结进程,用法如下:
$ kill [signal-number] pid
其中,signal-number为信号,如果不用信号时,系统默认发送信号15(SIGKILL),可以终结进程;使用-9时可快速终结进程,建议在结束数据库或LDAP等进程时不要使用,因为这样可能会导致数据的丢失。
kill命令在进行进程间通信时使用的主要信号:
信 号--代 号--行 为--描 述
SIGHUP--1--退出--挂起
SIGINT--2--退出--中断
SIGQUIT--3--核心--退出
SIGILL--4--核心--非法指令
SIGTRAP--5--核心--追踪
SIGABRT--6--核心--中止
SIGEMT--7--核心--仿真陷阱
SIGFPE--8--核心--算术异常
SIGKILL--9--退出--已取消
SIGBUS--10--核心--总线错误
SIGSEGV--11--核心--段错误
SIGSYS--12--核心--异常系统调用
SIGPIPE--13--退出--断开通道
SIGALRM--14--退出--报警时钟
SIGTERM--15--退出--终止
pkill命令
使用pkill命令也可以终止进程,它搜索与命令行指定字符相匹配的进程,并给这些进程发信号。比如,希望取消进程名与“Java”有关的所有进程,可以使用下面的命令:
$pkill –9 Java
killall命令
killall命令用来取消系统中的所有进程。在系统运行级别为0时,由shutdown命令来调用killall命令。
4.进程管理
下面是一些在系统中可以设置的进程调度类。
公平共享调度类:Fair share (FSS)
固定调度类:Fixed (FX)
系统调度类:System (SYS)
交互调度类:Interactive (IA)
实时调度类:Real-time (RT)
分时调度类:Timesharing (TS)
用户的策略主要使用分时调度类进行进程管理,它的具体特性如下:
具有用户的优先权队列,即从-60到+60。
用户模式的优先权是可以从父进程继承的。
系统在分时派分参数表中查看用户的优先权,然后使用nice或priocntl命令确保将其加入到全局优先权中。
可以通过dispadmin命令来进行进程调度类的管理。
dispadmin命令选项列表
选 项--说 明
-l--列出系统具有的调度类
-g--显示所指定调度类(以-c选项指定)的调度表
-r--设定系统时间的分辨率(resolution)
-s--以文件取代-c来指定调度类
例15-11 显示系统的调度类。
# dispadmin -l
CONFIGURED CLASSES
=====================
SYS (System Class)
RT (Real Time)
TS (Time Sharing)
由这个指令的输出可以获知系统有哪些调度类,即使调度类名称被修改,也能由此知道。
在了解进程的调度级之后,我们介绍进程的优先权。优先权是在调度类框架下对进程的进一步的管理。
下面将介绍两个管理进程的优先权的命令:priocntl和nice。
priocntl命令
可以使用priocntl命令完成以下工作。
(1)显示进程调度类和优先权队列。
使用-l选项也可以显示进程的调度类信息:
# priocntl -l
CONFIGURED CLASSES
==================
SYS (System Class)
TS (Time Sharing)
Configured TS User Priority Range: -60 through 60
FX (Fixed priority)
Configured FX User Priority Range: 0 through 60
IA (Interactive)
Configured IA User Priority Range: -60 through 60
使用-ecl选项在PRI栏目下可以显示进程的全局优先级:
$ ps -ecl
F S UID PID PPID CLS PRI ADDR SZ WCHAN TTY TIME COMD
19 T 0 0 0 SYS 96 f00d05a8 0 ? 0:03 sched
8 S 0 1 0 TS 50 ff0f4678 185 ff0f4848 ? 36:51 init
19 S 0 2 0 SYS 98 ff0f4018 0 f00c645c ? 0:01 pageout
19 S 0 3 0 SYS 60 ff0f5998 0 f00d0c68 ? 241:01 fsflush
8 S 0 269 1 TS 58 ff0f5338 303 ff49837e ? 0:07 sac
8 S 0 204 1 TS 43 ff2f6008 50 ff2f606e console 0:02 sh
(2)指定进程的优先级。
可以为某个进程指定一个优先级,比如:
# priocntl -e -c TS -m 60 -p 60 find . -name core –print
这个命令就是给find进程指定的优先级为60。其他参数选项的意义是:
-e运行命令。
-c指定进程的调度类,TS为分时调度类的简写,其他调度类依次类推。
-m当使用-p选项时,-m选项为用户可以提高或降低的最大优先级的数量。
-p用户设定的优先级数。
(3)如何改变进程的调度类。
例15-12 改变uid为15249的用户所有进程的调度类。
# priocntl -s -c RT -i uid 15249
其中:
-s改变当前的优先级。
-c设定调度类,RT就是所设定的调度类。
-I指定用户或进程的ID。
(4)如何使用nice改变分时调度类进程的优先级。
Solaris 10支持nice命令是为了和以前版本的Solaris兼容。现在,在管理进程这一方面priocntl命令是最合适的。nice命令的优先级队列从0到39,0代表最高的优先级。对于分时调度类nice的默认优先级是20。
由于数值越大,nice用户的优先级越低。一般用户可以通过增大数值的办法来降低进程的优先级。可以使用下面的命令:
$ /usr/bin/nice -5 command-name
只有超级用户或等同的角色用户才能增加进程的优先级。增加进程的优先级,可使用下面的命令:
# /usr/bin/nice --10 command-name