歡迎光臨
每天分享高質量文章

宋寶華: 資料庫為什麼有可能喜歡Linux AIO(非同步I/O)?

回憶一下

我們都知道Linux的IO模型有阻塞、非阻塞、SIGIO、多路復用(select,epoll)、AIO(非同步I/O)等。


資料庫可能比較傾向於使用AIO。從時序上面來講,AIO是使用者應用發起IO請求io_submit()後,它就不需要去等待,讓後臺給它搞定讀寫。之後本執行緒或者其他執行緒就可以透過io_getevents()去同步I/O的結果。

這樣的AIO有一個極大的好處在於,IO不會阻塞住CPU的行為,有利於充分利用硬體的資源,有利於讓CPU、IO都parallel起來 。當然,同樣的動作,似乎用epoll()、SIGIO也可以呈現出來。尤其是epoll(),幾乎是C10K問題解決方案在Linux的代名詞。epoll_wait()先等待IO請求的read、write可以發生,而後再根據傳回的事件發起讀寫請求:


事件驅動模型libevent等,看起來是事件到來,callback被執行的Reactor樣式:

但是其底層其實也是靠epoll()來實現,這個我們透過strace就可以看出。請見我的3分鐘小電影: