Socket是一個好的設計嗎?
12-28
現在CPU的核越來越多,但是常見OS的網路IO的scalability並不好。
這主要是socket介面的設計問題還是實現的問題?還是TCP之類協議設計問題?
感覺在linux上,socket還算是不錯的設計,epoll加上leader-follower模型,網路框架可以有很好的多核擴展性,萬兆網卡跑滿是沒問題的,nginx就是證明。
個人認為socket API里比較噁心的是表達ip地址的那一坨結構體我每次都記不住,還有使用水平觸發不得不接受每次epoll_ctl的系統調用和裡面的鎖開銷
其實擴展性不好的反而是linux的本地文件IO,kernel一直沒有基於BufferIO的aio支持,libaio倒是可以和epoll結合使用,但是必須使用DirectIO;而要用BufferIO的話,目前只能起線程池來模擬。單獨說socket沒有意思,更多的是要考慮TCP網路棧。
評價一個東西好不好,先看看其產生的背景,TCP最開始是用於網路盒子的控制層的,所以說它其實更擅長的是control plane,而不是data plane。
再回到題主的答案,從現在的角度看就是設計不是特別特別合理。因為當今我們對data plane的需求越來越強烈。主要問題是太複雜,導致的拷貝,上下文切換等開銷太高;另外一個就是kernel數據結構有很多是共享的,也就導致了lz提到的可擴展性。
解決辦法有三條:
- 優化內核TCP。比如綁定隊列到CPU,緩解多核下的鎖競爭問題。
- 使用用戶態網路棧,比如mTCP,openonLoad這些網路庫,也可以基於Intel的DPDK來做。
- 使用硬體來加速,比如遠程內存訪問(RDMA), 硬體off-load技術。
x86是一個好的設計嗎?人類選擇的多數技術,80%都不是學術上最好的。但是人類會打補丁。比如新增指令集,epool,SO_REUSEPORT等。
如果你是指socket的介面select介面不能打開多於1024個文件,我只能說,其實這不是問題。
推薦閱讀:
※有沒有哪些高效的c++ socket框架?
※Socket建立連接到底發生了什麼?
※怎麼理解TCP是面向連接的,HTTP基於TCP卻是無連接的?
※服務端把客戶端幾次發的數據一起接受了,是怎麼回事?socket,Tcp協議
※TCP中已有SO_KEEPALIVE選項,為什麼還要在應用層加入心跳包機制??