納斯達(dá)克OMX的交易運(yùn)行在數(shù)千臺(tái)Linux服務(wù)器上,這些服務(wù)器要處理實(shí)時(shí)事務(wù),監(jiān)控和進(jìn)展情況,這種環(huán)境最大的挑戰(zhàn)就是性能,實(shí)際貨幣的匯率取決于交易是否能跟得上訂單流,延遲和吞吐量變得非常關(guān)鍵,訂單必須在有限的時(shí)間內(nèi)響應(yīng)(和執(zhí)行),不用說,可靠性也非常重要,停機(jī)幾乎是不被允許的。
為了全面滿足這些要求,納斯達(dá)克OMX集團(tuán)部署了許多大型計(jì)算集群,它們每天可以處理數(shù)億筆訂單,在延遲時(shí)間為25毫秒的情況下,每秒最快可以處理一百萬筆訂單。
Bob說近年來Linux引入了許多有用的技術(shù),如網(wǎng)絡(luò)驅(qū)動(dòng)中的NAPI中斷緩解技術(shù),至少給其它工作負(fù)載釋放了近1/3的CPU時(shí)間,epoll系統(tǒng)調(diào)用減少了大部分單次調(diào)用開銷,在一次基準(zhǔn)測(cè)試中發(fā)現(xiàn),延遲時(shí)間至少減少了33毫秒,在用戶空間通過VDSO換頁處理clock_gettime()至少減少了60毫微秒。Bob對(duì)Linux的頁面緩存工作效率也很滿意,它消除了異步I/O的需要,大大簡(jiǎn)化了代碼。
另一方面,Bob表示Linux也還有需要改進(jìn)的地方,例如I/O信號(hào),它們讓編程變得很復(fù)雜,如果事務(wù)繁忙,信號(hào)隊(duì)列可能會(huì)溢出,用戶空間的libaio異步I/O(AIO)是基于線程實(shí)現(xiàn)的,擴(kuò)展性不好,和epoll的集成度也不好。相反,基于內(nèi)核的異步I/O缺乏合適的套接字支持,他還提到了recvmsg()系統(tǒng)調(diào)用,每個(gè)入站數(shù)據(jù)包都需要一個(gè)進(jìn)入內(nèi)核的調(diào)用。
新的recvmmsg()系統(tǒng)調(diào)用在單次調(diào)用中可以接收多個(gè)數(shù)據(jù)包,但它現(xiàn)在是圍繞內(nèi)部recvmsg()實(shí)現(xiàn)的一個(gè)封裝,還不能跨全部操作持有套接字鎖,但Bob認(rèn)為recvmmsg()是向Linux添加新API的一個(gè)很好示例,他也喜歡基于內(nèi)核的AIO和eventfd()結(jié)合使用,使得將基于文件的AIO整合進(jìn)應(yīng)用程序正常的事件處理循環(huán)成為可能,syslets也仍然有潛力可挖,Bob認(rèn)為它可以作為向用戶空間發(fā)送通知的快捷方法,但現(xiàn)在尚不清楚syslets是否會(huì)擴(kuò)大規(guī)模。
納斯達(dá)克OMX現(xiàn)在最想在Linux中看到的是基于套接字的AIO,這樣就可以用更少的系統(tǒng)調(diào)用替換epoll/recvmsg/sendmsg隊(duì)列,更妙的是,內(nèi)核可以同時(shí)為多個(gè)事件提供通知,最好是這個(gè)功能的接口完全基于套接字,Bob描繪了一個(gè)類似于epoll的內(nèi)核項(xiàng)目,它可以處理內(nèi)核中的網(wǎng)絡(luò)通信,應(yīng)用程序可以向隊(duì)列異步發(fā)送和接收請(qǐng)求,當(dāng)它們執(zhí)行完畢時(shí)接收通知,他希望看到多個(gè)套接字連接到單個(gè)對(duì)象,和一個(gè)適合傳遞給poll()的文件描述符,有了這樣的技術(shù),通過內(nèi)核的網(wǎng)絡(luò)流量就可以更大,并且延遲也會(huì)更小。
總之,納斯達(dá)克OMX對(duì)Linux的表現(xiàn)還是很滿意的,它們也喜歡嘗鮮,前不久交易所的服務(wù)器就升級(jí)到了2.6.35.3內(nèi)核,新出現(xiàn)的API對(duì)運(yùn)營的幫助也很大,Bob說很少有系統(tǒng)因性能原因愿意引入新的API,這和Linus Torvalds的觀點(diǎn)卻不一樣,Linus Torvalds認(rèn)為沒有人會(huì)使用Linux特殊的API,這一次也許是Linus Torvalds錯(cuò)了,不是沒有人使用,只是它們藏得很深,一般人不知道。