Chinaunix
标题:
当系统变慢了之后
[打印本页]
作者:
yepeng_xj
时间:
2006-06-20 11:53
标题:
当系统变慢了之后
原文地址:
http://www-128.ibm.com/developerworks/aix/library/au-satslowsys.html
当系统变慢了之后
当你的UNIX系统运行的越来越慢的时候,就需要你尽快找出问题之所在。由于引起系统运行速度下降的原因千差万别,所以要想找出问提出在那里是十分困难的。引起系统变慢的原因
太多的进程
或许有时候仅仅是因为在同一时间里运行了太多的程序,或者是运行一些占用CPU的操作,又或者有失控的进程在蚕食你的系统资源。
内存不够使用
如果某个进程使用了过多的内存,将使你的系统不得不频繁的大量使用交换空间,这就意味着你的系统打部分时间是在交换内存而不是使用它。
硬件故障
硬件的故障也会引起系统变慢,比如网卡、硬盘或者内存的故障将是系统挂起以等待进一步的消息。选择连结的方式
如果你的机器运行的非常缓慢,那就要考虑使用什么样的方式去连结机器了。因为如果机器运行速度下降后你可能就没有办法使用telnet和ssh之类的远程连结机器了。因此在你之前还没有登陆机器的时候,通过机器控制台登陆计算机的成功机会就大一些。一旦登陆机器,你会发现你无法通过SHELL执行任何操作,这就表示系统的进程空间已满,这时重启机器可能是唯一可以使机器恢复正常的方法了。通过init或telinit调整系统运行级别以达到重启机器的目的,as there is only one process involved to force the reboot。
一旦系统恢复正常运行,你需要使用某些工具去监控系统的运行状态并记录下结果。如果系统运行速度再度下降,那时你就可以检查是什么原因导致系统运行变慢。使用uptime
如果你发觉你的系统运行变慢,首先应该使用的命令是uptime。uptime可以报告当前时间,系统自上次启动以来已运行的时间,以及目前的用户数,在结果中还包含三个数字分别表示在国去一分钟、过去五分钟以及过去15分钟的 load average。比如:
$uptime
18:28:54 up 10 days, 8:38, 2 users, load average: 2.24, 5.34, 3.42
在上面的例子中,机器在过去1分钟的load average大于2,在过去5分钟大于5,同时在过去15分钟大于3。
load average的定义是复杂的,同时收到那些正在运行中的进程的状态影响。通常来说,每个运行中的进程在等待CPU时或等待I/O时将使load average值加 1。
在单CPU的系统中,如果load average值超过1则表示CPU is under powered for the type of load you are supplying,但是因为UNIX的多CPU特质,通常如果load average值长时间的达到2时你就应该注意了。
在多CPU的系统中,尽管load average值被多个CPU分解,但是在判断机器是否超负荷时同样可以参考上面的原则。
我们还可以可以把load average值看作一个百分数,如果load average值是从一个单CPU系统中得到,就意味着如果机器比现在快百分之224则机器就可以快速完成现有任务。
在一个多CPU的系统中,你可以使用CPU的数量加1来得到最大load average值,比如一个4 CPU的系统的最大load average值为5.
系统在短时间里超过其最大load average值是很常见的。比如在编译程序或者运行一个I/O较多的任务时,系统的load average值会突然增长。这也就是为什么uptime的输出包含了1,5,15分钟的平均值,这有助与减少突发的load average值增大的影响。
如果load average值长时间的持续超高的话,就表示有问题需要进一步的检查,但是如果load average值很低但是系统运行依然很慢,则有可能是交换空间使用频繁。使用ruptime
如果你在管理一个大型网络系统,使用ruptime是一个简单的方法来监控在网络中所有机器的load average值。ruptime通过收集网络上的其他机器的数据并且保存在本地文件中。比如:
$ ruptime
bear up 10+09:13, 2 users, load 0.66, 0.68, 0.50
ultra3 up 6+01:16, 1 user, load 0.00, 0.00, 0.00
atuin down 4+00:52
最后一台机器在11分钟内没有报告任何数据,就当作它是关机了。
为了产生信息,网络中每一个机器都需要启动rwhod进程。这个进程广播本机的信息同时接受其他机器发来的信息。跟踪大进程
如果你觉的问题是由大进程或者过于繁忙的进程引起,那么你就需要检查用ps工具得到的对进程大小、内存使用、CPU使用的分析结果了。
在SVR4中可以使用如下命令:
$ ps -A -o pcpu,pmem,rss,vsz,comm
%CPU %MEM RSS VSZ COMMAND
0.2 0.0 0 0 fsflush
0.1 0.2 1464 8288 /usr/lib/ssh/sshd
0.1 0.1 1032 1320 ps
0.0 1.0 9536 47608 /usr/openwin/bin/Xsun
0.0 0.7 6312 10720 dtgreet
0.0 0.6 6136 9352 /usr/sfw/sbin/snmpd
0.0 0.4 3208 5720 /usr/lib/fm/fmd/fmd
0.0 0.3 2808 8512 /usr/lib/ssh/sshd
0.0 0.3 2800 8504 /usr/lib/ssh/sshd
0.0 0.3 2768 8512 /usr/lib/ssh/sshd
0.0 0.3 2368 4056 /usr/sbin/nscd
0.0 0.2 2096 9176 /usr/dt/bin/dtlogin
...
在BSD衍生系统中可以得到:
$ ps -A -o pcpu,pmem,rss,vsz,command|sort -n +3
%CPU %MEM RSS VSZ COMMAND
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 152 27236 nfsd-server
0.0 0.0 164 27236 nfsd-master
0.0 0.0 224 27240 /usr/sbin/update
0.0 0.3 4364 29196 /usr/sbin/securityd
0.0 0.2 2760 29288 jabberd -c /etc/jabber/jabber.xml -H
/private/var/jabber/ -U jabber
0.0 0.0 184 29300 nfsiod -n 4
0.0 0.2 3544 29712 /usr/sbin/configd
0.0 0.0 500 30628 /usr/sbin/sshd -i
0.0 0.0 260 30648 /usr/sbin/smbd -D
0.0 0.0 736 30648 /usr/sbin/smbd -D
0.0 0.1 1216 30700 /usr/sbin/sshd -i
...
0.0 0.1 2180 50664 imapd: narcissus.mcslp.pri [192.168.0.110]
mc user.mc
0.0 0.1 2184 50664 imapd: sulaco.mcslp.pri [192.168.0.101]
mc user.mc
0.0 0.1 2204 50720 imapd: narcissus.mcslp.pri [192.168.0.110]
buy user.buy
0.0 0.1 2264 50720 imapd: sulaco.mcslp.pri [192.168.0.101] buy
user.buy
0.0 0.1 2272 50984 imapd: kernel.mcslp.pri [192.168.0.106] slp
user.slp
0.0 1.2 18348 54368 servermgrd -x
0.0 0.2 3200 85920 /usr/sbin/named -f
0.0 1.1 16820 122240 /usr/libexec/mysqld --basedir=/usr
--datadir=/var/mysql --user=mysql --pid-file=/var/mysq
0.0 0.5 8572 158164 /usr/libexec/slapd -d 0 -h
ldap:///
ldapi://%2Fvar%2Frun%2Fldapi
0.0 0.0 204 289396 rpc.statd
对于上述两种情况CPU和内存的使用情况都显示在进程列表中,这样就可以清楚的看到系统目前的负荷了
's'或'stat'列显示了当前进程的状态。
在综合了进程状态以及CPU和内存的使用情况后,你就可以发现是否有进程失去了控制并过度使用系统资源。使用iostat
工具iostat提供关于终端、磁盘运行以及CPU使用情况。iostat可以使用两个参数,第一个表示生成报告的间隔时间单位是秒,第二个参数表示报告数量。比如每5秒报告一次统计数据:
$ iostat 5
tty dad1 sd1 nfs1 cpu
tin tout kps tps serv kps tps serv kps tps serv us sy wt id
0 7 440 39 14 0 0 3 0 0 0 5 18 0 77
0 39 2 0 0 0 0 0 0 0 0 0 0 0 100
0 13 4 3 0 0 0 0 0 0 0 0 0 0 100
0 13 0 0 0 0 0 0 0 0 0 0 0 0 100
通常来说,系统和系统之间显示的结果是有区别的,比如在BSD中显示是:
disk1 disk0 cpu
KB/t tps MB/s KB/t tps MB/s us sy id
167.67 0 0.02 20.70 5 0.09 6 3 90
0.00 0 0.00 0.00 0 0.00 15 3 82
0.00 0 0.00 0.00 0 0.00 16 2 82
0.00 0 0.00 14.33 24 0.33 18 4 79
0.00 0 0.00 2.83 1 0.00 23 4 73
首先来分析关于CPU的统计数据,us表示user,sy表示system,id表示idle比率,user 表示有多少时间
是用来处理用户进程的。system表示有多少时间用来处理系统进程(如果没有wait(wt)列情况时也包括在这里,以及系统有多少时间在等待IO)。idle表示有多少时间CPU是处于空闲状态。
关出磁盘的数据显示了单个物理驱动器的繁忙程度(包括NFS)。单位通常是MB每秒或者KB每秒。
如果结果显示很大,同时又有大量的wait/system CPU时间,有可能是因为磁盘速度太慢。你可以让应用使用不同的磁盘来提高性能。
如果磁盘数据与虚拟内存相同,则有可能是出现了内存泄漏而大量使用交换空间。使用vmstat
vmstat工具可以用来监控虚拟内存的使用情况。它可以代一个参数来表示报告间隔时间单位是秒。
$ vmstat 5
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr dd s1 -- in sy
cs us sy id
0 0 0 2820888 809552 94 525 121 69 50 0 26 16 0 0 297 1342
272 9 4 87
0 0 0 2824752 778872 2 7 0 0 0 0 0 0 0 0 229 34
109 0 1 99
0 0 0 2824752 778872 0 0 0 0 0 0 0 2 0 0 233 28
116 0 0 100
0 0 0 2824752 778872 0 0 0 0 0 0 0 0 0 0 228 26
110 0 0 100
0 0 0 2824752 778872 0 0 0 0 0 0 0 0 0 0 229 28
111 0 0 100vmstat工具可以报告线程或进程的信息,内存和交换空间的使用,页的换入和换出,磁盘IO,页错误以及CPU的数据
在CPU/线程列显示了在运行队列中的线程或进程(r),被阻塞进程也就是等待IO资源的进程(b),以及那些在交换空间上的(w)。如果阻塞进程列的值很高就表示磁盘速度缓慢。如果交换列的值很高就表示有太多的内存被使用以至于进程被不停的换入和换出。换入和换出操作是很影响系统性能的。
内存部分显示了当前可用的交换空间以及空闲的空间(是可以用来交换的页数)The memory shows the amount of swap currently available and the size of the free list (the number of pages that could be swapped if the RAM were requested),如果swap的值较低说明交换空间即将用完,只要你用足够的内存来运行应用这可能并不是什么问题。如果空闲值较低说明内存使用过多,如果继续运行新的应用将会触发交换空间。
报告的页部分(page columns)显示了被换入交换空间和被换出交换空间的页数。需要关注的列的是pi/po(page in /page out),这显示了有多少页被换入和换出。如果这一列的值很高显示了内存泄漏。如果扫描率(scan rate,the sr column)就表示内存可能是系统性能的瓶颈。使用top
使用top工具是一个简便的方式来监控系统当前的进程、负载以及内存的使用情况。top工具有很多版本,提供的信息包含了uptime、swap space以及ps工具所系统信息,下面是在Solaris上运行3.5.1版本的top的结果,
last pid: 9385; load averages: 7.14, 2.98, 1.21
61 processes: 55 sleeping, 4 running, 1 zombie, 1 on cpu
CPU states: 0.0% idle, 93.8% user, 6.2% kernel, 0.0% iowait,
0.0% swap
Memory: 1024M real, 712M free, 125M swap in use, 2705M swap free PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
9313 root 1 22 0 35M 34M run 0:03 8.87% cc1
9349 root 1 22 0 21M 20M run 0:01 5.47% cc1
9385 root 1 39 0 4320K 3904K run 0:00 0.38% as
9384 root 1 29 0 3888K 3424K run 0:00 0.30% as
9145 root 1 59 0 3736K 2144K cpu 0:00 0.11% top
9180 root 1 59 0 1808K 1472K sleep 0:00 0.10% make
486 root 1 59 0 46M 9536K sleep 0:00 0.03% Xsun
548 root 1 59 0 10M 6360K sleep 0:00 0.03% dtgreet
553 mc 1 49 0 8288K 1472K sleep 0:01 0.02% sshd
9345 root 1 49 0 1328K 928K sleep 0:00 0.01% gcc
9348 root 1 59 0 1328K 928K sleep 0:00 0.01% gcc
9325 root 1 49 0 1328K 928K sleep 0:00 0.01% gcc
599 mc 1 59 0 8288K 1488K sleep 0:00 0.00% sshd
9312 root 1 59 0 1328K 928K sleep 0:00 0.00% gcc
9 root 16 59 0 9464K 2016K sleep 0:06 0.00%
svc.configdtop可以显示每个CPU的使用情况,比如在上面的例子中你可以看出当前正在编译一些程序以及CPU使用的情况。
另外你还应该关注进程的情况,在比较load average值和CPU情况后过多的运行进程就表示系统压力较重。
top工具本身就是非常占用CPU的,所以最好通过-d或-s选项(根据系统而定,单位秒)设定一个较大的报告间隔连续使用,以防止对系统性能产生影响。使用SAR
在某些情况下你可能无法实时的监控系统状态,这时你就可以使用SAR系统状态报告工具(system activity reporter tool),它可以按事先设定的时间间隔将系统信息记录在一个全局文件中,这样就可以在出现问题后帮助查找原因。
由于SAR可以在后台连续记录系统信息,这可能有助于发现问题所在,每天使用一个文件记录在事先指定的间隔下记录系统信息,本月记录的信息将覆盖上月的信息。一般信息文件被保存在/var/log/sa/saDD 或者/usr/adm/sa/saDD,DD表示当月某一天。使SAR生效的方式根据系统不同而不同,一般来说你可以通过增加cron任务来自动运行收集脚本(sa1),另一个脚本sa2可以每天产生一个供你分析的报告,例如在Solaris系统crontab中添加了如下周期任务:
0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A在系统信息被搜集了之后,你就可以通过sar工具提取信息了。使用-A选项可以得到目前所有的信息,例如:
11:49:38 %usr %sys %wio %idle
13:20:00 1 1 0 99
13:40:01 19 5 0 76
14:00:00 0 0 0 100
14:20:00 0 0 0 100
14:40:01 0 0 0 100
15:00:00 0 0 0 100
15:20:00 0 0 0 100Average 3 1 0 9611:49:38 device %busy avque r+w/s blks/s avwait avserv...
Average dad1 1 0.3 5 365 47.3 4.5
dad1,a 0 0.0 0 4 15.4 8.6
dad1,b 0 0.0 0 0 0.0 13.8
dad1,c 0 0.0 0 0 0.0 0.0
dad1,d 1 0.2 3 143 53.0 3.9
dad1,e 0 0.0 0 39 117.3 5.9
dad1,h 0 0.0 1 178 29.0 4.6
nfs1 0 0.0 0 0 0.0 0.0
nfs2 0 0.0 0 31 0.5 14.5
sd1 0 0.0 0 0 0.0 3.311:49:38 runq-sz %runocc swpq-sz %swpocc
13:20:00 2.0 2 0.0 0
13:40:01 5.3 15 0.0 0
14:00:00 0.0 0 0.0 0
14:20:00 0.0 0 0.0 0
14:40:01 1.5 0 0.0 0
15:00:00 0.0 0 0.0 0
15:20:00 0.0 0 0.0 0Average 5.0 2 0.0 011:49:38 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
13:20:00 0 11 97 0 1 89 0 0
13:40:01 0 803 100 4 381 99 0 0
14:00:00 0 0 100 0 0 39 0 0
14:20:00 0 0 100 0 0 56 0 0
14:40:01 0 0 100 0 0 61 0 0
15:00:00 0 0 100 0 0 48 0 0
15:20:00 0 0 100 0 0 32 0 0Average 0 120 100 1 56 99 0 0
11:49:38 swpin/s bswin/s swpot/s bswot/s pswch/s
13:20:00 0.00 0.0 0.00 0.0 305
13:40:01 0.00 0.0 0.00 0.0 223
14:00:00 0.00 0.0 0.00 0.0 111
14:20:00 0.00 0.0 0.00 0.0 112
14:40:01 0.00 0.0 0.00 0.0 112
15:00:00 0.00 0.0 0.00 0.0 114
15:20:00 0.00 0.0 0.00 0.0 114Average 0.00 0.0 0.00 0.0 15211:49:38 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s
13:20:00 526 39 26 0.64 0.59 38118 25779
13:40:01 2288 803 320 9.31 6.53 773352 1558934
14:00:00 22 2 2 0.01 0.01 342 186
14:20:00 20 2 2 0.00 0.00 150 128
14:40:01 20 2 2 0.01 0.00 153 128
15:00:00 26 3 3 0.01 0.02 326 167
15:20:00 29 3 3 0.02 0.03 641 272Average 416 125 52 1.46 1.04 118615 23279111:49:38 iget/s namei/s dirbk/s
13:20:00 2 31 3
13:40:01 29 385 25
14:00:00 0 1 0
14:20:00 0 0 0
14:40:01 0 0 0
15:00:00 0 1 0
15:20:00 0 2 0Average 5 61 411:49:38 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s
13:20:00 0 0 39 0 0 0
13:40:01 1 0 397 0 0 0
14:00:00 0 0 9 0 0 0
14:20:00 0 0 0 0 0 0
14:40:01 0 0 0 0 0 0
15:00:00 0 0 16 0 0 0
15:20:00 0 0 38 0 0 0Average 0 0 72 0 0 011:49:38 proc-sz ov inod-sz ov file-sz ov lock-sz
13:20:00 53/16154 0 1732/69661 0 358/358 0 0/0
13:40:01 54/16154 0 15118/69661 0 358/358 0 0/0
14:00:00 57/16154 0 15120/69661 0 359/359 0 0/0
14:20:00 57/16154 0 15120/69661 0 359/359 0 0/0
14:40:01 57/16154 0 15120/69661 0 359/359 0 0/0
15:00:00 57/16154 0 15121/69661 0 359/359 0 0/0
15:20:00 57/16154 0 15127/69661 0 359/359 0 0/0
11:49:38 msg/s sema/s
13:20:00 0.00 0.00
13:40:01 0.00 0.00
14:00:00 0.00 0.00
14:20:00 0.00 0.00
14:40:01 0.00 0.00
15:00:00 0.00 0.00
15:20:00 0.00 0.00Average 0.00 0.0011:49:38 atch/s pgin/s ppgin/s pflt/s vflt/s slock/s
13:20:00 13.39 3.67 5.05 41.14 77.09 0.00
13:40:01 188.44 9.91 25.61 373.73 1086.42 0.00
14:00:00 0.30 0.05 0.06 0.61 1.59 0.00
14:20:00 0.16 0.00 0.00 0.34 0.76 0.00
14:40:01 0.20 0.00 0.00 0.48 1.01 0.00
15:00:00 0.72 0.01 0.01 0.98 2.37 0.00
15:20:00 0.89 0.02 0.02 1.43 3.47 0.00Average 29.66 1.90 4.38 60.43 170.40 0.0011:49:38 pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
13:20:00 0.03 0.06 0.06 0.00 0.00
13:40:01 6.41 19.18 13.84 0.00 0.00
14:00:00 0.00 0.00 0.00 0.00 0.00
14:20:00 0.00 0.00 0.00 0.00 0.00
14:40:01 0.00 0.00 0.00 0.00 0.00
15:00:00 0.00 0.00 0.00 0.00 0.00
15:20:00 0.00 0.00 0.00 0.00 0.00Average 0.95 2.83 2.05 0.00 0.0011:49:38 freemem freeswap
13:20:00 109186 5736615
13:40:01 95816 5614822
14:00:00 97408 5649849
14:20:00 97311 5647409
14:40:01 97418 5653711
15:00:00 97338 5648982
15:20:00 97333 5648993Average 98516 565478411:49:38 sml_mem alloc fail lg_mem alloc fail ovsz_alloc fail
13:20:00 4178176 3572465 0 38477824 32137880 0 14663680 0
13:40:01 16572672 10204085 0 99106816 80782488 0 15310848
0
14:00:00 16589056 10261693 0 99106816 80797968 0 15343616
0
14:20:00 16589056 10259613 0 99106816 80736600 0 15343616
0
14:40:01 16589056 10260061 0 99106816 80820088 0 15343616
0
15:00:00 16589056 10267477 0 99106816 80902432 0 15343616
0
15:20:00 16589056 10274757 0 99106816 80864920 0 15343616
0Average 14813733 9300022 0 90445528 73863192 0 15241801
0上面的信息是被缩减了的,比如不是所有的磁盘状态都被显示出来。小结
尽管有时UNIX系统速度下降和你收集的信息并没有直接的关系,但是在寻找原因的过程中还是应该收集到尽可能多的信息。不管你是通过ps、uptime或是SAR以及top,有了这些信息你就可以知道系统运行速度下降是否是由于系统超负荷(CPU超负荷),或是由于内存不足(大量的页交换),或是由于进程失控(单个进程占用很高的CPU时间)
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u/20902/showart_130268.html
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2