昨天走之前测试的时候瞥了一眼,突然发现Linux(CentOS)下面调用外部函数的时间居然比调用脚本函数的时间还要多得多,这是不应该的。当时已经晚了,我没有继续测试。
回到家里我仔细想了想,外部函数和内部函数不同之处在于每次返回的时候都会检查脚本线程使用的tick是否已经超过了预期,如果是则需要进行调度。莫非是取tick的函数执行的太慢?
Windows下面取tick用的是GetTickCount(),虽然这个精度很低,但是速度的确很快。Mac/Linux下面用的都是gettimeofday,Mac下表现的很正常,只是Linux不正常。考虑到这个函数的精度很高(见前文,现在可以真正有微秒级的精度),需要硬件支持,可能问题就出在这里。
今天中午我到公司一测,果然:在Linux下面执行gettimeofday居然用了0.9us,在这台机器上执行一条VM指令也不过才0.02us,这个调用果然有点问题。
显然应该不是所有版本的Linux都会如此,应该和系统内核所配备的驱动程序有关。当初在给问道更换服务器的时候,曾经出现过新装的机器承载人数比老的机器低40%以上的情况。当时我实测了一下环境,CPU很快、内存吞吐很快,服务器耗在网络上的资源也很少,而剩下的脚本逻辑VM基本都不会和系统调用打交道(除了网络,无任何IO),后来将服务器的Linux版本从RedHat4降级到RedHat3解决了问题,说明和驱动相关的可能很大。目前看来,时间函数可能是原因之一。
your blog is very nice......
回复删除