美文网首页程序员网页前端后台技巧(CSS+HTML)
我是如何把CPU使用率从70%降到25%的

我是如何把CPU使用率从70%降到25%的

作者: 西七楼 | 来源:发表于2017-06-18 21:05 被阅读0次

    最近将公司的一个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是可以在生产系统使用的,对性能几乎没有影响。


    上图就是perf的输出,一般都是好几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的性能太差,会影响分析。
    压测
    做性能调优,离不开压测工具,我们可以选择用http://jmeter.apache.org/
    这里提供另外一个思路:
    因为线上系统有特定的请求模式,用JMeter模拟的请求模式与线上系统的相差较大,调优的结果不一定能解决线上问题。

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

    自动化
    因为在整个调优过程中,我需要反复的改code、部署和测试。将部署和测试等流程自动化,大大减轻了我的负担,也让我可以保持一个愉悦的心情。
    高性能C++后台的建议
    尽量使用Memory Pool,频繁的使用临时分配的内存空间,会导致较高的Page Fault,占用大量的CPU

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

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

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

    最后,推荐http://www.brendangregg.com/,里面的方法论和工具链,让人受益匪浅。

    西七楼小密圈
    因为很难在一篇文章中讲明白所有的知识点,所以创建了小密圈方便大家反馈交流。
    小密圈收费¥90是为了设立门槛,筛选真正诚心学习课程的朋友。

    凡是认真学习并坚持到最后的朋友,我会发¥100的红包。


    长按二维码,关注公众号!

    相关文章

      网友评论

        本文标题:我是如何把CPU使用率从70%降到25%的

        本文链接:https://www.haomeiwen.com/subject/nfjwqxtx.html