性能调优
Posted 手上握着风筝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能调优相关的知识,希望对你有一定的参考价值。
本文章参考高俊峰写的《循序渐进Linux》。
Linux的性能优化与管理。使用Linux系统要达到的一个最终目的是让系统高效、稳定地运行,这就需要对Linux进行合理、专业的优化。
系统性能优化一般遵循的流程:首先,Linux运维人员查看系统的整体状态,然后主要从系统硬件、网络设备、操作系统配置、应用程序架构和程序代码五个方面进行综合判断。
性能调优的主要目的是使系统能够有效地利用各种资源,最大地发挥应用程序和系统之间的性能融合,使应用高效、稳定地运行。
参考标准:
影响性能因素 |
评判标准 |
||
好 |
坏 |
糟糕 |
|
CPU |
%user+%sys< 70% |
%user+%sys = 85% |
%user+%sys >= 90% |
内存 |
swap in(si) = 0 swap out(so) = 0 |
Per CPU whit 10 page/s |
更多swap in 和swap out |
磁盘 |
%iowait < 20% |
%iowait = 35% |
%iowait >= 50% |
1.CPU性能评估
CPU是影响Linux性能的主要因素之一。
1.1 vmstat命令
[[email protected] dev]# vmstat 2 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 546880 440 182640 0 0 13 1 18 29 0 0 100 0 0 0 0 0 546864 440 182672 0 0 0 0 71 114 0 0 100 0 0 1 0 0 546864 440 182672 0 0 0 0 74 112 0 0 100 0 0每个2秒统计一次,一共统计三次。
对上面每项的输出解释如下:
procs
r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。
b列表示在等待资源的进程数。比如正在等待I/O或者内存交换等。
memory
swpd列表示切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般就不用担心,它不会影响系统性能。
free列表示当前空闲的物理内存数量(以KB为单位)。
buff列表示缓冲区缓存的内存数量。一般对块设备的读写才需要缓冲。
cache列表示页面缓存的内存数量,一般作为文件系统的缓存,频繁访问的文件都会被缓存,如果cache值较大,说明缓存的文件较多,如果此时I/O中bi比较小,说明文件系统效率比较好。
swap
si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
一般情况下,si、so的值都为0。如果si、so的值长期不为0,则表示系统内存不足,需要增加系统内存。
io项显示磁盘读写状况
bi列表示从块设备读入数据的总量(即读磁盘)(每秒KB)。
bo列表示写入到块设备的数据总量(即写磁盘)(每秒KB)。
这里设置bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘I/O有问题,应该考虑提高磁盘的读写性能。
system显示采集间隔内发生的中断次数。
in列表示在某一时间间隔中观测到的每秒设备中断次数。
cs列表示每秒产生的上下文切换次数。
这两项越大,会看到由内核占用CPU的时间会越多。
cpu项显示了CPU的使用状态
us列显示了用户进程占用CPU的时间百分比。us的值比较高时,说明用户进程站用CPU的时间多,但是如果长期大于50%,就要考虑优化程序或算法
sy列表示了内核进程占用CPU的时间百分比。
根据经验,us+sy的参考值为80%,如果us+sy大于80%说明可能存在CPU资源不足。
id列显示了CPU处在空闲状态的时间百分比。
wa列显示了I/O等待所占用的CPU时间百分比。wa值越高,说明I/O等待越严重。根据经验,wa的参考值为20% 。
st列显示来自于一个虚拟机偷取的CPU时间的百分比。
综上所述,在对CPU的评估中,需要重点注意的是procs项下r列的值和cpu项下us、sy和id列的值。
1.2 sar命令
[[email protected] dev]# sar -u 3 5 Linux 3.10.0-229.el7.x86_64 (localhost.localdomain) 2016年04月04日 _x86_64_ (4 CPU) 23时55分50秒 CPU %user %nice %system %iowait %steal %idle 23时55分53秒 all 0.00 0.00 0.25 0.00 0.00 99.75 23时55分56秒 all 0.08 0.00 0.33 0.00 0.00 99.58 23时55分59秒 all 0.00 0.00 0.25 0.00 0.00 99.75 23时56分02秒 all 0.00 0.00 0.33 0.00 0.00 99.67 23时56分05秒 all 0.00 0.00 0.25 0.00 0.00 99.75 平均时间: all 0.02 0.00 0.28 0.00 0.00 99.70%user列显示了用户进程占用CPU的时间百分比。
%nice列显示了运行正常进程占用CPU的时间百分比。
%system列显示了系统进程占用CPU的时间百分比。
%iowait列显示了I/O等待所占用CPU的时间百分比。
%steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作。
%idle列显示了CPU处于空闲状态的时间百分比。
[[email protected] dev]# sar -P 0 3 5 Linux 3.10.0-229.el7.x86_64 (localhost.localdomain) 2016年04月05日 _x86_64_ (4 CPU) 00时02分33秒 CPU %user %nice %system %iowait %steal %idle 00时02分36秒 0 0.00 0.00 0.34 0.00 0.00 99.66 00时02分39秒 0 0.00 0.00 0.34 0.00 0.00 99.66 00时02分42秒 0 0.34 0.00 0.34 0.00 0.00 99.33 00时02分45秒 0 0.00 0.00 0.00 0.00 0.00 100.00 00时02分48秒 0 0.00 0.00 0.67 0.00 0.00 99.33 平均时间: 0 0.07 0.00 0.33 0.00 0.00 99.60针对特定CPU进行统计
1.3 iostat命令
只能显示系统所有CPU的平均信息。
[[email protected] dev]# iostat -c Linux 3.10.0-229.el7.x86_64 (localhost.localdomain) 2016年04月05日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.02 0.00 0.22 0.06 0.00 99.69
1.4 uptime命令
主要用来统计系统当前的运行状况。
[[email protected] dev]# uptime 00:06:18 up 7:49, 1 user, load average: 0.00, 0.01, 0.05输出信息分别为:系统现在的时间,系统从上次开机到现在运行了多长时间,系统目前有多少登录用户,系统在1分钟内、5分钟内、15分钟内的平均负载。本输出中系统有4个CPU,如果loadaverage的三个值长期大于4,就说明CPU很繁忙,负载很高,可能会会影响系统性能。
总结:如果判断系统CPU出现问题后,要结合top、ps等命令进一步检查是由哪些进程导致CPU负载过大的。引起CPU资源紧缺的原因可能是应用程序不合理造成的,也可能是硬件资源匮乏引起的。
2.内存性能评估
2.1 free命令
[[email protected] ~]# free -m total used free shared buffers cached Mem: 980 791 188 0 131 426 -/+ buffers/cache: 234 746 Swap: 1983 1 1982此系统共1GB内存,系统空闲内存还有188MB,缓冲区缓存站用了131MB,页面缓存占用了426MB,可以使用内存还有746MB,当然,这个746MB包含了缓冲区缓存和页面缓存的值。
这里有一个经验公式:当应用程序可用内存/系统物理内存>70%时,表示系统内存资源非常充足,不影响系统性能;当应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存;当20%<当应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
结合watch与free实现动态监控内存状况
watch -n 3 -d free
-n:每个3秒刷新一次
-d:高亮显示变动
2.2 vmstat命令
在vmstat中重点关注的是swpd、si和so行
2.3 sar -r命令
[[email protected] ~]# sar -r 2 3 Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 03/09/2016 _x86_64_ (4 CPU) 03:41:22 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 03:41:24 AM 193304 811044 80.75 134716 436428 307216 10.12 03:41:26 AM 193304 811044 80.75 134716 436428 307216 10.12 03:41:28 AM 193304 811044 80.75 134716 436428 307216 10.12 Average: 193304 811044 80.75 134716 436428 307216 10.12其中,kbmemfree表示空闲物理内存大小;kbmemused表示已使用的物理内存空间大小;%memused表示已使用内存占总内存大小的百分比;kbbuffers和kbcached分别表示缓冲区缓存和页面缓存的大小;kbcommit和%commit分别表示应用程序当前使用的内存大小和使用百分比。
总结:如果系统在内存方面出现瓶颈,很大的可能是应用程序本身的问题造成的。
3.磁盘I/O性能评估
3.1vmstat -d命令
[[email protected] ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec ram0 0 0 0 0 0 0 0 0 0 0 ram1 0 0 0 0 0 0 0 0 0 0 ram2 0 0 0 0 0 0 0 0 0 0 ram3 0 0 0 0 0 0 0 0 0 0 ram4 0 0 0 0 0 0 0 0 0 0 ram5 0 0 0 0 0 0 0 0 0 0 ram6 0 0 0 0 0 0 0 0 0 0 ram7 0 0 0 0 0 0 0 0 0 0 ram8 0 0 0 0 0 0 0 0 0 0 ram9 0 0 0 0 0 0 0 0 0 0 ram10 0 0 0 0 0 0 0 0 0 0 ram11 0 0 0 0 0 0 0 0 0 0 ram12 0 0 0 0 0 0 0 0 0 0 ram13 0 0 0 0 0 0 0 0 0 0 ram14 0 0 0 0 0 0 0 0 0 0 ram15 0 0 0 0 0 0 0 0 0 0 loop0 0 0 0 0 0 0 0 0 0 0 loop1 0 0 0 0 0 0 0 0 0 0 loop2 0 0 0 0 0 0 0 0 0 0 loop3 0 0 0 0 0 0 0 0 0 0 disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec loop4 0 0 0 0 0 0 0 0 0 0 loop5 0 0 0 0 0 0 0 0 0 0 loop6 0 0 0 0 0 0 0 0 0 0 loop7 0 0 0 0 0 0 0 0 0 0 sda 47434 7062 1662980 793513 79361 318548 3184260 5057612 0 1672 sr0 0 0 0 0 0 0 0 0 0 0 dm-0 52869 0 1650970 1031651 397746 0 3181968 74441845 0 1664 dm-1 401 0 3208 7184 271 0 2168 24520 0 5 dm-2 233 0 1858 6006 7 0 56 21 0 2
3.2 sar -d命令
[[email protected] ~]# sar -d 2 3 Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 03/09/2016 _x86_64_ (4 CPU) 03:51:59 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:52:01 AM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:01 AM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:01 AM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:01 AM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:01 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:52:03 AM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:03 AM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:03 AM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:03 AM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:03 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:52:05 AM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:05 AM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:05 AM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:52:05 AM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00DEV表示磁盘设备名称。
tps表示每秒到物理磁盘的传送术,也就是每秒的I/O流量。一个传送就是一个I/O请求,多个逻辑请求可以合并为一个物理I/O请求。
rd_sec/s表示每秒从设备读取的扇区数(1扇区=512字节)。
wr_sec/s表示每秒写入设备的扇区数目。
avgrq-sz表示平均每次设备I/O操作的数据大小(以扇区为单位)。类似超市排队中每人所买东西的多少。
avgqu-sz表示平均I/O队列长度。类似超市排队中单位时间内平均排队的人数。
await表示平均每次设备I/O操作的等待时间(ms)。类似排队中没人的等待时间。
svctm表示平均每次设备I/O操作的服务时间(ms)。类似超市排队中 收银员的收款速度。
%util表示一秒钟有百分之几的时间用于I/O操作。类似超市收银台前有人排队的时间比例。
经验:正常情况下,svctm应该是小于await值的,
svctm的大小和磁盘性能有关,CPU、内存的符合也会对svctm值造成影响,过多的请求也会间接导致svctm值得增加。
await值得大小一般取决于svctm的值和I/O队列长度以及I/O请求模式。如果svctm的值与awail很接近,表示几乎没有I/O等待,磁盘性能很好。如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标。如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷地在工作,该磁盘可能存在瓶颈。
3.3 iostat -d命令
[[email protected] ~]# iostat -d 2 3 Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 03/09/2016 _x86_64_ (4 CPU) Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.77 10.05 19.25 1663116 3185924 dm-0 2.72 9.97 19.23 1651122 3183632 dm-1 0.00 0.02 0.01 3208 2168 dm-2 0.00 0.01 0.00 1858 56 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.50 8.00 0.00 16 0 dm-0 0.00 0.00 0.00 0 0 dm-1 0.00 0.00 0.00 0 0 dm-2 0.00 0.00 0.00 0 0 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.00 0.00 0.00 0 0 dm-0 0.00 0.00 0.00 0 0 dm-1 0.00 0.00 0.00 0 0 dm-2 0.00 0.00 0.00 0 0其中,
Blk_read/s表示每秒读取的数据块数。
Blk_wrtn/s表示每秒写入的数据块数
Blk_read表示读取的所有块数
Blk_wrtn表示写入的所有块数
第一项是系统从启动以来统计时的所有传输信息,第二次输出的数据才代表在检测的时间段内系统的传输值。
如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序。
如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。
对每个磁盘的单独统计
[[email protected] ~]# iostat -x /dev/sda 2 3 Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 03/09/2016 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.44 0.01 0.46 0.18 0.00 98.92 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.04 1.92 0.29 0.48 10.02 19.19 38.18 0.04 46.14 13.21 1.01 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.12 0.00 0.00 99.88 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00其中,
rrqm/s表示每秒进行合并的读操作数目;
wrqm/s表示每秒进行合并的写操作数目;
r/s表示每秒完成读I/O设备的次数;
w/s表示每秒完成写I/O设备的次数;
rsec/s表示每秒读取的扇区数;
wsec/s表示每秒写入的扇区数;
总结:要解决I/O的瓶颈,关键是要提高I/O子系统的执行效率。首先,要从应用程序上对磁盘读写进行优化,能够放在内存中执行的操作,尽量不要放在磁盘中。其次,对磁盘存储方式进行合理规划,选择合适自己的RAID存取方式。最后,在系统级别上,可以现在合适自身应用的文件系统,必要时使用裸设备提高读写性能。
4.网络性能评估
4.1通过ping命令检测网络的连通性
如果发现网络反应缓慢,或者连接中断,可以通过ping来测试网络的连通情况。
[[email protected] ~]# ping 192.168.1.135 -c 4 PING 192.168.1.135 (192.168.1.135) 56(84) bytes of data. 64 bytes from 192.168.1.135: icmp_seq=1 ttl=64 time=0.714 ms 64 bytes from 192.168.1.135: icmp_seq=2 ttl=64 time=0.719 ms 64 bytes from 192.168.1.135: icmp_seq=3 ttl=64 time=0.934 ms 64 bytes from 192.168.1.135: icmp_seq=4 ttl=64 time=0.879 ms --- 192.168.1.135 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3046ms rtt min/avg/max/mdev = 0.714/0.811/0.934/0.101 ms其中,time值显示了两台主机之间的网络延时情况。如果此值很大,则表示网络的延时很大,单位为毫秒;
packet loss表示网络的丢包率,此值越小,表示网络的质量越高。
4.2通过netstat -i命令检测网络接口状况
[[email protected] ~]# netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 1016140 0 0 0 808198 0 0 0 BMRU lo 65536 0 282687 0 0 0 282687 0 0 0 LRU其中,
Iface表示网络设备的接口名称
MTU表示对打传输单元,单位为字节。
RX-OK/TX-OK表示已经准确无误地接收/发送了多少数据包。
RX-ERR/TX-ERR表示接收/发送数据包时产生了多少错误。
RX-DRP/TX-DRP表示接收/发送数据包时丢弃了多少数据包。
RX-OVR/TX-OVR表示由于误差而遗失了多少数据包。
Flg表示接口标记。
L表示该接口是个回环设备。
B表示设置了广播地址。
M表示接收所有数据包。
R表示接口正在运行。
U表示接口处于活动状态。
O表示在该接口上禁用arp。
P表示一个点到点的连接
4.3 通过netstat -r命令检测系统的路由表信息
[[email protected] ~]# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.1.0 * 255.255.255.0 U 0 0 0 eth0 link-local * 255.255.0.0 U 0 0 0 eth0 default 192.168.1.2 0.0.0.0 UG 0 0 0 eth0
4.4通过sar -n命令显示系统的网络运行状态
DEV显示网络接口信息,EDEV显示关于网络错误的统计信息,SOCK显示套接字信息,FULL显示所有
[[email protected] ~]# sar -n DEV 2 3 Linux 2.6.32-504.el6.x86_64 (localhost.localdomain) 03/09/2016 _x86_64_ (4 CPU) 04:50:04 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 04:50:06 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 04:50:06 AM eth0 0.50 1.01 0.03 0.04 0.00 0.00 0.00 04:50:06 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 04:50:08 AM lo 1.02 1.02 0.09 0.09 0.00 0.00 0.00 04:50:08 AM eth0 0.51 1.53 0.03 0.23 0.00 0.00 0.00 04:50:08 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 04:50:10 AM lo 0.51 0.51 0.04 0.04 0.00 0.00 0.00 04:50:10 AM eth0 0.51 1.02 0.03 0.21 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s Average: lo 0.51 0.51 0.04 0.04 0.00 0.00 0.00 Average: eth0 0.51 1.18 0.03 0.16 0.00 0.00 0.00其中,
IFACE表示网络接口设备。
rxpck/s表示每秒钟接收的数据包大小。
txpck/s表示每秒钟发送的数据包大小。
rxkB/s表示每秒钟接收的字节数。
txkB/s表示每秒钟发送的字节数。
rxcmp/s表示每秒钟接收的压缩数据包。
txcmp/s表示每秒钟发送的压缩数据包。
rxmcst/s表示每秒钟接收的多播数据包。
总结:解决问题的方法一般是增加网络带宽,或者优化网络部署环境。traceroute(用于跟踪数据包的传输路径)以及nslookup命令(用于判断DNS解析信息)。
例如,Linux系统下的一个网站系统,用户反映,网站访问速度很慢,有时无法访问。
针对这个问题,第一步做的是检测网络,可以通过ping命令检查网站的域名解析是否正常。同时,ping服务器地址的时延是否过大。通过这种方式,首先排除网络可能出现的问题。如果网络没有问题。
第二步对Linux系统的内存使用状况进行检查。因为网站响应速度慢,一般跟内存关联比较大,通过free -m、vmstat和sar -r等命令判断内存资源是否紧缺。如果内存资源不存在问题。
第三步检查系统CPU的负载状况,可以通过sar -u、vmstat、iostat -c、uptime及top等命令的输出综合判断CPU是否过载问题。如果CPU没问题。
第四步检查系统的磁盘I/O是否存在瓶颈,可以通过iostat -d、vmstat -d、sad -d等命令检查磁盘的读写性能。如果没有问题。
第五步检查程序本身是否存在问题。通过这样的思路。层层检测,步步排查,性能问题就“无处藏身”,查找出现性能问题的环节也就变得非常简单。
以上是关于性能调优的主要内容,如果未能解决你的问题,请参考以下文章