12 2008存档

钢琴曲

| | Comments (0) | TrackBacks (0)
      每一段音乐都是一段记忆。
      昨天又听到了理查德.克莱德曼的钢琴曲,何等熟悉。第一次听到他的钢琴曲是在我初一的暑假,老爸跑长途回来,买了几盘磁带(当然,盗版),司机嘛,车上没 有磁带听跑长途会很闷的(所以家里有很多很多相声磁带),我放来听,觉得棒极了。尤其是改版的《命运》,这样的柔化处理肯定会被交响乐爱好者所鄙夷,但是 对我们这样的普通人来说,却刚刚好。
      那个暑假天气很好,每天阳光明媚却不炎热,我每天要么搞搞盆栽、要么看看电视、要么写写毛笔字(怎么听起来像退休老 头?不过当时确实如此),相当悠闲惬意。昨天一听钢琴曲,仿佛一下子穿越了时空,我仿佛又触到了那时温暖湿润的空气、看到了耀眼的阳光和郁郁葱葱的绿色、 听到了老爸跑车回家得意洋洋的叫门声....

多线程调试

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

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

饭馆

| | Comments (0) | TrackBacks (0)
       周一晚上去离公司稍远的二月二春饼店吃饭,感觉环境和服务都很不错,春饼也挺好,奇怪的是生意很清淡。想想家附近的麻辣烫和包子铺,东西都做的不错,可就是生意 一般般。相比公司附近的那几家“黑店”,不是超贵(京尊烤鸭),就是饭菜超油(马兰拉面),不是上菜太晚(牛大王),就是服务极为恶劣(柴家湾服务员语 录:“我们这儿都成你们食堂了!”,喔,你开饭馆的,不做食堂你想做人民大会堂吗!?),但一到中午或晚上,生意都好得不行,就因为吃的人实在太多,做得 差它也有生意!真是太不公平了。
       想想这个CBD,也不知道大伙儿为什么爱往这儿挤,搞得附近几家烂餐馆还得宠的不行,唉!
      04年的时候装了个RedHat 9.0,用了两三个月,在某次编译内核重启失败后换回了windows。
      最近又想起来装个linux玩玩,公司同事很多装ubuntu的,我要是再装一样的就没意思了,所以刻了个fedora 9 的DVD回家装。安装过程和当年装redhat一样,图形化界面,方便。
      装完后我把DVD设成软件包的源,结果麻烦了,装xmms,源里没有,装mplayer,源里没有, 装xfce,源里又没有,下了个xfce来装,又说少了什么vte,下了vte来装,装完了xfce还是说找不到vte....自己装咋就这么费 劲?....唉,最后改回网络做源,才顺利装了xfce,发现xfce界面响应也不是传说中的那么快,似乎和gnome差不多。
       装个mplayer麻烦,装个xmms老崩,用个bt又死慢....linux还是开发和工作用吧,娱乐还是不太适合。
      原先为了在多线程环境下使用bdb,还专门在调用其API前加线程锁。自己加锁除了多出工作量以外,还有一个麻烦:当一个DB的数据很大时,对它的加锁粒度就太大了,会拖慢性能。
后来才发现bdb自己是可以在多线程环境下使用的,只是在DB_ENV初始化时需要加标记:

    DB_ENV *dbenv;
    u_int32_t flags;
    
    flags | = DB_THREAD;
    dbenv->open(dbenv, “/home/data/”, flags, 0);

      在这个DB_ENV下的操作就是线程安全的了,不过还有一点要注意,就是get数据时作为value的DBT需要加DB_DBT_THREAD标记(参考):

    DBT tKey,tValue;
    tValue.flags = DB_DBT_MALLOC;
    ...
    int ret=m_dbp->get(m_dbp,NULL,&tKey,&tValue,0);
    ...
    free(tValue.data);    //由于tValue.data指向的内存是bdb用malloc分配的,所以现在需要用户自己free

       使用bdb自己的多线程支持比外部加锁方便、高效很多。

关于存档

This page is an archive of entries from 12 2008 listed from newest to oldest.

11 2008 is the previous archive.

01 2009 is the next archive.

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