背景
最近工程项目实现个功能,出现了BUG,记录一下
场景简述如下:
有个模块,一组线程池来做类似任务的格式化操作。每个任务包含若干条数据。
但是发现跑一段时间,会出现输出数据错乱,或者数据校验不正确的问题,而且每次位置都不相同,偶尔core的位置也不相同。初步看了下,怀疑是内存错乱了或者内存写坏了
分析
- 初步review了新加的代码应该没问题的,同时分析代码逻辑,怀疑数据错乱一定发生在了格式化的模块中
- 打开Debug日志,观察了如下有效信息:
前一个组件A[数据格式化之前的模块],打印出了每个任务,以及包含具体的数据个数
在格式化模块,发现一个规律,包含大于100条的数据的任务,都没有正常统计打印出来 - 分析了下逻辑,之前做了优化:批量格式化功能,简述是默认100为最小粒度在同一个线程工作;超过100,然后会轮转到别的线程,提高并发度。怀疑并发内存写坏了。
- 结论:任务使用的一个内存分配器不是线程安全的~~~导致当单个任务超过100条数据,出现多线程场景下,分配的内存不能保证线程安全,从而内存写坏
- 修复方案:改变新加的任务内存分配器