我正在開發自己的UDP協議(在Linux下),用於緩存應用(類似於memcached),它只對對象執行INSERT/READ/UPDATE/DELETE操作,我不確定哪種設計最好:每個udp數據包有多個或單個請求?
- 每包發送一個請求。 (客戶端準備請求並立即將其發送到服務器)
- 每個數據包發送多個請求。 (客戶端將包中的請求排入隊列中,並且當它滿了時(接近MTU大小)將它發送到服務器)
請求的大小(即記錄數據)可以從32字節到1400字節,我不知道它會是平均值,它完全取決於用戶的應用程序。
如果選擇每個數據包的單個請求,我將不得不管理很多小包,並且內核會被中斷很多次。這會降低操作速度,因爲從用戶空間切換到系統時,內核必須保存寄存器。此外,如果用戶的應用程序發送32字節的許多請求(udp的數據包開銷約爲28字節),網絡流量將增加一倍,並且我將對傳輸速度產生很大影響,所以數據傳輸將會有開銷。然而,高網絡流量不一定意味着低性能,因爲NIC具有其自己的處理器並且不會使CPU停滯。如果出現網絡瓶頸,可以安裝額外的網卡。 使用單個數據包的一大優點是服務器和客戶端將如此簡單,以便我能夠節省指令並提高速度,同時我的bug也會減少,並且項目將盡早完成。
如果我使用每個數據包多個請求,我將有更少但更大的數據包,因此可以通過網絡傳輸更多的數據。我將減少系統調用的數量,但服務器的複雜性需要更多的內存和更多的指令來執行,所以我們不知道如果以這種方式更快地執行它。可能會發生CPU將成爲瓶頸,但添加CPU或網卡的更便宜嗎?
應用程序應該有很重的數據加載,比如最新的CPU每秒100,000個請求。我不知道該怎麼做。我正在考慮尋求「每個數據包的單個請求」,但是在我重寫所有我已經爲多個請求處理編寫的代碼之前,我想問一些建議。
在此先感謝。
你認爲即使磁盤是SSD,CPU和磁盤也會成爲瓶頸? – Nulik 2012-07-15 22:20:39
@Nulik數據庫性能是一個複雜的主題,你應該執行你自己的基準測試。 – 2012-07-15 23:10:14