一次 load average 飙升问题排查的 RCA, luikimfai

1. 背景知识(Optional)

操作系统, 内存, 多线程, 系统架构

2. 问题现象

服务器 高峰时段压力高,load average值会超过cpu核数, 非持续性, 出现一时高一时低现象。


3. 影响范围

影响服务, 超时,失败都会增加

4. 问题原因

程序a耗费内存, 加入b模块后, 更甚。 当短时间内多个大数据请求到达, 机器内存达到瓶颈, cpu都耗费在申请内存上

5. 问题分析过程(Optional)

a. 使用top观察, load average高时候, 程序a的cpu 和 程序b的cpu都很高, 考虑到程序a,程序b都是cpu密集型程序且传输大数据。 猜测定程序a在cpu耗费在读写数据tcp操作上。
b. 验证a的猜测,使用strace -c -p 程序a Id 观察程序a的系统调用情况。发现cpu时间消耗在brk,munmap 两个函数上。
c. google查询 brk,munmap 两个函数的作用, 是申请内存时候使用。
d. 使用cat /proc/buddyinfo查询系统的内存剩余情况, 观察load average高低峰值时候的差异, 发现区别明显。
e. 出现一时高一时低现象, 成因应该是某一时刻, 大数据请求同时去到同一台机器上导致的。(潮涌现象)
f. 综合以上五点, 可判断内存不足导致程序cpu消耗在内存申请上面。 从而导致load average高。


6. 解决办法

程序b分配到其他机器, 平衡机器负载

7. 后续处理措施:如线上脏数据如何修复,如对用户造成的影响如何弥补等(Optional)

8. 经验教训

one fork per connection模式能够防止程序崩溃之间的相互影响, 但是以放弃机器负载的精确控制为代价。
同一个机器运行的不同程序过多, 定位问题更难。

9. RCA类型:如代码问题、实施问题、配置问题、设计问题、测试问题

代码问题、系统问题

posted @ 2017-09-11 15:27  luikimfai  Views(631)  Comments(0)    收藏  举报