socket编程项目性能优化之perf trace实践

哑域析取
• 阅读 2407

在一个网络编程性能优化项目中,利用perf trace进行性能分析。
背景:一个进程负责处理socket消息,在需要处理消息数量达到32k条100+字节的消息量时,耗时大概需要25分钟
目标:定位耗时的热区
环境:linux

假设1:用户态耗时多,进程耗时多是消耗在算法计算上?

该进程只进行简单的消息处理,不涉及过多数据结构和算法,排除该可能性。

假设2:系统态耗时多,进程耗时多是消耗在系统调用上?

由于消息量大,进行了32k*n 数量级的系统调用,假设有可能成立。


在这里,选择使用linux的perf工具进行统计分析:
perf trace -p $PID -s

socket编程项目性能优化之perf trace实践

由上图可见,在处理一条消息的过程中,大致流程涉及到与socket相关的 poll->recvfrom->sendto,同时还有与文件IO相关的系统调用。处理32k条消息,涉及到的系统调用数量在数量级上符合预期。

  • 指标统计分析:
    fsync(), 该系统调用用时最多,消耗了大概15分钟。该系统调用用于同步写入磁盘,调用后会阻塞,直至等待内核缓冲区数据写入磁盘后,内核才会返回。定位到该系统调用位于进程的日志模块。
  • 针对该系统调用改善:
    业务数据日志,降低其日志等级,在运行进程时通过日志等级开发将对应的等级关闭,减少日志输出;同时在日志模块中删除fsync()调用,该类日志不需要实时同步至磁盘中。

socket编程项目性能优化之perf trace实践

重新执行相同的测试,进程总用时大约50s。从本次检测到的系统调用指标来看,解决了fsync()带来了极大的提升空间。


在这个实践中,可以看到perf trace的一个用处:统计一定时间内的系统调用的次数以及其耗时分布。

思考1:perf trace统计的系统调用,各列中的时间是系统时间还是时钟时间?个人认为是时钟时间,因为尽管是系统调用,内核态也会处于一种阻塞状态,该状态不消耗CPU资源。例如进程调用fsync(),陷入内核态,DMA把系统缓冲区的数据同步至磁盘,此过程进程睡眠,没有占用CPU资源,同步至磁盘完成后,DMA会中断,CPU进行响应处理,此时fsync()调用结束,返回用户态。

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
把帆帆喂饱 把帆帆喂饱
3年前
登陆时间的优化
登陆时间的优化这是一个登陆的请求,在项目启动后首次调用,耗时近800ms,而第二次调用改接口时则只花费了29ms,性能有较大的提升空间。下面针对此问题进行一系列的优化。耗时排查项目启动后清空日志,然后调用接口,发现会创建一个dispatcherServle
Stella981 Stella981
4年前
Apache Synapse 远程代码执行漏洞(CVE
!(https://oscimg.oschina.net/oscnet/435fc4cde65d4aee9a2efca3080cb89e.png)0x00事件背景ApacheSynapse是一个简单、轻量级的高性能企业服务总线(ESB),它是在ApacheSoftwareFoun
Wesley13 Wesley13
4年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
Socket接口固定QPS性能测试实践
在学习了Socket协议的知识和完善固定QPS压测模型之后,打算对Socket.IO协议的接口进行一波压测实践,来验证自己写的功能是否存在BUG和更多能做的优化空间。总结下来,修复了两三个BUG,性能测试进度条的计算方式进行了优化,不然在类似Socket这种异步处理的请求,可能会由于统计的doing()方法耗时太少
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
MySQL 快速创建千万级测试数据
备注:此文章的数据量在100W,如果想要千万级,调大数量即可,但是不要大量使用rand()或者uuid()会导致性能下降背景在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建大量的基础数据供我们测试,模拟线上的真实环境。废话,总不能让我去线上去测试吧,会被DBA砍死的创建测试数据的方式
哑域析取
哑域析取
Lv1
西北望乡何处是,东南见月几回圆。
文章
5
粉丝
0
获赞
0