理想的Tokyo Tyrant
敝公司在使用Tokyo Tyrant这个高性能的key-value DB,总的来说,性能相当不错,不过在数量达到50M之后有明显的瓶颈,以至于我们3000的TPS都有点困难了。究其原因,是因为我们用的是hash db,文件大了以后,任何一个写操作都在硬盘不同地点,于是就是对硬盘的完全的随机写,在我们的RAID10上,也只能做到100多IOPS,可想而知,效率是多么的低下了。
其实最直观的解决方案就是换SSD硬盘,比如INTEL的MLC SSD硬盘号称可以达到8500 writes/second。不过这个可能需要一些沟通和批准的工作,而且对于Engineering最有意思的就是在现有的条件下,实现最大的可能,所以,我们可以做点什么呢?
- 不立刻写入硬盘,而是类似Cassandra和Redis那样,只写入redo log(ulog),就返回。另外在后台有一个线程,定期将dirty data写入硬盘。这个写入应该是顺序写入的,以避免随机写的问题——我们的硬盘顺序写可以有80M/s,还算不错了。
- 这也就意味着要缓存不少的数据,为了高效,所有的写数据都应该被缓存——很可能会被读,不过现在内存应该也不是大问题,而且我们的TT跑了一段时间之后,对硬盘的读就没有了——全部被操作系统缓存了,所以读不是什么问题。
- 写入线程要考虑如何和其他的线程一起工作——它不能锁住所有的线程,所以考虑是不是把数据库分段?可以参考以下redis之类的?
- 删除的处理,删除了数据之后就留下空穴,那么必须要有一个defragment的线程。更新等同于删除+新增。
- 如果该进程crash了,重启的时候要replay redo log,这个跟上一点有关系,因为可能不能得到一个完整的某一个时刻的snapshot。
- 要能支持多台机器的master-master复制,master-slave比较麻烦,failover之后还要手动切换。应该是都是没有任何区别的master,因为他们的数据都是相同的。我们的数据特点是,量大,不过每条数据都不大,100字节足够,所以并不是很需要consistent hash。
为什么不用Redis?Redis要求所有的数据都在内存里,对于我们公司的应用来说,有时候有点困难——想象如果有1亿条记录,光hash的bucket(64 bit)就要0.8G,用mmap还是靠谱一点。最好是常用的在内存里,不常用的就待在硬盘上就好了。我们的数据大概一半以上都很不常用。
Cassandra也试了一下,不过似乎有更多的问题,它的读效率实在太低, 因为需要从硬盘load sstable,这个就是一个随机读的问题的,再用Java实现,读的TPS只有不到100. 解决方案就是使用Key cache和 Row cache,不过那又是把很多数据load在内存里,而且warm up似乎很慢。(为什么会比Tokyo慢?)
20100607
有时候人的表现欲来了,就什么都愿意说。有时候又懒到数月无话。
今天有两个有意思的事情。其实也没什么大不了的,不过还算好玩。
一个是我们一个同事启动敝公司的一个WLS server,折腾了一天,总是起不来,WLS刚启动之后就报,shutdown hook被调用了,然后就死了。作为前BEA的员工,被认为是专家,于是就得帮人消灾。先是以为是terminal退出导致SIGHUP造成的,不过一看WLS的参数里有-Xrs,看来不是signal的问题。难道有人在后台kill?用truss跟踪一下,居然看到了有SIGSEGV的消息,不过看起来不像,要是真SIGSEGV了,早就core dump了。后来想,还是老老实实配一个debugger,跟踪一下System.exit()吧。一直不想搞这个是因为eclipse连美国的机器特慢,WLS的线程又超多(我们自己也在WLS里启线程),后来就练习了一下jdb. 虽然不够好用,不过做这个事情还是够了。要是真的是production系统上,还真可能只能用这个东西了(最好永远别用上)。结果很简单,license check的程序调了System.exit(),update一下就好了。
另外最近比较迷python。发现这个东西写程序的确比较简洁,在很多情况下可以提高productivity。比如他是不需要编译的。比如他的语法很灵活。今天学到的是用它分析一个C程序生成的数据文件。是什么C程序呢?Tokyo Tyrant,一个memcached的变种。效率不错,附带持久化。但是不知道为什么某些值总是插入失败。我们的工程师没有什么头绪。Python如何分析呢?当然得根据这个文件的结构来。这个文件(hash的数据库)先是256字节的header,然后是hash bucket*8byte的hash桶,桶里是每个record在文件中的偏移,其实就是一个索引啦。再后面是一个不知道多大的free record list,大概是指出文件中的空穴(delete带来的)。然后就是一个一个的record。
一开始还不明白该怎么搞,后来发现它的str可以放任何东西,其实就是一个byte array。(python没有byte[])。然后还有一个很强大的struct包,很容易就可以解析C的那种struct的内容。比如:
就可以得到(4, 10, 10485751, 3154959, 388634224, 83890432),其中10485751就是bucket的大小,83890432则是第一个record的偏移量。然后从256byte开始遍历10485751个hash值,把非0的偏移的记录都读出来,结果发现,所有的199M-228M之间的内容全是0。于是得出结论说,在那个时候,应该是发生了点事情,比如硬盘满了。。。
嗯哼。满意了。不过python的IO似乎有点慢,CPU使用率很低。还要加油啊。Java现在已经很不错了。
ADF: 一坨软件
有两种方式构建软件设计:一种是把软件做得很简单以至于明显找不到缺陷;另一种是把它做得很复杂以至于找不到明显的缺陷。
这是在oracle一篇没完成的文章。当时我们用ADF这个框架写程序。这个东西搞得太复杂了,到处都是bug,所以感叹说,也不知道这个东西到底有没有什么问题。
When the DPC uses too much CPU
现在用联想的一个X200,最近发现CPU总是不闲着,用电池消耗的也特别快,用Process Explorer看了一下,报告说DPC占很多的CPU时间:
这个很不懂,要是一般的进程,杀掉就可以了,比如传说中的firefox就喜欢吃内存和CPU(其实很多时候是flash闹的),DPC叫 Deferred Procedure Call, 是Windows用来处理中断的玩意,这个东西咋办呢?
研究了一下发现 Windows DDK 的 tracelog 不错。 Windows DDK是驱动开发的工具包,其实我只要里面的一个tracelog.exe,和tracerpt.exe,网上找不到,害得我去当了最新的Windows DDK 7.0。参见这里:How much time is your driver spending in its DPCs and ISRs?
运行:
tracelog -start -f test01.etl -dpcisr -UsePerfCounter tracelog -stop tracerpt test01.etl -report d.txt -df
结果如下(节选):
DPC processor utilization for the whole trace +--------------------------------------------------------+ | Processor Utilization Module Address | +--------------------------------------------------------+ | 0 18.34% ntkrnlpa.exe 8050327A | | 1 0.00% ntkrnlpa.exe 8050327A | | 0 16.92% chdau32.sys A5CC2DC6 | | 1 0.00% chdau32.sys A5CC2DC6 |
ntkrnlpa.exe没啥好看的,windows kernel,看看chdau32.sys吧,在同一个文件中:
+--------------------------------------------------------------------------------+ | Distribution of chdau32.sys (A5CC2DC6) DPC execution times for the whole trace | +--------------------------------------------------------------------------------+ | Lower Bound Upper Bound Count Percent | +--------------------------------------------------------------------------------+ | 0 1 0 0.00% | ....... | 50 100 0 0.00% | | 100 250 0 0.00% | | 250 500 0 0.00% | | 500 1000 636 13.94% | | 1000 2500 3927 86.06% | +--------------------------------------------------------------------------------+ | 4563 100.00% | +--------------------------------------------------------------------------------+
这个肯定是有问题的,因为windows建议DPC的处理不能超过100ms,这个显然超过了很多,所以这就是罪魁祸首了。这个驱动属于Conexant 20561 SmartAudio HD, Disable掉这个驱动,果然CPU就没有人占用了!DPC也基本就是0了。
这个驱动别的地方没有,只有联想的网站上有,更新到最新的,还是不能解决这个问题,只好Disable他了。不过有趣的是,当我播放一点音乐或者弄点什么声音的时候,它的DPC处理就很好!真有意思……
另外还有两个工具,一个是DPC Latency Check的工具,这个工具显示目前系统的Latency,Latency高的系统播放电影、声音的时候就会产生不连贯的现象。我的系统默认就是黄色的!但是如果disable了Conexant 20561的该死的声卡,或者播放点音乐,它就变成绿色的了。
另外一个是微软的RATTv3,这个提供跟tracelog很类似的功能,不过结果不是很准确,也能弄出点结果来。而且,它还有GUI呢——一个Tray Icon.
世界上最流行的IMEI
IMEI是International Mobile Equipment Identity的意思。顾名思义,就是每个手机所拥有的一个识别号,中文大概叫串号。如网卡地址一样,IMEI号理论上应该是全球唯一的,我们挑手机的时候也会输入*#06#什么的去验证是不是三码合一。如果这样来说,怎么会有最流行的IMEI之说呢?很有趣的是,最近在一个运营商那里就见到了,这个IMEI号就是:135790246811220。为什么?这个号是著名的MTK芯片里面的Sample Code里写的一个IMEI号码,中国很多的山寨厂商都不遵守IMEI分配的规定,他们根本就不管这个是干什么的,就直接使用这个IMEI号,然后很多这样的手机就卖到了某个发展中国家,于是就给我们的软件带来了很多问题——我们一直默认IMEI是唯一的。
叫我怎么说山寨好呢?
如何移动Vista上的用户目录
最近终于开始使用vista了。一个好的改动就是把”Documents and settings”这个目录改成Users这个目录了,可惜Program Files还是没改——空格很讨厌的,尤其你在使用命令行的时候,就可能需要用到引号。
不过Vista默认的用户目录还是在C:\Users。多年来的一个习惯就是把用户目录给转移到另外一个盘,这样如果那天不高兴了,把C盘ghost一遍就好了。Windows为什么不能在安装的时候让人选择一下呢?
在那些古老的XP的时代,一般只要把My documents这个目录移动一下就好了。不过桌面什么的最后还是要清理一下。Vista的那些文件就直接放在C:\Users下面了,比如什么下载,文档,音乐、图片什么的。一个简单的办法还是在那些文件夹上右键,选择属性/位置/然后按移动按钮。不过这样要一个一个的挪很多的文件夹,很麻烦。
Google了一下,网上被引用最多的是Joshua Mouch的这篇Change User Profile Folder Location in Vista。不过这个文章搞得太复杂了,是要把整个C:\Users给挪到别的地方去。作为个人的电脑,我只要把我自己的文件夹给挪走就可以了。所以决定用以前XP的方法试一试,结果还真成了。
- 假设目前要被挪的用户id叫sma。Vista上默认administrator账户是被禁用的,我也不想折腾他,所以创建一个新用户,比如叫root。给他Administrators的组权限。
- 注销当前用户,以root账号登录。
- 按Win-Pause键。或者计算机右键->属性。左侧栏选高级系统设置(看着好怕怕,好高级啊)。继续选高级tab,用户配置文件,点设置。
- 选择computer name\sma那个项目,点复制到…,然后把这个profile复制到任何想要的目录,比如D:\Profiles\sma。
- 把C:\Users\sma这个目录改叫sma.del
- 改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList,底下会有一些S-1-5-…..的长目录,其中一个ProfileImagePath的值是C:\Users\sma,把它改成刚才拷贝过去的位置(d:\profiles\sma)。
- 如果愿意,找个工具把注册表里的C:\Users\sma全部替换为D:\profiles\sma。我搜了一下,不是很多。大多数是Recent open files之类的,无关紧要。用windows的reg命令也可以做简单的搜索。
- 注销,用原来的账号登录,应该就可以了。如果一切ok,就可以删掉c:\Users\sma.del这个目录了。root账号不要删,下回ghost回来之后可能还有用。
完。
GTK 和 Qt
看到一则新闻。
诺基亚宣布Maemo换用Qt
Maemo是针对互联网终端设备,基于GNU/Linux操作系统和GNOME/GTK+桌面技术的开源平台,于2005年首次推出,是众多支持Wi-Fi 的Internet Tablet 所用OS 的基础,如诺基亚N800和新款N810。
Nokia买了Trolltech,当然应该换用Qt。不过我很诧异Nokia居然在这个Maemo的早期版本居然真的把GTK+用起来了。要知道,我们在Moto花了很多的精力,也是想把GTK用在手机平台上,不过GTK根本不是为嵌入式系统设计的,有很多的问题,比如占用内存过多(开个buffer就上M),还有一些内存泄露的问题。桌面系统可能没什么,但是手机就比较麻烦了。Moto最终也没有解决这个问题,所以很诧异Nokia真的做了一个可以用的Maemo版本。
后来Moto北京这边都做Qt了,我还是比较喜欢Qt的。都什么时代了,还搞C语言啊。而且还用C语言做出来多态,实在是太变态了。最神奇的是,现在的Linux软件,大量的还是使用GTK开发的。我猜,可能是因为GTK不是被一个公司所拥有的吧?
推荐一下Balsamiq,很赞的UI草图设计软件
最近要开发一个J2EE的程序,做几个小页面,需要画几个原型。老板推荐了一个叫做Balsamiq的软件,不过是收费的,79$一个。好在”邪恶”的作者提供了一种免费获得注册码的办法,就是写一篇blog来介绍这个软件。
当然,我并不是想通过这种方式来获得注册码,因为我搞了一个反编译软件,偷偷的看了注册码是如何生成的。嗯,作者也很乖,连class的名字都叫KeyGenerator。于是我就给自己注册了一下,还真成功了。不过,这个软件真的很好用,画一个web页面的草图很容易,所以还是要推荐一下,就算是给自己补过吧。
这个软件是用Adobe AIR写的,跨平台性很好。这点Java真是没法比啊。
下面我画的两个草图,要是用word或者visio,也可以画,只是时间就海了去了。
当然,画Windows的界面也是没有问题。甚至,它还内置了IPhone的框架:
如何删除Add Remove Programs删不掉的程序
讨厌windows在c:\windows下放好多没用的东西,一个原因是总是ghost C盘,这样哪天洁癖发作或者被病毒搞了,直接ghost回来。于是就删删删,把C弄的比较小。经常删的或者挪地方的有:
- \pagefile.sys
- \hibernate.sys
- \MSOCache*
- \Windows目录下:
- $hg_mig$
- $NtUninstallKb*$
- Intaller
- ie7
- Driver Cache
- ServicePackFiles
- SoftwareDistribution\Download
- system32\dllcache
这样大概能删掉至少1G的东西。有的东西不能删的,就在d盘建一个目录,用junction.exe(大约等于unix下的ln,sysinternals suite里面有)把它link过来。比如据说$hg_mig$就不能随便删。否则,windows update据说会有问题。
Installer目录也不能随便搞——我就总是因为搞它出问题。一次是安装新版的live messenger,旧版的因为我把Installer目录下的msp文件删了,无法卸载,新的也就没法装。重新安装一会也不行。很抓狂。不过这不算什么,我们总是可以蛮力删文件,并且改注册表——反正messenger的注册表项不是很多。但是今天遇到了一个麻烦的事情,装了office 2k3的sp3,然后删掉了msocache,并且不小心把installer目录弄没了——我junction到D盘了,但是不知怎么的内容没有了。于是每次启动outlook,MSI installer都跳出来,然后说某个安装盘找不到blah blah,很是piss off。卸载,没戏。直接安装覆盖?还是没戏。蛮力卸载?MS Knowledge base里也有,只是太麻烦了。不过还好,有万能的google。微软提供了一个windows installer cleanup tool,这个可以在installer数据库里删除某个程序的安装信息,就当这个程序没装过一样,然后就可以重新安装这个程序了。如果想卸载,那也没有任何问题。很好,很强大。
Windows installer cleanup tool: http://support.microsoft.com/kb/290301
软件质量的思考
最近跟一个业内人士K聊天,讲到下面的故事:某国内软件公司人士J跟K抱怨说,你看,我们公司跟你们一样的写文档,一样的code review,甚至可能做的比你们还多,为什么我们做出来的东西总是感觉差那么一截呢?
是啊,为什么呢?是不是说,我们有了合适的软件的过程,比如严格定义的waterfall model或者scrum,甚至CMM这样的东西,外加严格的Policy,比如unit test coverage比如85%以上,kill all bugs with priority 1-3,就能保证软件的质量?好像不行。这些如果放在传统意义的生产型企业,也许可以,因为大多数生产是由机器来完成的,只要按照手册做事情就好了。但是软件业,是由一群mind worker来完成的,所以process只是一些辅助工具,最重要的,还要看执行这些process的人。这是我对这个问题的答案。
好像说了一段废话,谁不知道“二十一世纪人才最重要”?不过,还有别的么?
接下来的问题,如何找到合适的人呢?






