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






















