多线程调试

      对一个多线程的程序做性能测试时发现不管开多少个线程,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的级别就直接加了一个线程锁,结果即使不打印日志,也会锁住线程,造成了运行效率的低下。

      看来调程序还是要先怀疑自己,再怀疑别人。


相关文章

分类

2 Comments

yu said:

同情一下.
你改的那个log4cpp,是不是也要fix一下了

DongHao Author Profile Page said:

log4cpp的使用者不一定都用多线程,所以提倡的是使用者自己加线程锁,灵活。当然,我也不介意改改 :),但我在哪个svn目录上改呢?

留言:

关于文章

This page contains a single entry by DongHao published on 12 17, 2008 11:23 AM.

饭馆 was the previous entry in this blog.

钢琴曲 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.