• 0
  • 0
分享
  • CPU火焰图初探-优化0.1%
  • FunTeste 2023-04-03 13:27:54 字数 2598 阅读 1095 收藏 0

早就听过CPU火焰图的强大功能,也听过几个火焰图工具,今天终于开始尝试使用CPU火焰图生成工具。

奈何由于各种原因,Intellij自带的火焰图插件并不能用,着实让人不快。故而找到一个async-profiler分析工具作为替代品。

当时正在测试随机数性能的,所以就用了一个动态QPS模型的Case,学习了async-profiler的使用。很意外地发现了一个性能可以优化的地方。经过尝试,CPU使用率降低了0.24%,也算是第一个成果了。

async-profiler

这个工具安装和使用教程,可以网上搜一下,建议去Github仓库看看Wiki,这里我就不多说。

Case code

下面是Case的代码,用了动态QPS模型。

class T extends SourceCode {

    static void main(String[] args) {
        def total = 1000_0000
        def index = new AtomicInteger()
        int i = 0
        def test = {
            i++ % total
            //            index.getAndIncrement() % total
            getRandomInt(total)
            sleep(0.01)
        }
        new FunQpsConcurrent(test, "测试随机性能").start()
    }
}

下面是执行任务的方法com.okcoin.hickwall.presses.funtester.frame.execute.FunQpsConcurrent#start代码:

    void start() {
        if (executor == null) executor = ThreadPoolUtil.createCachePool(Constant.THREADPOOL_MAX, "Q")
        if (Common.PERF_PLATFORM) controller = new RedisController(this)
        if (controller == null) controller = new FunTester();
        new Thread(controller, "receiver").start();
        while (key) {
            ThreadPoolUtil.executeTask(executor, qps, produce, total, name)
        }
        stop()
    }

优化过程

整个main线程差不多都在上面那个while循环中。我先生成了火焰图,看了main的火焰图,如下:

CPU火焰图(优化前)

可以看出com.okcoin.hickwall.presses.funtester.frame.execute.ThreadPoolUtil#executeTask方法使用了0.53%的CPU,这里看到一个getSecond方法里面使用CPU最多,而且创建了Calendar对象,代码如下:

        if (Time.getSecond() % COUNT_INTERVAL == 0) {
            int real = total.sumThenReset() / COUNT_INTERVAL as int
            def active = executor.getActiveCount()
            def count = active == 0 ? 1 : active
            log.info("{} design QPS:{},actual QPS:{} active thread:{} per thread efficiency:{}", name, qps, real, active, real / count as int)
        }

这里本意是为了间隔几秒输出当前的设计QPS、实际QPS、活跃线程数等信息。这里我想是不是可以直接用时间戳实现这个需求,应该会更快。所以修改后的代码如下:

        if (SourceCode.getMark() % COUNT_INTERVAL == 0) {
            int real = total.sumThenReset() / COUNT_INTERVAL as int
            def active = executor.getActiveCount()
            def count = active == 0 ? 1 : active
            log.info("{} design QPS:{},actual QPS:{} active thread:{} per thread efficiency:{}", name, qps, real, active, real / count as int)
        }

改完之后重新跑了一次,抓取火焰图,main线程部分如下:

CPU火焰图(优化后)

com.okcoin.hickwall.presses.funtester.frame.execute.ThreadPoolUtil#executeTask方法CPU使用率降低到0.29%,但是多了一部分使用使用,整体com.okcoin.hickwall.presses.funtester.frame.execute.FunQpsConcurrent#start方法的CPU使用率是0.44%,相比较之前的0.53%降低了0.09%。

四舍五入也就优化了0.1%,也算是优化效果,有所收获。然后我突然发现整个火焰图的中CPU占用的大多数都是那个sleep方法,可能这个之前性能测试中的随机数性能问题探索中的结论可能不够明显,甚至忽略了三个方式的差异。后续我重新设计用例测一遍。


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   一、越权漏洞  越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。所谓越权,顾名思义即超过当前用户的权力范围,越至不同用户或获得更高的系统权限的一类漏洞。具体到应用当中,当服务器处理用户发起的请求时,没有对该用户的操作权限进行判定,从而导致不法分子利用该漏洞篡改用户信息,达到增删改查的目的。该类漏洞在当前的测试中可通过Fiddler手工测试或Appscan自动扫描测试。越权漏洞一般可分为两类,即水平越权和垂直越权。  1.水平越权:水平越权是指角色权限相同的用户之间能...
            0 1 1818
            分享
          • 一、引言对mysql数据库进行备份最近比较苦逼,拿着测试的钱,干着运维的活,估计这只有小屌丝能理解。。小屌丝表示 不服。。。。由于要做数据备份,所以就写了一个脚本,让它自己跑着吧~~二、代码实战代码示例# -*- coding:utf-8 -*- # @Time   : 2022-07-29 # @Author : Carl_奕然 #DB基本信息 import os import time import datetime import glob...
            1 0 4543
            分享
          • 国内软件业快速发展的最近十年,软件开发工程师的人数和职业水平得到了很大的提高,当前国内高水平的软件开发工程师的数量已经可以和许多软件业发达的国家相比。但是,软件测试人才严重缺乏,尤其是既懂质量管理,又懂测试技术的软件测试工程师,更是凤毛麟角。现阶段软件测试工程师的晋升通道有两种:一种是专业通道,成长为高级软件测试工程师或专职的性能测试工程师、自动化测试工程师、白盒测试工程师,这时能够独立测试很多软件,甚至可以成为软件测试架构设计师,当然随着技术的积累也可以转做项目管理;第二种是管理通道,从测试工程师到组长(Lead),再到测试经理(Manager),以至更高的职位。测试工程师晋升通道如图3-6...
            0 0 1058
            分享
          •   今天主要聊一聊银行的测试岗  互联网大厂工资高,但也不是那么好进的,这两年内卷越来越严重,想进大厂也越来越难。而银行的测试岗难度则会小很多,工资也还说的过去,并且工作相对稳定,很少会裁员,但可能会对学历有一定要求(相比于互联网公司)。  下面先来看几个问题,看看你是否适合去银行做测试。  ·是否能接受较低的工资,并且涨薪很慢(这是相比于互联网,如果和传统行业相比,工资还是可以的)  · 是否能接受较落后的技术栈,并且技术上的成长性较差(因为银行都是稳定为主,一般对技术要求并没有那些高)  · 是否能接受在职业晋升上会有论资排辈的情况存在  · 是否能接受国企那...
            0 0 2026
            分享
          • 接口自动化的工具现在有很多个选择,本篇文章着重介绍YAPI的使用方法;1、它首先是一个很好的接口维护的工具;开发同学的接口文档可以在此工具上维护;现在很多的文档的维护都是多人协同维护了,例如jira、石墨等。相对于postman更倾向于本地化,YAPI更能提现协同合作的优势。开发同学可以根据各自的分工来分别维护自己所负责模块的接口;而组长有分配的权限来给各个成员分配各个模块的查看和编辑的权限;在接口的编辑页面可以整理自己接口的信息,请求的参数以及返回的结构和信息,各种备注等等;开发的同学在维护完成接口后,测试同学就可以运动接口来进行接口的测试以及测试集合自动化测试的case编写了。2、单个接口...
            14 13 2872
            分享
      • 51testing软件测试圈微信