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