您的位置:首页 > 运维架构 > Linux

Linux 性能指标及分析工具

2016-10-18 16:20 239 查看
一、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  b   swpd   free   buff  cache   si   so    bi    bo   in   csus
sy id wa st

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

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

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

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

2  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/中的文件,修改内核参数。

#cd /proc/sys/kernel/  

 

# ls /proc/sys/kernel/  

 

acct hotplug panic real-root-dev  

 

cad_pid modprobe panic_on_oops sem  

 

cap-bound msgmax pid_max shmall  

 

core_pattern msgmnb powersave-nap shmmax  

 

core_uses_pid msgmni print-fatal-signals shmmni  

 

ctrl-alt-del ngroups_max printk suid_dumpable  

 

domainname osrelease printk_ratelimit sysrq  

 

exec-shield ostype printk_ratelimit_burst tainted  

 

exec-shield-randomize overflowgid pty threads-max  

 

hostname overflowuid random version  

 

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

# sysctl kernel.threads-max  

 

kernel.threads-max = 8192 

 

# sysctl kernel.threads-max=10000 

 

kernel.threads-max = 10000 

 

Memory性能调整

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

页面频繁换进换出;

缺少非活动页。

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

Memory性能调整方法:

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

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

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

# ls /proc/sys/vm/  

 

block_dump laptop_mode nr_pdflush_threads  

 

dirty_background_ratio legacy_va_layout overcommit_memory  

 

dirty_expire_centisecs lower_zone_protection overcommit_ratio  

 

dirty_ratio max_map_count page-cluster  

 

dirty_writeback_centisecs min_free_kbytes swappiness  

 

hugetlb_shm_group nr_hugepages vfs_cache_pressure  

 

# sysctl vm.min_free_kbytes  

 

vm.min_free_kbytes = 1024 

 

# sysctl -w vm.min_free_kbytes=2508 

 

vm.min_free_kbytes = 2508 

 

# cat /etc/sysctl.conf  

 

…  

 

vm.min_free_kbytes=2058 

 

…  

 

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等文件系统;

# mkfs -t reiserfs -j /dev/sdc1  

 

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

tune2fs (ext2/ext3)  

 

reiserfstune (reiserfs)  

 

jfs_tune (jfs)  

 

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

# vi /etc/fstab  

 

…  

 

/dev/sdb1 /backup reiserfs acl, user_xattr, noatime, nodiratime 1 1  

 

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。增加网络缓冲区和包的队列。

# cat /proc/sys/net/ipv4/tcp_mem  

 

196608 262144 393216  

 

# cat /proc/sys/net/core/rmem_default  

 

135168  

 

# cat /proc/sys/net/core/rmem_max  

 

131071  

 

# cat /proc/sys/net/core/wmem_default  

 

135168  

 

# cat /proc/sys/net/core/wmem_max  

 

131071  

 

# cat /proc/sys/net/core/optmem_max  

 

20480  

 

# cat /proc/sys/net/core/netdev_max_backlog  

 

300  

 

# sysctl net.core.rmem_max  

 

net.core.rmem_max = 131071 

 

# sysctl -w net.core.rmem_max=135168 

 

net.core.rmem_max = 135168 

 

3。调整Webserving。

# sysctl net.ipv4.tcp_tw_reuse  

 

net.ipv4.tcp_tw_reuse = 0 

 

# sysctl -w net.ipv4.tcp_tw_reuse=1 

 

net.ipv4.tcp_tw_reuse = 1 

 

# sysctl net.ipv4.tcp_tw_recycle  

 

net.ipv4.tcp_tw_recycle = 0 

 

# sysctl -w net.ipv4.tcp_tw_recycle=1 

 

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

 它的含义是每隔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命令可以得到详细的解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: