多线程调试
对一个多线程的程序做性能测试时发现不管开多少个线程,CPU的使用率总是停留在160%左右,对于四核的CPU,这显然太低了,肯定是程序里哪部分对线
程锁的使用不当。我第一感觉就把问题定在了BerkeleyDB的
get上,因为打开ENV时我用了DB_THREAD参数,会不会是BDB的线程锁造成的?大概看了看BDB的源码,唔....每个ENV带一个
mutex的HANDLE,这线程锁范围还挺寬,整整锁了一个ENV,也不管里面有多少个DB;而且还是mutex,而不是读写锁,估计即使是get,也
会造成cache的变化,所以只能用互斥锁了。
于是改程序:一个进程开多个ENV,减少互斥的机会,结果CPU利用率几乎没变;再改:多个进程,每个进程管一个ENV,CPU利用率就上去了!难道 BDB的锁和进程还有关系?干脆,一句句的注释掉代码,一步一步的测性能,最后发现,问题出在我自己写的Log::Debug()函数里,这里面不判断 log的级别就直接加了一个线程锁,结果即使不打印日志,也会锁住线程,造成了运行效率的低下。
看来调程序还是要先怀疑自己,再怀疑别人。
相关文章
- 客服琐记 - 08 12, 2010
- 多线程并非万金油 - 07 13, 2010
- BerkeleyDB删除数据时的“内存泄漏”问题 - 04 08, 2009
同情一下.
你改的那个log4cpp,是不是也要fix一下了
log4cpp的使用者不一定都用多线程,所以提倡的是使用者自己加线程锁,灵活。当然,我也不介意改改 :),但我在哪个svn目录上改呢?