Notes:
- 中断是一种异步事件处理机制,用于提高系统的并发处理能力。
- 为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快低的运行。
中断处理程序过程中,还会临时关闭中断,甚至可能导致中断丢失
。
联想:之前面试中碰到过一个问题,什么样的服务适合用coroutine?coroutine应该使用与一些处理时间比较短,或者处理时间可以预期的程序。我觉得这边也可以说明一些问题,当io完成后,会发送一个中断,触发异步操作。在这个过程中,如果触发的程序处理时间比较长,就又可能丢失其它的中断。这个过程虽然多线程中也会发现,但是coroutine在一些高qps的服务中如果中断处理程序过长就会放大这个问题。 - 中断分上半部分-硬中断,特别是快。下半部分-软中断,特别是延迟执行。
- 多个性能问题存在时解决原则:28原则,找出20%影响了80%的问题。不是所有的性能问题都值得优化。
联想:我觉得这边可以分阶段性的。实现目前的当务之急。有的时候28原则也会转换,之前的80%有可能转换为后期的20%。
中断相关Tools:
- /proc/softirqs 提供了软中断的运行情况
- /proc/interrupts 提供了硬中断的运行情况。
性能优化工具图
Situatioin & Case:
软中断CPU升高?
关键指标:总段次数变化率
网络接收的软中断比较常见,借助sar,tcpdump等工具。
perf 的报告中,很多符号都不显示调用栈
man perf-report
threshold 的默认值为 0.5%,也就是说,事件比例超过 0.5% 时,调用栈才能被显示观察我们案例应用 app 的事件比例,如果低于 0.5%,所以看不到 app 的调用栈就很正常了。这种情况下,你只需要给 perf report 设置一个小于 app的阈值,比如如果是0.34%
$ perf report -g graph,0.3
perf找不到symbol
- 在容器外面构建相同的路径依赖库
- 在容器内部运行Perf
- 指定符号路径为容器文件系统的路径
- 在容器外面把分析纪录保存下来,再去容器里查看结果
性能优化方法论
1.确定优化的优先级,避免不重要的优化被提前。
2.个人排序
系统优化 > CPU优化 > 应用程序优化。
3.工具使用: uptime查看平均负载趋势。注意区分每个CPU的趋势。配合mpstat和pidstat。perf入手进程的运行态。execsnoop监控调用外部命令。