用strace查看进程的系统调用后,发现一个std::async滥用问题
问题现象
进程的系统调用clone次数持续增加
使用工具strace发现进程clone系统调用过多且一直在增加
strace -c -p PID
问题分析
clone在做什么:创建进程(线程)
查看系统调用,clone在创建进程或者线程的时候会被调用
问题确认
找到问题代码 查看源码,找到问题根源。进程会在一个循环中反复调用 std::async
而std::async会创建线程,因此会有clone系统调用
而这个循环是10Hz,也就是一秒钟执行20次,那么长时间运行之后就会有大量的线程被创建和销毁
问题原因
为什么会这么设计
每次循环中的任务执行时间比较长,为了加速,将任务分为A和B两部分
A部分在循环体中进行,B部分在异步线程执行
即std::async异步完成B,循环中的代码完成A
解决办法
引入线程池,避免线程反复创建和销毁带来的开销
将B部分放到线程池中运行