Tsung筆記之IP地址和端口限制突破篇
前言
在Tsung筆記之壓測端資源限制篇中說到單一IP地址的服務(wù)器最多能夠向外發(fā)送64K個(gè)連接,這個(gè)已算是極限了。
但現(xiàn)在我還想繼續(xù)深入一下,如何突破這個(gè)限制呢 ?
如何突破限制
這部分就是要從多個(gè)方面去討論如何如何突破限制單個(gè)IP的限制。
0. Tsung支持TCP情況
在Tsung 1.6.0 中支持的TCP屬性有限,全部特性如下:
protocol_options(#proto_opts{tcp_rcv_size = Rcv, tcp_snd_size = Snd,
tcp_reuseaddr = Reuseaddr}) ->
[binary,
{active, once},
{reuseaddr, Reuseaddr},
{recbuf, Rcv},
{sndbuf, Snd},
{keepalive, true} %% FIXME: should be an option
].
比如可以配置地址重用:
<option name="tcp_reuseaddr" value="true" />
1. 增加IP地址
這是最為現(xiàn)實(shí)、最為方便的辦法,向運(yùn)維的同事多申請若干個(gè)IP地址就好。在不考慮其它因素前提下,一個(gè)IP地址可以對外建立64K個(gè)連接,多個(gè)IP就是N * 64K
了。這個(gè)在Tsung中支持的很好。
<client host="client_99" maxusers="120000" weight="2" cpu="8">
<ip value="10.10.10.99"></ip>
<ip value="10.10.10.11"></ip>
</client>
增加IP可以有多種方式:
- 增加物理網(wǎng)卡方式,一個(gè)網(wǎng)卡綁定一個(gè)IP地址
- 代價(jià)高
- 一個(gè)網(wǎng)卡上綁定多個(gè)可用的虛擬IP地址
- 比如
ifconfig eth0:2 10.10.10.102 netmask 255.255.255.0
- 虛擬IP必須是真實(shí)可用,否則收不到回包數(shù)據(jù)
- 比如
要是沒有足夠的可用虛擬IP地址供你使用,或許你需要關(guān)注一下后面的
IP_TRANSPARENT
特性描述 :))
2. 考慮Linux內(nèi)核新增SO_REUSEPORT
端口重用特性
以被壓測的一個(gè)TCP服務(wù)器為例,繼續(xù)拿網(wǎng)絡(luò)四元組說事。
{SrcIp, SrcPort, TargetIp, TargetPort}
- 線上大部分服務(wù)器所使用的系統(tǒng)為CentOS 6系列,所使用系統(tǒng)內(nèi)核低于3.9
- {SrcIp, SrcPort} 確定了本地建立一個(gè)連接的唯一性,本地地址的唯一性
- {TargetIp, TargetPort}的無法確定唯一,僅僅標(biāo)識了目的地址
- Linux Kernel 3.9 支持
SO_REUSEPORT
端口重用特性 - 網(wǎng)絡(luò)四元組中,任何一個(gè)元素值的變化都會(huì)成為一個(gè)全新的連接- 真正讓網(wǎng)絡(luò)四元組一起組成了一個(gè)網(wǎng)絡(luò)連接的唯一性
- 理論上可以對外建立的連接數(shù)依賴于四個(gè)元素可變數(shù)值
- Totalconnections = NSrcIp * NSrcPort * NTargetIp * NTargetPort
線上有部分服務(wù)器安裝有CentOS 7,其內(nèi)核為3.10.0,很自然支持端口重用特性。
針對只有一個(gè)IP地址的壓測端服務(wù)器而言,端口范圍也就確定了,只能從目標(biāo)服務(wù)器連接地址上去考慮。有兩種方式:
- 目標(biāo)服務(wù)器增加多個(gè)可用IP地址,服務(wù)程序綁定指定端口即可
- N個(gè)IP地址,可用存在 64K * N
- 服務(wù)程序綁定多個(gè)Port,這個(gè)針對程序而言難度不大
- 針對單個(gè)IP,監(jiān)聽了M個(gè)端口
- 可用建立 64K * M 個(gè)連接
- 可用這樣梳理 , Total1 ip connections = 64K * N * M
啰嗦了半天,但目前Tsung還沒有打算要提供支持呢,怎么辦,自己動(dòng)手豐衣足食吧:
https://github.com/weibomobile/tsung/commit/f81288539f8e6b6546cb9e239c36f05fc3e1b874
3. 透明代理模式支持
Linux Kernel 2.6.28提供IP_TRANSPARENT
特性,支持可以綁定不是本機(jī)的IP地址。這種IP地址的綁定不需要顯示的配置在物理網(wǎng)卡、虛擬網(wǎng)卡上面,避免了很多手動(dòng)操作的麻煩。但是需要主動(dòng)指定這種配置,比如下面的C語言版本代碼
int opt =1;
setsockopt(server_socket, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt));
目前在最新即將打包的1.6.1版本中提供了對TCP的支持,也需要翻譯成對應(yīng)的選項(xiàng),以便在建立網(wǎng)絡(luò)連接時(shí)使用:
?
說明一下:
- IP_TRANSPARENT
沒有對應(yīng)專門的宏變量,其具體值為19
- SOL_IP
定義宏對應(yīng)值:0
- 添加Socket選項(xiàng)通用格式為:{raw, Protocol, OptionNum, ValueSpec}
那么如何讓透明代理模式工作呢?
3.1 啟用IP_TRANSPARENT
特性
<options>
...
<option name="ip_transparent" value="true" />
...
<options>
3.2 配置可用的額外IP地址
那么這些額外的IP地址如何設(shè)置呢?
可以為client元素手動(dòng)添加多個(gè)可用的IP地址
<client host="tsung_client1" maxusers="500000" weight="1"> <ip value="10.10.10.117"/> <ip value="10.10.10.118"/> ...... <ip value="10.10.10.127"/> </client>
可以使用新增的
iprange
特性<client host="tsung_client1" maxusers="500000" weight="1"> <ip value="10.10.10.117"/> <iprange version="v4" value="10.10.10-30.1-254"/> </client>
但是需要確保:
- 這些IP地址目前都沒有被已有服務(wù)器在使用
- 并且可以被正常綁定到物理/虛擬網(wǎng)卡上面
- 完全可用
3.3 配置路由規(guī)則支持
假設(shè)我們的tsung_client1
這臺壓測端服務(wù)器,綁定所有額外IP地址到物理網(wǎng)卡eth1
上,那么需要手動(dòng)添加路由規(guī)則:
ip rule add iif eth1 tab 100
ip route add local 0.0.0.0/0 dev lo tab 100
這個(gè)支持壓測端綁定同一網(wǎng)段的可用IP地址,比如壓測端IP為172.16.247.130,172.16.247.201暫時(shí)空閑的話,那我們就可以使用172.16.89.201這個(gè)IP地址用于壓測。此時(shí)不要求被壓測的服務(wù)器配置什么。
3.4 進(jìn)階,我們使用一個(gè)新的網(wǎng)段專用于測試
比如 10.10.10.0 這個(gè)段的IP機(jī)房暫時(shí)沒有使用,那我們專用于壓測使用,這樣一臺服務(wù)器就有了250多個(gè)可用的IP地址了。
壓測端前面已經(jīng)配置好了,現(xiàn)在需要為被壓測的服務(wù)器添加路由規(guī)則,這樣在響應(yīng)數(shù)據(jù)包的時(shí)候能夠路由到壓測端:
route add -net 10.10.10.0 netmask 255.255.255.0 gw 172.16.247.130
設(shè)置完成,可以通過route -n
命令查看當(dāng)前所有路由規(guī)則:
?
在不需要時(shí),可以刪除掉:
route del -net 10.10.10.0 netmask 255.255.255.0
小結(jié)
梳理了以上所能夠想到的方式,以盡可能突破單機(jī)的限制,核心還是盡可能找到足夠多可用的IP地址,利用Linux內(nèi)核特性支持,程序?qū)用娼壎ūM可能多的IP地址,建立更多的對外連接。當(dāng)然以上沒有考慮類似于CPU、內(nèi)存等資源限制,實(shí)際操作時(shí),還是需要考慮這些資源的限制的。
posted on 2016-08-16 21:17 nieyong 閱讀(5768) 評論(2) 編輯 收藏 所屬分類: 壓測