原文地址:http:///2013/11/22/c100k-4-kernel-tuning/ 早期的系統(tǒng),系統(tǒng)資源包括CPU、內(nèi)存等都是非常有限的,系統(tǒng)為了保持公平,默認要限制進程對資源的使用情況。由于Linux的默認內(nèi)核配置無法滿足C100K的要求,因此需要對其進行適當?shù)恼{(diào)優(yōu)。 我們可以通過
比如其中的 俗話說:一個巴掌拍不響,要完成 客戶端1:文件句柄數(shù)量受限在Linux平臺上,無論是編寫客戶端程序還是服務端程序,在進行高并發(fā)TCP連接處理時,由于每個TCP連接都要創(chuàng)建一個socket句柄,而每個socket句柄同時也是一個文件句柄,所以其最高并發(fā)數(shù)量要受到系統(tǒng)對用戶單一進程同時可打開文件數(shù)量的限制以及整個系統(tǒng)可同時打開的文件數(shù)量限制。 1.1:單一進程的文件句柄數(shù)量受限我們可以ulimit命令查看當前用戶進程可打開的文件句柄數(shù)限制:
這表示當前用戶的每個進程最多允許同時打開1024個文件,除去每個進程必然打開的標準輸入、標準輸出、標準錯誤、服務器監(jiān)聽socket、進程間通訊的unix域socket等文件,剩下的可用于客戶端socket連接的文件數(shù)就只有大概1024-10=1014個左右。也就是說,在默認情況下,基于Linux的通訊程序最多允許同時1014個TCP并發(fā)連接。 對于想支持更高數(shù)量的TCP并發(fā)連接的通訊處理程序,就必須修改Linux對當前用戶的進程可同時打開的文件數(shù)量的軟限制(soft limit)和硬限制(hardlimit)。其中:
通常軟限制小于或等于硬限制,可通過ulimit命令查看軟限制和硬限制:
修改單一進程能同時打開的文件句柄數(shù)有2種方法: 1、直接使用ulimit命令,如:
執(zhí)行成功之后,ulimit n、Sn、Hn的值均會變?yōu)?048576。但該方法設置的值只會在當前終端有效,且設置的值不能高于方法2中設置的值。 2、對
其中,
注意文件保存之后,需要注銷或重啟系統(tǒng)方能生效。 1.2:整個系統(tǒng)的文件句柄數(shù)量受限解決完單一進程的文件句柄數(shù)量受限問題后,還要解決整個系統(tǒng)的文件句柄數(shù)量受限問題。我們可通過以下命令查看Linux系統(tǒng)級的最大打開文件數(shù)限制:
file-max表示系統(tǒng)所有進程最多允許同時打開的文件句柄數(shù),是Linux系統(tǒng)級硬限制。通常,這個系統(tǒng)硬限制是Linux系統(tǒng)在啟動時根據(jù)系統(tǒng)硬件資源狀況計算出來的最佳的最大同時打開文件數(shù)限制,如果沒有特殊需要,不應該修改此限制。 要修改它,需要對
保存成功后,需執(zhí)行下面命令使之生效:
2:端口數(shù)量受限解決完文件句柄數(shù)量受限的問題后,就要解決IP端口數(shù)量受限的問題了。一般來說,對外提供請求的服務端不用考慮端口數(shù)量問題,只要監(jiān)聽某一個端口即可。可客戶端要模擬大量的用戶對服務端發(fā)起TCP請求,而每一個請求都需要一個端口,為了使一個客戶端盡可能地模擬更多的用戶,也就要使客戶端擁有更多可使用的端口。 由于端口為16進制,即最大端口數(shù)為2的16次方65536(0-65535)。在Linux系統(tǒng)里,1024以下端口只有超級管理員用戶(如root)才可以使用,普通用戶只能使用大于等于1024的端口值。 我們可以通過以下命令查看系統(tǒng)提供的默認的端口范圍:
即只有61000-32768=28232個端口可以使用,即單個IP對外只能同時發(fā)送28232個TCP請求。 修改方法有以下2種: 1、執(zhí)行以下命令:
該方法立即生效,但重啟后會失效。 2、修改
保存成功后,需執(zhí)行下面命令使之生效:
修改成功后,可用端口即增加到65535-1024=64511個,即單個客戶端機器只能同時模擬64511個用戶。要想突破這個限制,只能給該客戶端增加IP地址,這樣即可相應成倍地增加可用IP:PORT數(shù)。具體可參考yongboy的這篇文章。 服務端1:文件描述符數(shù)量受限同客戶端的問題1。 2:TCP參數(shù)調(diào)優(yōu)要想提高服務端的性能,以達到我們高并發(fā)的目的,需要對系統(tǒng)的TCP參數(shù)進行適當?shù)男薷膬?yōu)化。 方法同樣是修改
當服務器需要在大量TCP連接之間切換時,會產(chǎn)生大量處于TIME_WAIT狀態(tài)的連接。TIME_WAIT意味著連接本身是關閉的,但資源還沒有釋放。將net_ipv4_tcp_tw_reuse設置為1是讓內(nèi)核在安全時盡量回收連接,這比重新建立新連接要便宜得多。
這是處于TIME_WAIT狀態(tài)的連接在回收前必須等待的最小時間。改小它可以加快回收。
提高TCP的最大緩沖區(qū)大小,其中:
提高Linux內(nèi)核自動對socket緩沖區(qū)進行優(yōu)化的能力,其中:
每個網(wǎng)絡接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時,允許送到隊列的數(shù)據(jù)包的最大數(shù)目。默認為1000。
表示socket監(jiān)聽(listen)的backlog上限。什么是backlog呢?backlog就是socket的監(jiān)聽隊列,當一個請求(request)尚未被處理或建立時,他會進入backlog。而socket server可以一次性處理backlog中的所有請求,處理后的請求不再位于監(jiān)聽隊列中。當server處理請求較慢,以至于監(jiān)聽隊列被填滿后,新來的請求會被拒絕。默認為128。
表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網(wǎng)絡連接數(shù)。
表示開啟SYN Cookies。當出現(xiàn)SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉。
表示系統(tǒng)同時保持TIME_WAIT套接字的最大數(shù)量,如果超過這個數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認為180000。
一個tcp連接關閉后,把這個連接曾經(jīng)有的參數(shù)比如慢啟動門限snd_sthresh、擁塞窗口snd_cwnd,還有srtt等信息保存到dst_entry中,只要dst_entry沒有失效,下次新建立相同連接的時候就可以使用保存的參數(shù)來初始化這個連接。
表示在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量,默認為4。
表示在內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量,默認為5。 完整的TCP參數(shù)調(diào)優(yōu)配置如下所示:
其它一些參數(shù)
用來確定系統(tǒng)開始回收內(nèi)存的閥值,控制系統(tǒng)的空閑內(nèi)存。值越高,內(nèi)核越早開始回收內(nèi)存,空閑內(nèi)存越高。
控制內(nèi)核從物理內(nèi)存移出進程,移到交換空間。該參數(shù)從0到100,當該參數(shù)=0,表示只要有可能就盡力避免交換進程移出物理內(nèi)存;該參數(shù)=100,這告訴內(nèi)核瘋狂的將數(shù)據(jù)移出物理內(nèi)存移到swap緩存中。 |
|