操作系统: 04 2011存档

上周发现我的一个程序在测试并发压力时,在rhel4上性能不错但在rhel5上性能却下降很厉害,非常诡异。我们基本相信redhat不会有什么问题,那八成是我的kernel module写的有问题,于是我把module里对不同kernel版本的判断拿掉,再跑,还是性能低。这下要命了,如果是某些kernel module的接口变了,那查起来就费时间了。
还是史峰高超,他发现了随着并发的增加,性能会进保持在一个“高原”上,于是让我做个小实验:写一个程序,就调用ioctl故意触发module,多跑几个实例。这下问题明显了:这个测试程序,不管启动多少个实例,他们加起来耗费的CPU基本就是100%左右(甚至有时还低),问题明朗化了——看来ioctl八成有锁,多进程不能同时调用进去。
于是看kernel代码,原来从2.6.11开始,file_operations除了ioctl,还增加了一个接口——unlocked_ioctl(rhel5用的是2.6.18 kernel)。于是改我的module,原先实现ioctl接口,现在改为实现unlocked_ioctl,性能一下子上去了。感谢史峰!

性能问题解决了,但是还存有疑问,因为我发现rhel4(2.6.9 kernel)上的ioctl也是加了“大内核锁”的:
lock_kernel()
ops->ioctl()
unlock_kernel()
这太不公平了,rhel5上有lock_kernel,ioctl性能大降,rhel4u上也有lock_kernel,ioctl咋就性能还凑合呢?
查了ULK3,原来有个说法:大内核锁在2.6.11之前是一个高效的spinlock,而在此之后,由于大量的kernel代码都慢慢弃用大内核锁(比如改用unlocked_ioctl),大内核锁的实现就变为了可能引发睡眠的mutex(睡眠就睡眠呗,反正大内核锁现在处于“逐步弃用“的阶段,以后就没了),所以性能有退化。

虚拟机测试

| | Comments (3) | TrackBacks (0)
上周做虚拟机的性能测试(主要测磁盘IO和网络),装了不少系统。总体感觉xen从console装rhel5还是很吃力的,因为它不支持....非得自己去改安装盘,或者改用图形界面安装,可惜我们的服务器都在千里之外,用X forward到本地那是非常的慢。
我们不仅测试了rhel,还测试了suse 11,还是这只变色龙更体贴,它认出了我们是console安装,自动启用了一个终端图形界面(就是ncurses做的那种),安装那个顺哪,是我上周最惬意的时刻。
但是在suse 11上装xen以后,针对虚拟机的bridge网络并没有自动配上(这是suse 11不如rhel 5的地方),需要手工运行:
/etc/xen/script/network-bridge
即可。

在suse 11上装上xen虚拟机,发现其它机器ping得通它,但是却ssh不上,八成是防火墙,于是service iptables stop,发现suse 11上没有这个服务,原来,它自己做了一个防火墙叫SuSEfirewall2,用
service SuSEfirewall2 stop
关掉了。
 
从一周多的测试看,KVM相比xen是更好的选择,尤其在一台实体机上启动多个虚拟机时,xen虚拟机的IO性能退化严重(哪怕是paravirt),而KVM就要好很多。


====== 2011.04.19 ======

由于chaos同学对我们的虚拟机性能测试结果存在怀疑,遂附上详细测试报表,在里面,我们测了
xen(hvm)  xen(paravirt)  kvm(rhel6 guest) kvm(rhel5u6 guest)四种组合,其中xen的host和guest都是rhel5u6。

报表里的seq read是sequence read的意思,ran read是random read的意思,详见fio

我们测read用的是:
fio -readonly -name iops -rw=[read/randread] - runtime=200 -iodepth 1 -filename /dev/sda -ioengine libaio -direct=1

测write用的配置文件是:

[test]

rw=randwrite

size=800m

directory=/root/data

ioengine=libaio

direct=1

不知其他同学跟我测的结果是否有出入