提高 Linux上socket 性能的技巧 最小化系統調用的負載
本文內容包括Linux下對于 Sockets API 的使用、兩個可以提高性能的 socket 選項以及 GNU/Linux 優化。為了能夠開發性能卓越的應用程序,請遵循以下技巧:最小化報文傳輸的延時;最小化系統調用的負載;為 Bandwidth Delay Product 調節 TCP 窗口;動態優化 GNU/Linux TCP/IP 棧。
最小化系統調用的負載
任何時候通過一個 socket 來讀寫數據時,您都是在使用一個系統調用(system call)。這個調用(例如 read 或 write)跨越了用戶空間應用程序與內核的邊界。另外,在進入內核之前,您的調用會通過 C 庫來進入內核中的一個通用函數(system_call())。從 system_call() 中,這個調用會進入文件系統層,內核會在這兒確定正在處理的是哪種類型的設備。最后,調用會進入 socket 層,數據就是在這里進行讀取或進行排隊從而通過 socket 進行傳輸的(這涉及數據的副本)。
這個過程說明系統調用不僅僅是在應用程序和內核中進行操作的,而且還要經過應用程序和內核中的很多層次。這個過程耗費的資源很高,因此調用次數越多,通過這個調用鏈進行的工作所需要的時間就越長,應用程序的性能也就越低。
由于我們無法避免這些系統調用,因此惟一的選擇是最小化使用這些調用的次數。幸運的是,我們可以對這個過程進行控制。
解決方案
在將數據寫入一個 socket 時,盡量一次寫入所有的數據,而不是執行多次寫數據的操作。對于讀操作來說,最好傳入可以支持的最大緩沖區,因為如果沒有足夠多的數據,內核也會試圖填充整個緩沖區(另外還需要保持 TCP 的通告窗口為打開狀態)。這樣,您就可以最小化調用的次數,并可以實現更好的整體性能。
使用 Sockets API,我們可以開發客戶機和服務器應用程序,它們可以在本地網絡上進行通信,也可以通過 Internet 在全球范圍內進行通信。與其他 API 一樣,您可以通過一些方法使用 Sockets API,從而提高 Socket 的性能,或者限制 Socket 的性能。
【編輯推薦】
- 2.1.3 Socket服務器
- TCP Socket之linux實現
- Linux操作系統下Socket編程地址結構介紹
- 16.5.4 socket編程實例(2)
- 16.5.4 socket編程實例(1)