首页 > 代码库 > 利用sar工具确定系统性能瓶颈-超详细版

利用sar工具确定系统性能瓶颈-超详细版


安装

sar是查看操作系统报告指标的各种工具(top, vmstat...)中,最普遍,最方便的。它只是sysstat包中的一个工具,所以你必须安装sysstat包,可以去sysstat官网下载解压进行安装。

如果你下载的是tar.xz格式的话一般tar zxvf 是解压不了的,先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包。然后就是传统的makefile安装了。

牛刀小试

sar 是后台进程sadc的前端显示工具,sadc会自动从内核收集报告并保存,不加任何选项可查看sadc过去收集的cpu使用率情况:


(如果报错,那是因为你没有建立/var/log/sa日期文件,你可以sar -o 来保存)

你还可以加-f去查看历史数据 , sar -f /var/log/sa04 | head,毕竟你没法及时到达案发现场-_-|||

不仅可以显示过去数据,sar还可以显示当前数据,加上数字参数,sar 1 5 每隔1s取一次,共5次


查看cpu使用率

参数解析

%user 用户模式下消耗的的cpu时间的比例;

%nice 通过nice改变进程调度优先级的进程,在用户模式下消耗的cpu时间的比例;--欢迎补充

%system 系统模式下消耗的cpu时间的比例;

%iowait cpu等待I/O而导致的空闲状态消耗时间的比例;

% steal 利用Xen等操作系统虚拟化技术时,等待其他虚拟CPU计算占用等时间比例;--不懂

% idle CPU没有等待磁盘I/O等的空闲状态消耗的时间比例;

在考虑负载均衡的时候,user system iowait idle值是重要指标[后续会详解]

平均负载

top 命令里会显示Load average 平均负载均衡值:

load average:0.07 0.11 0.08 从左到右分别是1分钟,5分钟,15分钟内,单位时间中处于等待状态的任务数,也就是报告了平均有多少个任务在等待,硬件每隔一定的周期给CPU发送中断信号,叫 定时中断,每次发生中断CPU就会进行与时间有关的计算与统计,平均负载值就是这个时候计算的,它计算就绪任务数和等待IO的任务数,其意义就是:

想要执行任务,却无法执行而不得不等待的的进程有多少,这些进程分为等待CPU的进程和等待IO完成的进程,所以光看平均负载值还是看不出是CPU还是IO的问题,但是平均负载越高说明运行有延迟,也就是负载过高。(当然宕机 拒绝服务等就不需要看数字了)

CPU密集型应用和IO密集型应用

根据前面负载可分两类:CPU负载和IO负载,一般来说应用服务器(后端服务器(发API的))从数据库中获得数据,加工后发送给客户端,很少有过多的IO操作(上传下载图片等会有专门的组件,如node 分布式文件服务器,cdn等处理),所以大多数应用服务器都是CPU密集型的,所以需要解决的负载主要就是CPU负载。

数据库服务器,是的,头疼的数据库服务器(因为工作时每次都要先ssh应用服务器,再从里面ssh到数据库服务器),不用说就是处理IO的,当数据规模变大时,IO大影响会远大于CPU,因此它是IO密集型服务器。

查找CPU瓶颈

平均负载过高,再用sar查看 CPU使用率 %user+%system 高的话,可确定为CPU资源不足,多核CPU可以用-P命令查看每个CPU的使用率以及其上的IO等待率,

(我就分配了一个不用看了,)虽然CPU负载可以分散到其它CPU上,但是IO负载不行,所以IO优化很头疼。

而后你可以用ps看一下哪个进程发疯了,然后用strace跟踪,或者你也跟着发疯;如果没有问题,但是系统的吞吐量下降了,是否考虑一下优化算法或者再增加一台应用服务器去负载。

CPU负载解决

当一台tomcat不够用时,两台就行了,一般只要你的程序没有太奇葩,都以增加服务器来解决,一般的架构都是前端nginx做反向代理,后面跟个server group 一堆tomcat或别的什么,这是一个web站点在一开始就该考虑到的最基本的伸缩性需求(tomcat提供session分布式功能,不过现在有redis memcached等,ngnix也足够智能的知道哪些用户往哪些后端服务器发)。

查找IO瓶颈

平均负载值过高,且%iowait也过高的话,可以认为负载过高的原因为IO,IO负载过高,多半是程序发出的IO请求过多,或是发生页面交换导致频繁访问磁盘,通过sar确认交换区状态,找出原因

如果没有交换发生,而且磁盘IO频繁的情况,可能是缓存的内存不足(OS用LRU算法,缓存会经常更替,缓存不足时,命中率下降,更替明显,程序IO请求变多)。

下面就来确定是哪种:

sar -r 1 每秒输出一次当前内存状态


主要看 kbcached 用于缓存的容量,有278MB被用作缓存 %memused 内存利用率 92%,我的虚拟机1G内存,当读取大文件时,缓存会大大增加,不要差异,那是操作系统的缓存机制,所以还得看%iowait 看看多少进程在等待,最好的情况当然时降至最低了,增加内存可以加大缓存容量从而减少io等待,也就是增加内存可以减少IO负载(很合理,写SQL时也会经常考虑数据库缓存机制)

sar -w 查看页面交换发生情况 (本人小小虚拟机,没啥数据,大家想像一下吧--)


pswpin/s 每秒换入页数 pswpout/s 每秒换出页数,页面交换时服务器吞吐量会大大降低(IO等待率大大增高,由磁盘当话可能会卡卡响很大)

注意在可用内存(当然包括缓存)不足时(大数据处理),才会发生大量页面交换(虚拟内存机制的一个功能,在物理内存不足时,虚拟一部分磁盘空间当内存用)

IO负载均衡

如果是页面交换发生频繁的话,先用ps看看是否有进程消耗了大量的内存(是不是开了多个tomcat),是否有程序内存泄露,拖慢整系统,如果真是内存不足,那就增加内存(垂直扩展),并考虑分布式(分布式可用减少单机IO压力,可将读写分流等,各大数据库都提供集群功能);

果然是缓存不足,则增加内存,还不行就考虑缓存服务器吧,当然最先做的是改进程序减少IO请求。

总结

系统负载主要分为CPU负载和IO负载,分别对应应用服务器和数据库服务器

平均负载值过高+CPU使用率过高为CPU负载过高

平均负载值过高+iowait过高为IO负载

CPU负载高时 只需简单添加服务器就行

加大缓存可以减少IO负载

IO负载均衡比CPU负载均衡要难,因为要考虑数据的局部性,一般解决方法是主从复制模式(MYSQL)或者数据库分区(水平和垂直)

参考《大规模web服务开发技术》

这是我之前一直想总结的,因为种种原因拖欠至今,搞技术的还是要多总结总结的


利用sar工具确定系统性能瓶颈-超详细版