栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

记一个日志打印性能瓶颈排查过程(C/C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记一个日志打印性能瓶颈排查过程(C/C++)

前提:

debug需要,在一段被频繁调用的代码块中加入了大量的日志输出,同时 也问题复现也对系统有一定的性能要求,但是加上日志后发现该部分性能显著下降,于是开始尝试解决该问题

首先换了tmfs文件的日志输出,发现性能仍然辣鸡

然后perf 查看进程的开销,发现vfprintf 开销明显异常,一开始以为是直接在主线程write导致(有部分原因但不是主因)

后来发现sprintf也会调用该函数,之后又怀疑是sprintf太多导致了主线程速度变慢 恰好在调试write的时候也把日志fmt输出的vsprintf关闭过,但是性能仍然无明显提升。

此时重新打开了perf 发现native_queued_spin_lock 开销也是明显异常,终于怀疑是锁导致的问题,后来发现前人在写日志系统时为了线程安全调用了localtime_r 的函数获取时间, 直接导致多线程狂打日志时的争锁开销无限放大

后续解决办法:

使用thread_local实现了一个自己的线程安全的localtime_r 函数,然后使用tmfs日志作为输出对象,发现性能明显好转,问题解决 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号