Linux 性能指标及分析工具

来源:互联网 发布:索引超出了数组界限 编辑:程序博客网 时间:2024/06/04 19:05

一、CPU

1、良好状态指标

  • CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%
  • 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的。
  • 可运行队列:每个处理器的可运行队列<=3个线程

2、监控工具

  • vmstat

$ vmstat 1

procs -----------memory---------- ---swap-------io---- --system-- -----cpu------

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

14  0    140 2904316 341912 3952308  0    0     0   4601106 9593 36 64  1  0  0

17  0    140 2903492 341912 3951780  0    0     0     0 1037 9614 35 65  1  0  0

20  0    140 2902016 341912 3952000  0    0     0     0 1046 9739 35 64  1  0  0

17  0    140 2903904 341912 3951888  0    0     0    76 1044 9879 37 63  0  0  0

16  0    140 2904580 341912 3952108  0    0     0     0 1055 9808 34 65  1  0  0

重要参数:

r,run queue,可运行队列的线程数,这些线程都是可运行状态,只不过CPU暂时不可用;

b,被blocked的进程数,正在等待IO请求;

in,interrupts,被处理过的中断数

cs,context switch,系统上正在做上下文切换的数目

us,用户占用CPU的百分比

sys,内核和中断占用CPU的百分比

id,CPU完全空闲的百分比

上例可得:

sy高us低,以及高频度的上下文切换(cs),说明应用程序进行了大量的系统调用;

这台4核机器的r应该在12个以内,现在r在14个线程以上,此时CPU负荷很重。

  • 查看某个进程占用的CPU资源

$  while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'db_server_login'; sleep 1; done

  PID  NIPRI %CPU PSR COMMAND

28577   0  23 0.0   0 db_server_login

28578   0  23 0.0   3 db_server_login

28579   0  23 0.0   2 db_server_login

28581   0  23 0.0   2 db_server_login

28582   0  23 0.0   3 db_server_login

28659   0  23 0.0   0 db_server_login

…… 

二、Memory

1、良好状态指标

  • swap in (si) == 0,swap out (so) == 0
  • 应用程序可用内存/系统物理内存 <= 70%

2、监控工具

  • vmstat

$ vmstat 1

procs -----------memory---------- ---swap-------io---- --system-- -----cpu------

r    swpd   free   buff  cache   si   so    bi    bo   in   csus sy id wa st

 3 252696   2432    268   7148 3604 2368  3608  2372  288  288  0  0 21 78  1

 2 253484   2216    228   7104 5368 2976  5372  3036  930  519  0  0  0 100  0

 1 259252   2616    128   6148 19784 18712 19784 18712 3821 1853  0  1  3 95  1

 2 260008   2188    144   6824 11824 2584 12664  2584 1347 1174 14  0  0 86  0

 1 262140   2964    128   5852 24912 17304 24952 17304 4737 2341 86 10  0  0  4

重要参数

swpd,已使用的 SWAP 空间大小,KB 为单位;

free,可用的物理内存大小,KB 为单位;

buff,物理内存用来缓存读写操作的buffer大小,KB 为单位;

cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;

si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;

so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位。

上例可得:

物理可用内存 free 基本没什么显著变化,swapd逐步增加,说明最小可用的内存始终保持在 256MB(物理内存大小) * 10% = 2.56MB 左右,当脏页达到10%的时候就开始大量使用swap。

  • free

$ free -m

total used free shared buffers cached

Mem: 8111 7185 926 0 243 6299

-/+ buffers/cache: 643 7468

Swap: 8189 0 8189

 

三、磁盘IO

1、良好状态指标

  • iowait % < 20%

提高命中率的一个简单方式就是增大文件缓存区面积,缓存区越大预存的页面就越多,命中率也越高。

Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。

2、监控工具

  • 查看物理内存和文件缓存情况

$ cat /proc/meminfo

MemTotal:      8182776 kB

MemFree:       3053808 kB

Buffers:        342704 kB

Cached:        3972748 kB

这台服务器总共有 8GB 物理内存(MemTotal),3GB 左右可用内存(MemFree),343MB左右用来做磁盘缓存(Buffers),4GB左右用来做文件缓存区(Cached)。

  • sar

$ sar -d 2 3

Linux 2.6.9-42.ELsmp (webserver) 11/30/2008_i686_ (8 CPU)

11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-szavgqu-sz await svctm %util

11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.000.00 0.00

11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-szavgqu-sz await svctm %util

11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.000.00 0.00 0.00

11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-szavgqu-sz await svctm %util

11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.000.50 0.25 0.05

Average: DEV tpsrd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.330.17 0.02

重要参数:

await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。

svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。

%util表示一秒中有百分之几的时间用于I/O操作。

如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。

如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。

 

四、Network IO

对于UDP

1、良好状态指标

接收、发送缓冲区不长时间有等待处理的网络包

2、监控工具

  • netstat

对于UDP服务,查看所有监听的UDP端口的网络情况

$ watch netstat -lunp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

udp        0      0 0.0.0.0:64000           0.0.0.0:*                           -

udp        0      0 0.0.0.0:38400           0.0.0.0:*                           -

udp        0      0 0.0.0.0:38272           0.0.0.0:*                           -

udp        0      0 0.0.0.0:36992           0.0.0.0:*                           -

udp        0      0 0.0.0.0:17921           0.0.0.0:*                           -

udp        0      0 0.0.0.0:11777           0.0.0.0:*                           -

udp        0      0 0.0.0.0:14721           0.0.0.0:*                           -

udp        0      0 0.0.0.0:36225           0.0.0.0:*                           -

RecvQ、SendQ为0,或者不长时间有数值是比较正常的。

 

对于UDP服务,查看丢包情况(网卡收到了,但是应用层没有处理过来造成的丢包)

$ watch netstat -su

Udp:

    278073881 packetsreceived

    4083356897 packetsto unknown port received.

    2474435364 packet receive errors

    1079038030 packetssent

packet receive errors 这一项数值增长了,则表明在丢包

 

对于TCP(来自davidshan单卫的经验,thx~~

1、良好状态指标

对于TCP而言,不会出现因为缓存不足而存在丢包的事,因为网络等其他原因,导致丢了包,协议层也会通过重传机制来保证丢的包到达对方。

所以,tcp而言更多的专注重传率

2、监控工具

# cat /proc/net/snmp | grep Tcp:

Tcp: RtoAlgorithm RtoMin RtoMaxMaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegsOutSegs RetransSegs InErrs OutRsts

Tcp: 1 200 120000 -1 78447 413 50234 221 35984652 5653408 156800 0 849

重传率 = RetransSegs / OutSegs

至于这个值在多少范围内,算ok的,得看具体的业务了。

业务侧更关注的是响应时间。

 

 

性能分析工具汇总

CPU性能分析工具:

vmstat

ps

sar

time

strace

pstree

top

Memory性能分析工具:

vmstat

strace

top

ipcs

ipcrm

cat /proc/meminfo

cat /proc/slabinfo

cat /proc//maps

I/O性能分析工具:

vmstat

ipstat

repquota

quotacheck

Network性能分析工具:

ifconfig

ethereal

tethereal

iptraf

iwconfig

nfsstat

mrtg

ntop

netstat

cat /proc/sys/net

Linux 性能调优工具

当通过上述工具及命令,我们发现了应用的性能瓶颈以后,我们可以通过以下工具或者命令来进行性能的调整。

CPU性能调优工具:

nice / renic

sysctl

Memory性能调优工具:

swapon

ulimit

sysctl

I/O性能调优工具:

edquota

quoton

sysctl

boot line:

elevator=

Network性能调优工具:

ifconfig

iwconfig

sysctl

CPU性能调整

当一个系统的CPU空闲时间或者等待时间小于5%时,我们就可以认为系统的CPU资源耗尽,我们应该对CPU进行性能调整。

CPU性能调整方法:

编辑/proc/sys/kernel/中的文件,修改内核参数。

  1. #cd /proc/sys/kernel/  
  2.  
  3. ls /proc/sys/kernel/  
  4.  
  5. acct hotplug panic real-root-dev  
  6.  
  7. cad_pid modprobe panic_on_oops sem  
  8.  
  9. cap-bound msgmax pid_max shmall  
  10.  
  11. core_pattern msgmnb powersave-nap shmmax  
  12.  
  13. core_uses_pid msgmni print-fatal-signals shmmni  
  14.  
  15. ctrl-alt-del ngroups_max printk suid_dumpable  
  16.  
  17. domainname osrelease printk_ratelimit sysrq  
  18.  
  19. exec-shield ostype printk_ratelimit_burst tainted  
  20.  
  21. exec-shield-randomize overflowgid pty threads-max  
  22.  
  23. hostname overflowuid random version  
  24.  

一般可能需要编辑的是pid_max和threads-max,如下:

  1. sysctl kernel.threads-max  
  2.  
  3. kernel.threads-max 8192 
  4.  
  5. sysctl kernel.threads-max=10000 
  6.  
  7. kernel.threads-max 10000 
  8.  

Memory性能调整

当一个应用系统的内存资源出现下面的情况时,我们认为需要进行Memory性能调整:

页面频繁换进换出;

缺少非活动页。

例如在使用vmstat命令时发现,memory的cache使用率非常低,而swap的si或者so则有比较高的数据值时,应该警惕内存的性能问题。

Memory性能调整方法:

1。关闭非核心的服务进程。

相关的方法请见CPU性能调整部分。

2。修改/proc/sys/vm/下的系统参数。

  1. ls /proc/sys/vm/  
  2.  
  3. block_dump laptop_mode nr_pdflush_threads  
  4.  
  5. dirty_background_ratio legacy_va_layout overcommit_memory  
  6.  
  7. dirty_expire_centisecs lower_zone_protection overcommit_ratio  
  8.  
  9. dirty_ratio max_map_count page-cluster  
  10.  
  11. dirty_writeback_centisecs min_free_kbytes swappiness  
  12.  
  13. hugetlb_shm_group nr_hugepages vfs_cache_pressure  
  14.  
  15. sysctl vm.min_free_kbytes  
  16.  
  17. vm.min_free_kbytes 1024 
  18.  
  19. sysctl -w vm.min_free_kbytes=2508 
  20.  
  21. vm.min_free_kbytes 2508 
  22.  
  23. cat /etc/sysctl.conf  
  24.  
  25. …  
  26.  
  27. vm.min_free_kbytes=2058 
  28.  
  29. …  
  30.  

3。配置系统的swap交换分区等于或者2倍于物理内存。

# free

total used free shared buffers cached

Mem: 987656 970240 17416 0 63324 742400

-/+ buffers/cache: 164516 823140

Swap: 1998840 150272 1848568

I/O性能调整

系统出现以下情况时,我们认为该系统存在I/O性能问题:

系统等待I/O的时间超过50%;

一个设备的平均队列长度大于5。

我们可以通过诸如vmstat等命令,查看CPU的wa等待时间,以得到系统是否存在I/O性能问题的准确信息。

I/O性能调整方法:

1。修改I/O调度算法。

Linux已知的I/O调试算法有4种:

deadline - Deadline I/O scheduler

as - Anticipatory I/O scheduler

cfq - Complete Fair Queuing scheduler

noop - Noop I/O scheduler

可以编辑/etc/yaboot.conf文件修改参数elevator得到。

# vi /etc/yaboot.conf

image=/vmlinuz-2.6.9-11.EL

label=linux

read-only

initrd=/initrd-2.6.9-11.EL.img

root=/dev/VolGroup00/LogVol00

append="elevator=cfq rhgb quiet"

2。文件系统调整。

对于文件系统的调整,有几个公认的准则:

将I/O负载相对平均的分配到所有可用的磁盘上;

选择合适的文件系统,Linux内核支持reiserfs、ext2、ext3、jfs、xfs等文件系统;

  1. mkfs -t reiserfs -j /dev/sdc1  
  2.  

文件系统即使在建立后,本身也可以通过命令调优;

  1. tune2fs (ext2/ext3)  
  2.  
  3. reiserfstune (reiserfs)  
  4.  
  5. jfs_tune (jfs)  
  6.  

3。文件系统Mount时可加入选项noatime、nodiratime。

  1. vi /etc/fstab  
  2.  
  3. …  
  4.  
  5. /dev/sdb1 /backup reiserfs acl, user_xattr, noatime, nodiratime 1  
  6.  

4。调整块设备的READAHEAD,调大RA值。

[root@overflowuid ~]# blockdev --report

RO RA SSZ BSZ StartSec Size Device

rw 256 512 4096 0 71096640 /dev/sdb

rw 256 512 4096 32 71094240 /dev/sdb1

[root@overflowuid ~]# blockdev --setra 2048 /dev/sdb1

[root@overflowuid ~]# blockdev --report

RO RA SSZ BSZ StartSec Size Device

rw 2048 512 4096 0 71096640 /dev/sdb

rw 2048 512 4096 32 71094240 /dev/sdb1

Network性能调整

一个应用系统出现如下情况时,我们认为该系统存在网络性能问题:

网络接口的吞吐量小于期望值;

出现大量的丢包现象;

出现大量的冲突现象。

Network性能调整方法:

1。调整网卡的参数。

# ethtool eth0

Settings for eth0:

Supported ports: [ TP ]

Supported link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

1000baseT/Full

Supports auto-negotiation: Yes

Advertised link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

1000baseT/Full

Advertised auto-negotiation: Yes

Speed: 100Mb/s

Duplex: Half

Port: Twisted Pair

PHYAD: 0

Transceiver: internal

Auto-negotiation: on

Supports Wake-on: d

Wake-on: d

Current message level: 0x00000007 (7)

Link detected: yes

#ethtool -s eth0 duplex full

#ifconfig eth0 mtu 9000 up

2。增加网络缓冲区和包的队列。

  1. cat /proc/sys/net/ipv4/tcp_mem  
  2.  
  3. 196608 262144 393216  
  4.  
  5. cat /proc/sys/net/core/rmem_default  
  6.  
  7. 135168  
  8.  
  9. cat /proc/sys/net/core/rmem_max  
  10.  
  11. 131071  
  12.  
  13. cat /proc/sys/net/core/wmem_default  
  14.  
  15. 135168  
  16.  
  17. cat /proc/sys/net/core/wmem_max  
  18.  
  19. 131071  
  20.  
  21. cat /proc/sys/net/core/optmem_max  
  22.  
  23. 20480  
  24.  
  25. cat /proc/sys/net/core/netdev_max_backlog  
  26.  
  27. 300  
  28.  
  29. sysctl net.core.rmem_max  
  30.  
  31. net.core.rmem_max 131071 
  32.  
  33. sysctl -w net.core.rmem_max=135168 
  34.  
  35. net.core.rmem_max 135168 
  36.  

3。调整Webserving。

  1. sysctl net.ipv4.tcp_tw_reuse  
  2.  
  3. net.ipv4.tcp_tw_reuse 0 
  4.  
  5. sysctl -w net.ipv4.tcp_tw_reuse=1 
  6.  
  7. net.ipv4.tcp_tw_reuse 1 
  8.  
  9. sysctl net.ipv4.tcp_tw_recycle  
  10.  
  11. net.ipv4.tcp_tw_recycle 0 
  12.  
  13. sysctl -w net.ipv4.tcp_tw_recycle=1 
  14.  
  15. net.ipv4.tcp_tw_recycle 1 

 使用sar进行综合分析

选项功能-A汇总所有的报告-a报告文件读写使用情况-B报告附加的缓存的使用情况-b报告缓存的使用情况-c报告系统调用的使用情况-d报告磁盘的使用情况-g报告串口的使用情况-h报告关于buffer使用的统计数据-m 报告IPC消息队列和信号量的使用情况-n报告命名cache的使用情况-p报告调页活动的使用情况-q报告运行队列和交换队列的平均长度-R报告进程的活动情况-r报告没有使用的内存页面和硬盘块-u报告CPU的利用率-v报告进程、i节点、文件和锁表状态-w报告系统交换活动状况

                                                表1: sar参数说明

  sar是System Activity Reporter(系统活动情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

  sar的语法如下: 

    sar [-option] [-o file] t [n]

 它的含义是每隔t秒取样一次,共取样n次。其中-o file表示取样结果将以二进制形式存入文件file中。

  另一种语法如下: 
sar [-option] [-s time] [-e time] [-i sec] [-f file]
含义是表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件/var/adm/sa/sadd取数据,其中dd表示当前天。另外,-s time表示起始时间;-e time表示停止时间;-i sec表示取样的时间间隔,如果不指定则表示取文件中所有的数据。对于具体的选项参见表1。

  一般它与-q和-u联合使用,以便对每个CPU的使用情况进行分析,比如运行如下命令:

    sar -q -u 5 1

将输出如下: 

    Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日

   09时46分16
? CPU %user %nice %system %idle
   09时46分21
? all 0.20 0.00 0.00 99.80

   09时46分16
? runq-sz plist-sz ldavg-1 ldavg-5
   09时46分21
? 0 91 0.00 0.00

   Average: CPU
 %user %nice %system %idle
   Average: all
 0.20 0.00 0.00 99.80

   Average: runq
-sz plist-sz ldavg-1 ldavg-5
   Average:
 0 91 0.00 0.00

由于sar命令太复杂,只有通过熟练使用才能了解每个选项的含义,对于sar输出中每个字段的含义运行man sar命令可以得到详细的解释。


0 0