纳斯达克OMX的交易运行在数千台Linux服务器上,这些服务器要处理实时事务,监控和进展情况,这种环境最大的挑战就是性能,实际货币的汇率取决于交易是否能跟得上订单流,延迟和吞吐量变得非常关键,订单必须在有限的时间内响应(和执行),不用说,可靠性也非常重要,停机几乎是不被允许的。
为了全面满足这些要求,纳斯达克OMX集团部署了许多大型计算集群,它们每天可以处理数亿笔订单,在延迟时间为25毫秒的情况下,每秒最快可以处理一百万笔订单。
Bob说近年来Linux引入了许多有用的技术,如网络驱动中的NAPI中断缓解技术,至少给其它工作负载释放了近1/3的CPU时间,epoll系统调用减少了大部分单次调用开销,在一次基准测试中发现,延迟时间至少减少了33毫秒,在用户空间通过VDSO换页处理clock_gettime()至少减少了60毫微秒。Bob对Linux的页面缓存工作效率也很满意,它消除了异步I/O的需要,大大简化了代码。
另一方面,Bob表示Linux也还有需要改进的地方,例如I/O信号,它们让编程变得很复杂,如果事务繁忙,信号队列可能会溢出,用户空间的libaio异步I/O(AIO)是基于线程实现的,扩展性不好,和epoll的集成度也不好。相反,基于内核的异步I/O缺乏合适的套接字支持,他还提到了recvmsg()系统调用,每个入站数据包都需要一个进入内核的调用。
新的recvmmsg()系统调用在单次调用中可以接收多个数据包,但它现在是围绕内部recvmsg()实现的一个封装,还不能跨全部操作持有套接字锁,但Bob认为recvmmsg()是向Linux添加新API的一个很好示例,他也喜欢基于内核的AIO和eventfd()结合使用,使得将基于文件的AIO整合进应用程序正常的事件处理循环成为可能,syslets也仍然有潜力可挖,Bob认为它可以作为向用户空间发送通知的快捷方法,但现在尚不清楚syslets是否会扩大规模。
纳斯达克OMX现在最想在Linux中看到的是基于套接字的AIO,这样就可以用更少的系统调用替换epoll/recvmsg/sendmsg队列,更妙的是,内核可以同时为多个事件提供通知,最好是这个功能的接口完全基于套接字,Bob描绘了一个类似于epoll的内核项目,它可以处理内核中的网络通信,应用程序可以向队列异步发送和接收请求,当它们执行完毕时接收通知,他希望看到多个套接字连接到单个对象,和一个适合传递给poll()的文件描述符,有了这样的技术,通过内核的网络流量就可以更大,并且延迟也会更小。
总之,纳斯达克OMX对Linux的表现还是很满意的,它们也喜欢尝鲜,前不久交易所的服务器就升级到了2.6.35.3内核,新出现的API对运营的帮助也很大,Bob说很少有系统因性能原因愿意引入新的API,这和Linus Torvalds的观点却不一样,Linus Torvalds认为没有人会使用Linux特殊的API,这一次也许是Linus Torvalds错了,不是没有人使用,只是它们藏得很深,一般人不知道。