话说软件项目的一般流程是:设计、编码、调优、上线。调优过程中经常遇到系统性能不够的时候,但是话说回来性能不好也正常,如果随便写点代码性能就牛X的一塌糊涂,可能也就不需要那么多的所谓的Best Prticace的经验总结了。
最近看到一本书《DevOps故障排除》,书很薄,里面的内容可能在其他书中都有讲解,但是他总结的很好,可能对系统的发生故障后的排除流程做了一般总结,对于我来说,可能在调优阶段分析系统瓶颈的时候有很大帮助,特此记下学习笔记。
首先我们知道服务器的主要资源包括:
系统出了问题怎么办呢,我想重启可能会解决,但是这就可能失去了让你成为高手的机会。如果可以的话,登录系统上,应该有一些工具可以排查出到底是谁在搞飞机(为什么是应该,因为过去我也不了解,但是马上就会知道了)
通常第一条命令是uptime:
03:11:10 up 38 days, 6:26, 1 user, load average: 2.03, 20.17, 15.09
再看一个:
03:11:10 up 38 days, 6:26, 1 user, load average: 17.29, 0.12, 0.01
这取决于产生高负载的原因。明确负载是CPU密集型(等待CPU资源的进程)、RAM密集型(尤其是频繁使用的RAM被已入了交换区)还是IO密集型(抢夺磁盘或网络IO资源的进程)非常重要。
要排查高负载的问题,第一个工具是top。
top - 04:35:45 up 38 days, 7:50, 2 users, load average: 0.00, 0.00, 0.00
Cpu(s): 2.0%us, 0.2%sy, 0.0%ni, 97.6%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
症状:%us CPU高、IO %wa低。需要确定系统中哪一个进程占用了如此大量的CPU资源。
一般情况下,大部分高CPU负载的情况都是由CPU被一个、多个进程消耗殆尽。
top输出中以下两行提供了RAM的使用情况,如
Mem: 3849548k total, 3819152k used, 30396k free, 15144k buffers
Swap: 2097144k total, 1604548k used, 492596k free, 75248k cached
可以看出,系统内存真用尽了,因为系统只剩下30396KB空闲内存,文件缓存占用75248KB内存(本来这部分内存也是可以给其他进程用的,但是这里实在太小了)。而Swap已经用了1.6G了,因此系统的内存显然是不够用了。
这下内存真的存在问题了,那么如果确定哪些进程消耗了RAM。top默认按照CPU的使用率排序进程,所以需要将其改为按照RAM使用率来排序,保持top的打开状态,按下M键,这就会让所有进程按照RAM使用率排序。
当看到IO %wa很高的时候,首先需要检查机器时候使用大量的交换空间,因为磁盘操作速度远远低于RAM,所以当系统内存好近,开始使用交换空间的时候,系统的性能会收到严重影响。所以第一步要看内存是否耗尽,如果是,则先解决这个问题。如果还有大量RAM,则需要明确那个进程占用了大部分操作。
很难看明白哪个进程占用了大量的IO资源,高级命令登场:
* iostat(sysstat包中有这个命令)
Linux 2.6.32-431.el6.x86_64 (nj-figo-cui) 08/09/2015 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.11 0.01 0.00 99.63
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.30 12.25 16.48 9632378 12956192
dm-0 2.24 12.24 16.45 9622250 12933488
dm-1 0.00 0.00 0.00 2640 0
Blk_write: 表示向设备写入的数据总量。
当系统处于高IO负载状态的时候,可以观察哪个分区的负载最高,这样就缩小了范围。若是知道了某个分区IO高,那么接下来就可以看那些个进程的数据存储在这个分区(相信大数据量的进程毕竟是少数,这样一般就能找到目标进程。)
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
很有可能机器负载很高时,登录不上去了。因此可以通过工具记录全天的性能数据,那么若是有人抱怨中午的时候系统慢的时候,就可以上去查看日志,看看是什么原因引起的这个问题。
有两个工具可以用,atop和sysstat。
atop
sysstat(不是很熟悉,有空熟悉熟悉)
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
第一条命令会每10分钟执行一次;第二条命令会在每天23:53执行一次(生成的进程accounting的每日统计)。
ok,说了这么多,其实就是为了在系统性能遇到瓶颈的时候,帮助一些开发者定位一下系统瓶颈的来源,具体经验还得靠个人积累,如果对你有帮助,我就很有成就感!
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/figo_cui/article/details/47396795