一、疑难杂症

从工作到现在,近几年在写C++大规模分布式系统相关,会遇到最头疼的几类问题,特别是新写大模块,或者重构功能基本都会遇到,如下:

  1. 内存泄漏
  2. 内存写坏
  3. 死锁
  4. 并发导致状态不对或者结果错误

上述几类问题,还可能互相夹杂影响,比如因为并发场景考虑不周全,任务引用计数获取和变化不原子,进而导致内存无法释放,结果不正确。
面对大规模C++工程,总会遇到上述问题,记录一些总结,方便查阅以及后续补充。

二、问题

2.1 内存泄漏

内存泄露有很多排查手段:

1. 检测工具类:

比如valgrind, valgrind是一个动态分析程序的工具框架。Valgrind工具可以自动检测许多内存管理(比如memcheck 模块)和线程错误。具体原理,这里不再赘述。从个人经验而言,valgrind对于中小规模程序检测特别有效,但是对于大规模系统,从曾经几次经验而来,并没有很好的效果,比如一些内存泄露场景,可能是需要高并发跑很久才能出现,而使用valgrind会很大影响程序的运行效率

2. 内存模块打标

这是个人觉得最为有效的使用方法,简而言之,对于每个内存占用的任务或者模块,需要有标记标识,同时后台支持打印这些MOD的内存占用。实现方式有很多,比如改造所有的内存分配器类似如下:

Allocator allocator;
// 初始化传入
allocator.init(int MOD_ID...)
// 分配内存传入
allocator.alloc(int MOD_ID...)

该方式在持续有内存泄露的时候,通过查看每个MOD的内存占用,很多情况下可以迅速定位具体的模块和任务,从而缩小排查的范围。
但是仍然也有例外,曾经查过一个内存泄露问题,MOD是数组类型,然后各处模块都用了数组类型,基本很难定位,该问题最终花了好几天查出来,也是个很有意思的问题。

3. eBPF & bcc

借助于内核提供的分析工具
BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪工具。
参考链接:BCC

BCC工具集如下:

其中通过memleak工具可以有效排查很多问题。但是也有一些限制:比如需要特定的内核版本,同时对应用程序有一定的影响。

4. 编码技巧

比如使用智能指针;比如设计任务或者类的析构函数,一定要尝试去释放所有内存

2.2 内存写坏

1. 工具类

(1) 比如valgrind;
(2) 比如Address Sanitizer(一个快速的内存错误检测工具)
(3) 比如借助一些工具,进行代码的静态检查,是否存在越界,是否存在线程局部变量过大等等

2. 程序运行检查

(1) 比如使用mprotect,参考之前一次排查文档:C+±如何排查内存写坏
(2) 程序关键数据结构,设计majic number, 特别是分配内存和释放内存,每次都检查是是否一致。设计校验和checksum等等
(3) vmalloc区域中广泛采用的guard page

3. 一些分析手段

类似之前的c++ 排查一次内存错乱问题

2.3 死锁

死锁问题很常见:一般通过pstack观察程序的堆栈,即可分析到现场。
死锁原因本质上是单个或多个模块因为加锁,导致形成资源的依赖。
场景比如:

  1. 单个线程重复加读锁,一个模块已经加锁了,但是因为逻辑复杂,调用一些函数,继续加该读锁,导致死锁
  2. 两个线程,因为加锁顺序,导致互相持有对方想获取的锁,类似如下场景:
存在锁lockA, lockB
线程A  获取lockA成功 尝试获取lockB
线程B  获取lockB成功 尝试获取lockA
导致死锁
  1. 调用层次不清楚
A模块获取lockA并持有
调用B模块或者B是回调,又尝试获取lockA

解决方式:

  1. pstack确认现场
  2. 大规模程序设计,一定有层次感,比如如果要获取一批同样的锁,按照统一的顺序来加锁

浅谈大规模C++工程中一些疑难杂症及解决方案相关推荐

  1. 简述autocad在测绘工程中的应用_浅谈AutoCAD在工程测绘制图中的应用

    龙源期刊网 http://www.qikan.com.cn 浅谈 AutoCAD 在工程测绘制图中的应用 作者:高振华 来源:<职业 · 下旬> 2011 年第 02 期 AutoCAD ...

  2. 嵌入式开发-浅谈嵌入式MCU开发中的三个常见误区

    浅谈嵌入式MCU开发中的三个常见误区 原创 2017-09-30 胡恩伟 汽车电子expert成长之路 目录 (1)嵌入式MCU与MPU的区分 (2)误区一:MCU的程序都是存储在片上Flash上,然 ...

  3. matlab 2015 积分,浅谈MATLAB在数值积分中的应用

    <浅谈MATLAB在数值积分中的应用.doc>由会员分享,可免费在线阅读全文,更多与<浅谈MATLAB在数值积分中的应用>相关文档资源请在帮帮文库(www.woc88.com) ...

  4. 计算机网络在教学上的应用,浅谈计算机网络在教学中的应用.doc

    浅谈计算机网络在教学中的应用 精品论文 参考文献 浅谈计算机网络在教学中的应用 冯 娟 湖北省咸丰县忠堡镇民族中学 445600 随着现代科学技术的飞速发展,现代信息技术以其生动形象.图像清晰.色彩艳 ...

  5. 数字化时代 需要利用计算机辅助,浅谈计算机辅助工业设计中的人机交互

    浅谈计算机辅助工业设计中的人机交互 论文关键词:工业设计 计算机辅助工业设计 人机交互 论文摘要:计算机辅助工业设计是工业设计未来的发展方向,本文从工业设计及计算机辅助工业设计的一般含义出发,探究计算 ...

  6. 浅谈大规模k8s集群关于events的那些坑

    浅谈大规模k8s集群关于events的那些坑 背景 一.用户通过kubectl list event 二.kubernetes-dashboard list events 三.直接在集群中list e ...

  7. 园林计算机制图在计算机上的应用,浅谈计算机在园林设计中应用

    浅谈计算机在园林设计中应用 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 浅谈计算机在园林设计中应用中图分类号:F224-39文献标识 ...

  8. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  9. 计算机技术在农业上应用论文,浅谈计算机在农业中的应用论文(2)

    浅谈计算机在农业中的应用论文篇二 <计算机技术在农业管理中的科学应用> 摘要:文章依据现代农业管理思想的内涵结合计算机应用技术的充分优势展开了如何在农业管理中全面应用计算机技术实现数字化. ...

最新文章

  1. pycharm 调试错误 Connection to Python debugger failed: Socket operation on nonsocket: configureBlocking
  2. 士兵杀敌(二)(线段树+树状数组)
  3. bugku ctf 域名解析
  4. 使用非常驻任务管理事件
  5. 2017GAITC丨尖峰对话:AI的第三次寒冬会不会到来?
  6. D3 dataset - what is usage of key function in data
  7. Python小白的数学建模课-B2. 新冠疫情 SI模型
  8. hbase 集群(完全分布式)方式安装
  9. wampserver的下载与安装配置
  10. 谷歌浏览器设置信任_Win10系统下谷歌浏览器怎么添加信任网址/站点
  11. xshell怎么上传文件
  12. 8K V-by-One LVDS信号发生器
  13. VT-x is disabled in BIOS错误解决
  14. 处理打拼音时触发input事件bug
  15. C语言班级财务管理系统
  16. 如何获取优酷视频的通用代码?
  17. cmd 下登陆ftp及相关操作
  18. Redis不同数据类型的查询命令语句
  19. 【JS】数据结构之树结构
  20. 理性做产品:用数据+漏斗、地图和路径来指引

热门文章

  1. Java实现回合制游戏
  2. 【ZT】Android Activity和Intent机制学习
  3. 网吧锁定计算机游戏账号号会掉吗,网吧玩游戏忘关电脑就回家,第2天登上游戏账号,玩家想哭...
  4. 梯度下降法介绍( 案列:波士顿放假预测)
  5. SAP 在windows上解压SAR文件(SAP SNOTE)
  6. linux nc反弹命令,详解NC反弹shell的几种方法
  7. 批量重命名利器——Bulk Rename Utility
  8. 救救孩子(自强程序员ing)
  9. 多智能体强化学习之QMIX
  10. MATLAB实现遗传算法、模拟退火遗传算法求解避障路径规划问题——计算智能作业