1锐涯、首先你要明白KeepAlive到底是什么東西磕诊?其次你要了解KeepAlive在壓測(cè)過程中會(huì)造成哪些影響?
我們要對(duì)keepalive有個(gè)簡(jiǎn)易的理解:TCP的keep alive是檢查當(dāng)前TCP連接是否活著纹腌;HTTP的Keep-alive是要讓一個(gè)TCP連接活久點(diǎn)霎终;在一個(gè)TCP連接內(nèi),多個(gè)HTTP請(qǐng)求可以并行升薯,下一個(gè)HTTP請(qǐng)求在上一個(gè)HTTP請(qǐng)求的應(yīng)答完成之前就發(fā)起莱褒。它們是不同層次的概念,所以叫http長(zhǎng)連接似乎是不太合理的涎劈,應(yīng)該叫多個(gè)http請(qǐng)求時(shí)的tcp長(zhǎng)連接復(fù)用广凸。
那我們可能會(huì)想,當(dāng)我們?cè)谑褂胘meter并發(fā)測(cè)試的時(shí)候蛛枚,如果勾選了keep-alive谅海,是不是走的都是重復(fù)的連接,即并發(fā)數(shù)和客戶端的端口數(shù)應(yīng)該是一樣的蹦浦。但并不是這個(gè)樣子扭吁。
jmeter在發(fā)送http請(qǐng)求時(shí),默認(rèn)帶有keep-alive,但我們通過查看jmeter配置文件發(fā)現(xiàn)并沒有相關(guān)有效的連接時(shí)長(zhǎng)配置侥袜,可以認(rèn)定:jmeter中的請(qǐng)求都是無等待請(qǐng)求蝌诡,response time約等于零,一旦連接數(shù)據(jù)接收完畢枫吧,或者接口處于空閑狀態(tài)浦旱,連接便會(huì)斷開
所以在不修改jmeter默認(rèn)配置情況下,每個(gè)線程都是獨(dú)立的九杂、全新的采转,無論是否勾選keep-alive猜极,請(qǐng)求都不受影響(服務(wù)端強(qiáng)制要求短連接除外)
在詳細(xì)了解TCP連接的狀態(tài)和關(guān)閉方式后,我們會(huì)發(fā)現(xiàn)TIME_WAIT狀態(tài)是一個(gè)坑爹的存在!主動(dòng)關(guān)閉連接的一方在發(fā)送最后一個(gè)ACK包后侍芝,無論對(duì)方是否收到都會(huì)進(jìn)入TIME_WAIT狀態(tài)荠医,等待2MSL的時(shí)間颜价,然后才能釋放網(wǎng)絡(luò)資源斯碌。MSL就是Maximum Segment Lifetime(數(shù)據(jù)包的最大生命周期),是一個(gè)數(shù)據(jù)包能在互聯(lián)網(wǎng)上生存的最長(zhǎng)時(shí)間鹿响,若超過這個(gè)時(shí)間則該數(shù)據(jù)包將會(huì)消失在網(wǎng)絡(luò)中羡微。操作系統(tǒng)通常會(huì)將2MSL設(shè)為4分鐘,最低不少于30秒惶我,因而TIME_WAIT狀態(tài)一般維持在30秒至4分鐘妈倔;
對(duì)于Client而言,每個(gè)連接都需要占用一個(gè)端口绸贡,而系統(tǒng)允許的可用端口數(shù)不足65000個(gè)(這也是在TCP參數(shù)優(yōu)化后才能達(dá)到)盯蝴。因此,如果Client發(fā)起過多的連接且連接未關(guān)閉听怕,就會(huì)有大量的連接處于TIME_WAIT狀態(tài)捧挺,等待2MSL的時(shí)間后才能釋放端口,于是Client會(huì)由于缺少可用端口而無法新建連接尿瞭。
[time_wait端口查詢 netstat -aon|findstr "TIME_WAIT"]
1.增加系統(tǒng)端口
我們可以通過修改注冊(cè)表配置來解決問題:
1,啟動(dòng)注冊(cè)表編輯器(Regedt32.exe )闽烙。
2,在注冊(cè)表中確定下述鍵值的位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“編輯”菜單上點(diǎn)擊“添加值”,然后增加下述注冊(cè)值:
Value Name: MaxUserPort
Data Type: REG_DWORD
Value: 65534
它用于設(shè)置為任何用戶提供的臨時(shí)端口數(shù)声搁。有效范圍介于5000 和65534 之間(十進(jìn)制)黑竞。默認(rèn)值為0x1388 (5000 ,十進(jìn)制)疏旨。
3,在“編輯”菜單上點(diǎn)擊“添加值”很魂,然后增加下述注冊(cè)值:
Value Name: TcpTimedWaitDelay
Data Type: REG_DWORD
Value: 30
它用于設(shè)置關(guān)閉之前將TCP 端口連接保持在TIME_WAIT 狀態(tài)的秒數(shù)。 有效范圍介于0 秒和300 秒之間檐涝。默認(rèn)值為0x78 (120 秒)莫换。
4,退出注冊(cè)表編輯器霞玄。
5,重啟服務(wù)器骤铃。
2.windows修改句柄文件
Windows 下單機(jī)的TCP連接數(shù)有多個(gè)參數(shù)共同決定
最大TCP連接數(shù)
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
TcpNumConnections = 0x00fffffe (Default = 16,777,214)
以上注冊(cè)表信息配置單機(jī)的最大允許的TCP連接數(shù)拉岁,默認(rèn)為 16M。這個(gè)數(shù)值看似很大惰爬,這個(gè)并不是限制最大連接數(shù)的唯一條件喊暖,還有其他條件會(huì)限制到TCP 連接的最大連接數(shù)。
最大動(dòng)態(tài)端口數(shù)
TCP客戶端和服務(wù)器連接時(shí)撕瞧,客戶端必須分配一個(gè)動(dòng)態(tài)端口陵叽,默認(rèn)情況下這個(gè)動(dòng)態(tài)端口的分配范圍為 1024-5000 ,也就是說默認(rèn)情況下丛版,客戶端最多可以同時(shí)發(fā)起3977 個(gè)Socket 連接巩掺。我們可以修改如下注冊(cè)表來調(diào)整這個(gè)動(dòng)態(tài)端口的范圍
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxUserPort = 5000 (Default = 5000, Max = 65534)
最大TCB 數(shù)量
系統(tǒng)為每個(gè)TCP 連接分配一個(gè)TCP 控制塊(TCP control block or TCB),這個(gè)控制塊用于緩存TCP連接的一些參數(shù)页畦,每個(gè)TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool胖替,也就說,每個(gè)TCP連接會(huì)占用 1KB 的系統(tǒng)內(nèi)存豫缨。
系統(tǒng)的最大TCB數(shù)量由如下注冊(cè)表設(shè)置決定
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)
MaxFreeTcbs 的默認(rèn)值為1000 (64M 以上物理內(nèi)存)
最大TCB Hash table 數(shù)量
TCB 是通過Hash table 來管理的独令,下面注冊(cè)表設(shè)置決定了這個(gè)Hash table 的大小
HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip \Parameters]
MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
這個(gè)值指明分配 pagepool 內(nèi)存的數(shù)量,也就是說好芭,如果MaxFreeTcbs = 1000 , 則 pagepool 的內(nèi)存數(shù)量為 500KB
那么 MaxHashTableSize 應(yīng)大于 500 才行燃箭。這個(gè)數(shù)量越大,則Hash table 的冗余度就越高舍败,每次分配和查找 TCP 連接用時(shí)就越少招狸。這個(gè)值必須是2的冪,且最大為65536.
IBM WebSphere Voice Server 在windows server 2003 下的典型配置
這是IBM WebSphere Voice Server 的典型配置邻薯,大家可以做個(gè)參考裙戏。原文參見
[IBM WebSphere Voice Server 在windows server 2003 下的典型配置]
MaxUserPort = 65534 (Decimal)
MaxHashTableSize = 65536 (Decimal)
MaxFreeTcbs = 16000 (Decimal)
這里我們可以看到 MaxHashTableSize 被配置為比MaxFreeTcbs 大4倍,這樣可以大大增加TCP建立的速度弛说。
3.單網(wǎng)卡捆綁多ip
一次偶然機(jī)會(huì)挽懦,從朋友那里聽到什么東東能支持單臺(tái)機(jī)器“上百萬并發(fā)量”,于是考慮如何解決tcp客戶端端口不夠的問題木人。
因?yàn)槟J(rèn)65535端口信柿,經(jīng)過設(shè)置,最多端口數(shù)不到60000醒第,如何能達(dá)到百萬呢渔嚷?
看了下UNP,里面講SO_REUSEADDR應(yīng)用的4種場(chǎng)景時(shí)有說到:
SO_REUSEADDR允許單個(gè)進(jìn)程捆綁同一端口到多個(gè)套接字上稠曼,只要每次捆綁指定不同的貝蒂IP地址即可形病。
于是猜測(cè):當(dāng)某個(gè)IP的端口用盡時(shí)可以選擇另一個(gè)IP進(jìn)行發(fā)送消息。
那么如何在一個(gè)機(jī)器上虛擬出多個(gè)ip地址呢?
可以使用工具ipop
工具下載地址:鏈接:https://pan.baidu.com/s/12lqGqyFsvxJ1NEVsS4eW5g 提取碼:6666