一 原理分析
CPU做为服务器的关键资源常常成为性能瓶颈的根源,CPU使用率高并不老是意味着CPU工做繁忙,它有多是正在等待其余子系统。在进行性能分析时,将全部子系统当作一个总体来看是很是重要的,由于在子系统中可能会出现瀑布效应。衡量CPU 系统负载的指标是load,load 就是对计算机系统可以承担的多少负载的度量,简单的说是进程队列的长度。简单的例子好比食堂有五个窗口,当有小于五个学生来打饭,五个窗口都能及时处理,可是当学生个数超过5个,必然会出现等待的学生。请求大于当前的处理能力,会出现等待,引发load升高。
Load Average 就是一段时间(1min,5min,15min)内平均Load。平均负载的最佳值是1,这意味着每一个进程均可以在一个完整的CPU 周期内完成。
14:50:31 up 166 days, 1:54, 295 users, load average: 0.05, 0.04, 0.00
二 缘由分析
通常致使MySQL服务器load飙高的缘由可能有如下几种状况:
1 业务并发调用全表扫描/带有order by 排序的SQL语句.
2 SQL语句没有合适索引/执行计划出错/update/delete where扫描全表,阻塞其余访问相同表的sql执行.
3 存在秒杀相似的业务好比聚划算10点开团或者双十一秒杀,瞬时海量访问给数据库带来冲击。
4 数据库作逻辑备份(须要全表扫描)或者多实例的压缩备份(压缩时须要大量的cpu计算,会致使系统服务器load飙高)
5 磁盘写入方式改变 好比有writeback 变为 write through
RAID卡都有写cache(Battery Backed Write Cache),写cache对IO性能的提高很是明显,由于掉电会丢失数据,因此必须由电池提供支持。
电池会按期充放电,通常为90天左右,当发现电量低于某个阀值时,会将写cache策略从writeback置为writethrough,至关于写cache会失效,这时若是系统有大量的IO操做,可能会明显感受到IO响 应速度变慢,cpu 队列堆积系统load 飙高。
6 其余 欢迎补充 。
三 解决方法
在Load average 高的状况下如何鉴别系统瓶颈?如何判断系统是否已经Over Load呢?要去检查判断是CPU不足,仍是io不够快形成或是内存不足?
这里笔者处理的方式 通常根据cpu数量去判断,也就是Load平均要小于CPU的数量,负载的正常值在不一样的系统中有着很大的差异。在单核处理器的工做站中,1或2都是能够接受的。多核处理器的服务器(好比24核)上,load 会到达20 ,甚至更高。以多实例混合公用一台24核物理机为例,当DBA收到数据库服务器load 飙高报警后,通常的处理步骤
a) 数据库层面
1 top -u mysql -c 检查当前占用cpu资源最多的进程命令。-c 是为了显示出进程对应的执行命令语句,方便查看是什么操做致使系统load飙高。
2 根据不一样的状况获取pid 或者MySQL的端口号
3 若是是MySQL 数据库服务致使laod 飙高,则可使用以下命令
show processlist;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND <> 'sleep' AND TIME>100;
或
orzdba 工具检查逻辑读/thread active的值。用法orzdba --help
orztop 工具检查当前正在执行的慢sql,用法orztop -P $port
4 获取异常的sql以后,剩下的比较好解决了。结合第一部分中的几条缘由
a 选择合适的索引
b 调整sql 语句 好比对应order by 分页采用延迟关联
c 业务层面增长缓存,减小对数据库的直接访问等
b) OS 系统层面 检查系统IO
使用iostat 命令查看r/s(读请求),w/s(写请求),avgrq-sz(平均请求大小),await(IO等待), svctm(IO响应时间)
r/s ,w/s是每秒读/写请求的次数。
util是设备的利用率。若是它接近100%,一般说明设备能力趋于饱和(并不绝对,好比设备有写缓存)。有时候可能会出现大于100%的状况,这多半是计算时四舍五入引发的。
svctm是平均每次请求的服务时间。这里有一个公式:(r/s+w/s)*(svctm/1000)=util。举例子:若是util达到100%,那么此时 svctm=1000/(r/s+w/s),假设IOPS是1000,则svctm大概在1毫秒左右,若是长时间大于这个数值,说明系统出了问题。
await是平均每次请求的等待时间。这个时间包括了队列时间和服务时间,也就是说,通常状况下,await大于svctm,它们的差值越小,队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好。
http://blog.itpub.net/22664653/viewspace-1262635/