最近将公司的一个C++服务的CPU使用率从70%左右降到了25%,跟大家分享一下其中的方法论。最重要的有三点:一是工具链,二是压测,三是自动化。

工具链

Linux下查看CPU使用率的常用命令有top,htop和vmstat等。这些命令只能查询到进程的CPU使用率,但我还是不知道哪一段程序占用了过高的CPU。

Perf is a profiler tool for Linux 2.6+ based systems that abstracts away CPU hardware differences in Linux performance measurements and presents a simple command line interface. Perf is based on the perf_events interface exported by recent versions of the Linux kernel.

简单来说,perf是基于perf_event的性能调优工具,通过采样kernel的指令,来统计function级别的CPU使用率。我觉得perf是可以在生产系统使用的,对性能几乎没有影响。

电脑看视频cpu占用高_浏览器看视频cpu占用过高怎么办_linuxcpu占用率怎么看

上图就是perf的输出linuxcpu占用率怎么看,一般都是好几MB,分析起来很不方便。Brendan Gregg大神发明了Flame Graphs,将perf的输出可视化,大大简化了分析过程。

Flame Graphs有几个特点:

颜色没有特殊含义,并不是颜色越深越重要

每个方块都代表一个function

自顶向下就是function的call stack

最顶部的function正在消耗CPU,所有顶部function的边长加起来是100%

长度越长代表消耗的CPU越高,应优先关注

另外C++程序的perf输出,是汇编风格的函数名,可以用c++filt转义成正常的函数名。再就是CMake的Build mode设置为RelWithDebInfo,Debug mode的性能太差,会影响分析。

压测

做性能调优,离不开压测工具,我们可以选择用。

这里提供另外一个思路:

因为线上系统有特定的请求模式linuxcpu占用率怎么看,用JMeter模拟的请求模式与线上系统的相差较大,调优的结果不一定能解决线上问题。

我截取了一段时间内的线上系统日志,通过在测试系统回放线上请求,来模拟线上系统的请求模式,并且通过一些参数来控制QPS等负载。

自动化

因为在整个调优过程中,我需要反复的改code、部署和测试。将部署和测试等流程自动化,大大减轻了我的负担,也让我可以保持一个愉悦的心情。

高性能C++后台的建议

尽量使用Memory Pool,频繁的使用临时分配的内存空间,会导致较高的Page Fault,占用大量的CPU

使用STL和Boost要谨慎,并且要理解背后的复杂度和overhead。使用率较高的vector和string等,尽量当C的字符串和数组来用

频繁执行的代码块,比如for loop内部的逻辑,尽量不要用类继承,智能指针,操作符重载等C++特性,多少会有overhead

注意代码细节,即使if条件的顺序变化,有些场景都会影响性能

最后,推荐,里面的方法论和工具链,让人受益匪浅。

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688