当前位置: 主页 > 影视基地 > >

高并发功用测试经历分享(下)

时间:2020-01-31来源:原创 作者:admin阅读:
  

  内存走漏  固然处理了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  编译后:  if (IsPoisoned(address)) {  ReportError(address, kAccessSize, kIsWrite);  }  *address=...; // or: ...=*address;  和valgrind清晰分歧的是,asan需求添加编译开关从新编译依次,好在不需求自己修改代码。而valgrind不需求编程依次就可以直接运转。address sanitizer集成在了clang编译器中,GCC 4.8版本以上才支撑。我们线上依次应用的gcc版本较低,因而我测试时直接应用clang从新编译nginx:  —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 | http://www.51testing.com/html/40/stackcollapse-perf.pl > out.perf-folded  3http://www.51testing.com/html/flamegraph.pl out.perf-folded>ou.svg

分享到:
最新评论 查看所有评论
加载中......
发表评论
用户名:(新注册) 密码: 匿名

栏目导航

推荐阅读

热门阅读