前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >高并发性能测试经验分享(下)

高并发性能测试经验分享(下)

原创
作者头像
腾讯技术工程官方号
修改于 2017-09-05 03:21:46
修改于 2017-09-05 03:21:46
3.9K0
举报

本文紧接上篇《高并发性能测试经验分享(上)

内存泄漏

虽然解决了core dump,但是另外一个问题又浮出了水面,就是高并发测试时,会出现内存泄漏,大概一个小时500M的样子。

valgrind的缺点

出现内存泄漏或者内存问题,大家第一时间都会想到valgrind。valgrind是一款非常优秀的软件,不需要重新编译程序就能够直接测试。功能也非常强大,能够检测常见的内存错误包括内存初始化、越界访问、内存溢出、free错误等都能够检测出来。推荐大家使用。

valgrind 运行的基本原理是:待测程序运行在valgrind提供的模拟CPU上,valgrind会纪录内存访问及计算值,最后进行比较和错误输出。我通过valgrind测试nginx也发现了一些内存方面的错误,简单分享下valgrind测试nginx的经验:

1.nginx通常都是使用master fork子进程的方式运行,使用–trace-children=yes来追踪子进程的信息。

2.测试nginx + openssl时,在使用rand函数的地方会提示很多内存错误。比如Conditional jump or move depends on uninitialised value,Uninitialised value was created by a heap allocation等。这是由于rand数据需要一些熵,未初始化是正常的。如果需要去掉valgrind提示错误,编译时需要加一个选项:-DPURIFY。

3.如果nginx进程较多,比如超过4个时,会导致valgrind的错误日志打印混乱,尽量减小nginx工作进程,保持为1个。因为一般的内存错误其实和进程数目都是没有关系的。

上面说了valgrind的功能和使用经验,但是valgrind也有一个非常大的缺点,就是它会显著降低程序的性能,官方文档说使用memcheck工具时,降低10-50倍。也就是说,如果nginx完全握手性能是20000 qps,那么使用valgrind测试,性能就只有400 qps左右。对于一般的内存问题,降低性能没啥影响,但是我这次的内存泄漏是在大压力测试时才可能遇到的,如果性能降低这么明显,内存泄漏的错误根本检测不出来。只能再考虑其他办法了。

AddressSanitizer的优点

address sanitizer(简称asan)是一个用来检测c/c++程序的快速内存检测工具。相比valgrind的优点就是速度快,官方文档介绍对程序性能的降低只有2倍。对Asan原理有兴趣的同学可以参考asan的算法这篇文章,它的实现原理就是在程序代码中插入一些自定义代码,如下:

编译前:

*address = ...; // or: ... = *address; f

编译后:

代码语言:txt
复制
if (IsPoisoned(address)) {
ReportError(address, kAccessSize, kIsWrite);
}
*address = ...;  // or: ... = *address;

和valgrind明显不同的是,asan需要添加编译开关重新编译程序,好在不需要自己修改代码。而valgrind不需要编程程序就能直接运行。address sanitizer集成在了clang编译器中,GCC 4.8版本以上才支持。我们线上程序使用的gcc版本较低,于是我测试时直接使用clang重新编译nginx:

代码语言:txt
复制
—with-cc=”clang” \
—with-cc-opt=”-g -fPIC -fsanitize=address -fno-omit-frame-pointer”

其中with-cc是指定编译器,with-cc-opt指定编译选项, -fsanitize=address就是开启AddressSanitizer功能。

由于AddressSanitizer对nginx的影响较小,所以大压力测试时也能达到上万的并发,内存泄漏的问题很容易就定位了。这里就不详细介绍内存泄漏的原因了,因为跟openssl的错误处理逻辑有关,是我自己实现的,没有普遍的参考意义。最重要的是,知道valgrind和asan的使用场景和方法,遇到内存方面的问题能够快速修复。

性能热点分析

到此,经过改造的nginx程序没有core dump和内存泄漏方面的风险了。但这显然不是我们最关心的结果(因为代码本该如此),我们最关心的问题是:

1.代码优化前,程序的瓶颈在哪里?能够优化到什么程度?

2.代码优化后,优化是否彻底?会出现哪些新的性能热点和瓶颈?

这个时候我们就需要一些工具来检测程序的性能热点。

性能分析工具

linux世界有许多非常好用的性能分析工具,我挑选几款最常用的简单介绍下:

1.perf应该是最全面最方便的一个性能检测工具。由linux内核携带并且同步更新,基本能满足日常使用。推荐大家使用。

2.oprofile,我觉得是一个较过时的性能检测工具了,基本被perf取代,命令使用起来也不太方便。比如opcontrol —no-vmlinux , opcontrol —init等命令启动,然后是opcontrol —start, opcontrol —dump, opcontrol -h停止,opreport查看结果等,一大串命令和参数。有时候使用还容易忘记初始化,数据就是空的。

3.gprof主要是针对应用层程序的性能分析工具,缺点是需要重新编译程序,而且对程序性能有一些影响。不支持内核层面的一些统计,优点就是应用层的函数性能统计比较精细,接近我们对日常性能的理解,比如各个函数时间的运行时间,,函数的调用次数等,很人性易读。

4.systemtap 其实是一个运行时程序或者系统信息采集框架,主要用于动态追踪,当然也能用做性能分析,功能最强大,同时使用也相对复杂。不是一个简单的工具,可以说是一门动态追踪语言。如果程序出现非常麻烦的性能问题时,推荐使用 systemtap。

这里再多介绍一下perf命令,tlinux系统上默认都有安装,比如通过perf top就能列举出当前系统或者进程的热点事件,函数的排序。perf record能够纪录和保存系统或者进程的性能事件,用于后面的分析,比如接下去要介绍的火焰图。

火焰图 flame graph

perf有一个缺点就是不直观。火焰图就是为了解决这个问题。它能够以矢量图形化的方式显示事件热点及函数调用关系。比如我通过如下几条命令就能绘制出原生nginx在ecdhe_rsa cipher suite下的性能热点:

1.perf record -F 99 -p PID -g — sleep 10

2.perf script | ./stackcollapse-perf.pl > out.perf-folded

3../flamegraph.pl out.perf-folded>ou.svg

直接通过火焰图就能看到各个函数占用的百分比,比如上图就能清楚地知道rsaz_1024_mul_avx2和rsaz_1024_sqr_avx2函数占用了75%的采样比例。那我们要优化的对象也就非常清楚了,能不能避免这两个函数的计算?或者使用非本地CPU方案实现它们的计算?

当然是可以的,我们的异步代理计算方案正是为了解决这个问题。

从上图可以看出,热点事件里已经没有RSA相关的计算了。至于是如何做到的,后面有时间再写专门的文章来分享。

心态

为了解决上面提到的core dump和内存泄漏问题,花了大概三周左右时间。基本上4月份对我来说就是黑色的,压力很大,精神高度紧张,感觉有些狼狈,看似几个很简单的问题,搞了几周时间。心里当然不是很爽,会有些着急,特别是项目的关键上线期。但即使这样,整个过程我还是非常自信并且斗志昂扬。我一直在告诉自己:

1.调试BUG是一次非常难得的学习机会,不要把它看成是负担。不管是线上还是线下,能够主动地,高效地追查BUG特别是有难度的BUG,对自己来说一次非常宝贵的学习机会。面对这么好的学习机会,自然要充满热情,要如饥似渴,回首一看,如果不是因为这个BUG,我也不会对一些工具有更深入地了解和使用,也就不会有这篇文档的产生。

2.不管什么样的BUG,随着时间的推移,肯定是能够解决的。这样想想,其实会轻松很多,特别是接手新项目,改造复杂工程时,由于对代码,对业务一开始并不是很熟悉,需要一个过渡期。但关键是,你要把这些问题放在心上。白天上班有很多事情干扰,上下班路上,晚上睡觉前,大脑反而会更加清醒,思路也会更加清晰。特别是白天上班时容易思维定势,陷入一个长时间的误区,在那里调试了半天,结果大脑一片混沌。睡觉前或者上下班路上一个人时,反而能想出一些新的思路和办法。

3.开放地讨论。遇到问题不要不好意思,不管多简单,多低级,只要这个问题不是你google一下就能得到的结论,大胆地,认真地和组内同事讨论。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
项目管理快速入门01--概论
之前通过了系统分析师的考核,最近打算将PMP和项目管理师一起都考了,正好还报了个光环的PMP的培训班,毕竟这部分知识在日常生活中使用的比较少,概念理论性较强,在实际中的基层软件项目管理,主要还是技术带
用户1216676
2018/01/24
9390
项目管理快速入门01--概论
软考高项(第四版)十五至尊图最新总结
 今年三月份通知5月27日的软考临时修改了考试教材,改成第四版。据我们估计,新版和旧版相比修改的内容达到20%-30%,一起备考的老哥们基本都是二月份开始学的,三月份刚学完一轮,然后被通知要重新学。。白学了,真香~
陈哈哈
2023/04/12
3.1K0
软考高项(第四版)十五至尊图最新总结
项目管理领域的常见英文术语,特别是 9 大知识领域有关的知识
软考项目管理领域的常见英文术语,特别是 9 大知识领域有关的知识 软考项目管理领域的常见英文术语 一.项目管理基础术语 二.项目整体管理 三.项目范围管理 四.项目时间管理 五.项目人力资源管理 六.项目成本管理 七.项目采购管理 八.项目质量管理 九.项目风险管理 十.项目沟通管理 软考项目管理领域的常见英文术语 一.项目管理基础术语 项目(Project) 运营、操作(Operation) 一般管理(General Management) 项目管理(Project Management) 大型
cookily
2022/10/05
1.6K0
【信管3.1】项目整体管理概念与过程
从这一节课开始,我们就进入到了项目管理十大领域的学习过程中。之前我们就已经说过,这十大领域包括整体、范围、进度、成本、质量、人力资源、沟通、风险、采购以及干系人管理。在这其中,项目整体管理就是其余 9 个项目管理过程的整体综合汇总,最后在所有的项目过程结合起来生成的项目管理计划书就是项目整体管理的最终产物。
硬核项目经理
2023/03/02
3990
【信管3.1】项目整体管理概念与过程
你需要知道的项目管理知识
👆 这是第 111 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:你需要知道的项目管理知识 https://www.zoo.team/article/project-manage-ablout 前言 作为一名软件开发工程师,为什么要了解项目管理知识呢?不知你是否在想,程序员只要写好代码就好了,何必要关心项目管理呢。在当今程序员行业愈发饱和的时候,保持竞争力是永恒的话题,而项目管理知识作为程序员的“软技能”之一,不仅能锻炼你的组织协调、沟通协
政采云前端团队
2021/09/08
7350
项目管理(PMP)整体介绍
纵向: 十大知识领域:项目整合管理,项目范围管理,项目进度管理,项目成本管理,项目质量管理,项目资源管理,项目沟通管理,项目风险管理,项目采购管理,项目相关方管理
Freedom123
2024/03/29
2480
项目管理(PMP)整体介绍
成功通过PMP第4章——项目管理框架与基本理念
介绍 项目管理方法通常被认为是战争和军事竞赛对目标实现的高效和精确要求的产物,如第一次世界大战期间的甘特图和第二次世界大战期间的PERT法。在20世纪50年代,CPM和PERT技术的完善和向民用项目管理的普及,标志着近代项目管理学科诞生并逐步步入成熟期。 在发达国家中,现代项目管理逐步发展成为独立的学科体系和行业,成为现代管理学的重要分支。 概论 项目管理的兴起 现代项目管理是如何出现的呢?主要原因是市场竞争加剧、产品利润走薄、产品更新换代加快、用户要求越来越高,使得企业系统的垂直管理很难满足以上的变革,企
yeedomliu
2019/09/29
1.5K0
成功通过PMP第4章——项目管理框架与基本理念
项目管理学习 ---- 理解项目管理思维框架
1、项目管理STACEY矩阵可分五种类型的项目及开发方式:需求清晰、技术清晰型项目、需求简单,技术复杂型项目、技术很成熟、需求不明确,需求不确定、技术不确定型混乱项目,需求不是很确定,技术也不是很确定型模糊项目
流川疯
2020/11/24
8090
项目管理学习 ---- 理解项目管理思维框架
【项目管理】 项目管理术语总结 (PMP培训笔记)
项目管理定义 : 将 知识, 技能, 工具 与 技术 应用与项目活动, 以满足项目的要求;
韩曙亮
2023/03/27
1K0
10分钟带你了解项目经理和产品经理
在公司的组织结构中会有这么两个职位:项目经理(Project Manager)和产品经理(Product Manager),简称PM。
互联网老辛
2020/05/19
2.9K0
10分钟带你了解项目经理和产品经理
PMBOK是枪,软件工程是弹,弹枪结合才是完美的!
让没有任何经验的人去开枪,确实是件提心吊胆的事!但是枪不管能不能打响,你必须去尝试,而且要一千次、一万次地去尝试,只有这样才能成为神枪手!
博文视点Broadview
2020/06/12
5030
PMBOK是枪,软件工程是弹,弹枪结合才是完美的!
【信管2.3】项目生命周期
上一篇文章内容有点多呀,消化完了吗?其实吧,最主要的就是那三种组织形式而已,别的真没什么,记住它们的优缺点和项目经理的权力大小就可以了。今天我们轻松点,虽说还是挺重要的,但要记住它们并不是在今天。我们要了解一下项目的生命周期,以及在 IT 项目开发中常用的典型生命周期。其实这些内容我们在技术相关的内容中都已经有涉及过,这里只是更详细的再说明一下。看到下面的内容你一定不会感到非常陌生的。最后,我们还要提一下项目管理过程,也就是大家翘首以盼的 PMBOK 十大过程领域,当然,只是简单的介绍下,因为每个过程域我们在后面都会详细地学习。
硬核项目经理
2023/03/02
3890
【信管2.3】项目生命周期
项目管理-5大过程组-10大知识领域-47过程
1、启动过程组:获得授权,定义一个新项目或现有项目的一个新阶段,正式开始该项目或阶段的一组过程。 2、规划过程组:明确项目范围,优化目标,为实现目标而制定行动方案的一组过程。 3、执行过程组:完成项目管理计划中确定的工作以实现项目目标的一组过程。 4、监控过程组:跟踪、审查和调整项目进展与绩效,识别必要的计划变更并启动相应变更的一组过程。 5、收尾过程组:为完结所有过程组的所有活动以正式结束项目或阶段而实施的一组过程。
全栈程序员站长
2022/07/28
8220
项目管理-5大过程组-10大知识领域-47过程
信息系统项目管理师(高项复习笔记一)
信息系统项目管理师 属于计算机技术与软件(高级)专业技术资格。通过本考试的合格人员能够掌握信息系统项目管理的知识体系,具备管理大型、复杂信息系统项目和多项目的经验和能力;能根据需求组织制订可行的项目管理计划;能够组织项目实施,对项目的人员、资金、设备、进度和质量等进行管理,并能根据实际情况及时做出调整,系统地监督项目实施过程的绩效,保证项目在一定的约束条件下达到既定的项目目标;能分析和评估项目管理计划和成果;能在项目进展的早期发现问题,并有预防问题的措施;能协调信息系统项目所涉及的相关人员;具有高级工程师的实际工作能力和业务水平。
用户6367961
2021/11/18
2.8K0
信息系统项目管理师(高项复习笔记一)
【信管9.3】项目干系人管理
干系人,这三个字我们已经很早就见过了,相信你对它一定不会陌生。在我们的教材中,它是和项目沟通管理放在一起的,在同一个章节中讲完了,我们也遵循教材的顺序,将它和沟通放在一起。其实,在 PMP5 之前,也就是 PMP 前四版中,是没有项目干系人管理这个知识领域的。它本身就是从项目沟通管理中分出来的一个知识领域。而在 PMP 第六版时,又给它改了个名字叫做项目相关方管理,其实意思都是一样的。
硬核项目经理
2023/03/02
5330
【信管9.3】项目干系人管理
【信管4.3】确认与控制范围
在范围管理中,我们已经讲完了 4 个管理过程,剩下的两个过程就是对范围的确认以及在整个项目执行过程中进行范围的监控管理。这两个过程的内容都不多,所以今天的内容还是非常轻松的,在正式学习之前,我们先来看看 甘特图 是长什么样子的。
硬核项目经理
2023/03/02
3940
【信管4.3】确认与控制范围
从《致加西亚的信》看项目管理
很多领导者或者成功学大师很喜欢在不同的场合引用《致加西亚的信》的内容,以此来激励和教育别人怎样做事才是好员工,他们对文中的主人公罗文的做事风格钦佩不已。
SAP梦心
2018/05/29
1K2
从《致加西亚的信》看项目管理
【信管2.2】项目管理知识体系与组织结构
上一次课中,我们已经学过了项目以及项目管理的概念,这些内容帮我们认识到了项目到底是个什么东西,有什么特点,和运营有什么区别等等。今天我们就继续沿着项目这件事说下去,我们将一起探讨一下项目管理的知识体系以及我们的公司中都有哪些组织形式可以让我们的项目能够顺利进行。
硬核项目经理
2023/03/02
5050
【信管2.2】项目管理知识体系与组织结构
项目管理快速入门03--其他知识领域
之前介绍项目管理10大过程中,综合的整合管理,和"多快好省"4大核心过程,接下来介绍其他5类辅助管理,其中风险管理是重难点。 规划人力资源管理:识别和记录项目角色、职责、所需技能、报告关系,并编制
用户1216676
2018/01/24
7530
项目管理快速入门03--其他知识领域
【信管12.4】战略管理与组织级项目管理
战略这个词看着很高大上吧?不过千万不要以为只有董事长啊、总经理呀才需要战略眼光和战略管理。项目经理作为一个项目的第一负责人,也是需要有一定的战略思维的,而且所有的项目都是为组织的大战略服务的,所以,要想做好项目,战略思维也是不可或缺的。另外组织级的项目管理比我们针对单一项目的管理更高一层,也更复杂一些,多多了解一些也能让你在项目经理的道路上能够走得更远。
硬核项目经理
2023/03/02
3810
【信管12.4】战略管理与组织级项目管理
相关推荐
项目管理快速入门01--概论
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档