<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學習的點點滴滴。

    Tsung筆記之IP地址和端口限制突破篇

    前言

    Tsung筆記之壓測端資源限制篇中說到單一IP地址的服務(wù)器最多能夠向外發(fā)送64K個連接,這個已算是極限了。

    但現(xiàn)在我還想繼續(xù)深入一下,如何突破這個限制呢 ?

    如何突破限制

    這部分就是要從多個方面去討論如何如何突破限制單個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)實、最為方便的辦法,向運維的同事多申請若干個IP地址就好。在不考慮其它因素前提下,一個IP地址可以對外建立64K個連接,多個IP就是N * 64K了。這個在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)卡方式,一個網(wǎng)卡綁定一個IP地址
      • 代價高
    • 一個網(wǎng)卡上綁定多個可用的虛擬IP地址
      • 比如 ifconfig eth0:2 10.10.10.102 netmask 255.255.255.0
      • 虛擬IP必須是真實可用,否則收不到回包數(shù)據(jù)

    要是沒有足夠的可用虛擬IP地址供你使用,或許你需要關(guān)注一下后面的IP_TRANSPARENT特性描述 :))

    2. 考慮Linux內(nèi)核新增SO_REUSEPORT端口重用特性

    以被壓測的一個TCP服務(wù)器為例,繼續(xù)拿網(wǎng)絡(luò)四元組說事。

    {SrcIp, SrcPort, TargetIp, TargetPort}
    
    • 線上大部分服務(wù)器所使用的系統(tǒng)為CentOS 6系列,所使用系統(tǒng)內(nèi)核低于3.9
      • {SrcIp, SrcPort} 確定了本地建立一個連接的唯一性,本地地址的唯一性
      • {TargetIp, TargetPort}的無法確定唯一,僅僅標識了目的地址
    • Linux Kernel 3.9 支持 SO_REUSEPORT 端口重用特性 - 網(wǎng)絡(luò)四元組中,任何一個元素值的變化都會成為一個全新的連接
      • 真正讓網(wǎng)絡(luò)四元組一起組成了一個網(wǎng)絡(luò)連接的唯一性
      • 理論上可以對外建立的連接數(shù)依賴于四個元素可變數(shù)值
      • Totalconnections = NSrcIp * NSrcPort * NTargetIp * NTargetPort

    線上有部分服務(wù)器安裝有CentOS 7,其內(nèi)核為3.10.0,很自然支持端口重用特性。

    針對只有一個IP地址的壓測端服務(wù)器而言,端口范圍也就確定了,只能從目標服務(wù)器連接地址上去考慮。有兩種方式:

    1. 目標服務(wù)器增加多個可用IP地址,服務(wù)程序綁定指定端口即可
      • N個IP地址,可用存在 64K * N
    2. 服務(wù)程序綁定多個Port,這個針對程序而言難度不大
      • 針對單個IP,監(jiān)聽了M個端口
      • 可用建立 64K * M 個連接
    3. 可用這樣梳理 , Total1 ip connections = 64K * N * M

    啰嗦了半天,但目前Tsung還沒有打算要提供支持呢,怎么辦,自己動手豐衣足食吧:

    https://github.com/weibomobile/tsung/commit/f81288539f8e6b6546cb9e239c36f05fc3e1b874

    3. 透明代理模式支持

    Linux Kernel 2.6.28提供IP_TRANSPARENT特性,支持可以綁定不是本機的IP地址。這種IP地址的綁定不需要顯示的配置在物理網(wǎng)卡、虛擬網(wǎng)卡上面,避免了很多手動操作的麻煩。但是需要主動指定這種配置,比如下面的C語言版本代碼

    int opt =1;
    setsockopt(server_socket, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt));
    

    目前在最新即將打包的1.6.1版本中提供了對TCP的支持,也需要翻譯成對應(yīng)的選項,以便在建立網(wǎng)絡(luò)連接時使用:
    ?

    說明一下:
    - IP_TRANSPARENT沒有對應(yīng)專門的宏變量,其具體值為19
    - SOL_IP定義宏對應(yīng)值:0
    - 添加Socket選項通用格式為:{raw, Protocol, OptionNum, ValueSpec}

    那么如何讓透明代理模式工作呢?

    3.1 啟用IP_TRANSPARENT特性
    <options>
        ...
        <option name="ip_transparent" value="true" />
        ...
    <options>
    
    3.2 配置可用的額外IP地址

    那么這些額外的IP地址如何設(shè)置呢?

    • 可以為client元素手動添加多個可用的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>
      

    但是需要確保:

    1. 這些IP地址目前都沒有被已有服務(wù)器在使用
    2. 并且可以被正常綁定到物理/虛擬網(wǎng)卡上面
    3. 完全可用
    3.3 配置路由規(guī)則支持

    假設(shè)我們的tsung_client1這臺壓測端服務(wù)器,綁定所有額外IP地址到物理網(wǎng)卡eth1上,那么需要手動添加路由規(guī)則:

    ip rule add iif eth1 tab 100
    ip route add local 0.0.0.0/0 dev lo tab 100
    

    這個支持壓測端綁定同一網(wǎng)段的可用IP地址,比如壓測端IP為172.16.247.130,172.16.247.201暫時空閑的話,那我們就可以使用172.16.89.201這個IP地址用于壓測。此時不要求被壓測的服務(wù)器配置什么。

    3.4 進階,我們使用一個新的網(wǎng)段專用于測試

    比如 10.10.10.0 這個段的IP機房暫時沒有使用,那我們專用于壓測使用,這樣一臺服務(wù)器就有了250多個可用的IP地址了。

    壓測端前面已經(jīng)配置好了,現(xiàn)在需要為被壓測的服務(wù)器添加路由規(guī)則,這樣在響應(yīng)數(shù)據(jù)包的時候能夠路由到壓測端:

    route add -net 10.10.10.0 netmask 255.255.255.0 gw 172.16.247.130
    

    設(shè)置完成,可以通過route -n命令查看當前所有路由規(guī)則:

    ?

    在不需要時,可以刪除掉:

    route del -net 10.10.10.0 netmask 255.255.255.0
    

    小結(jié)

    梳理了以上所能夠想到的方式,以盡可能突破單機的限制,核心還是盡可能找到足夠多可用的IP地址,利用Linux內(nèi)核特性支持,程序?qū)用娼壎ūM可能多的IP地址,建立更多的對外連接。當然以上沒有考慮類似于CPU、內(nèi)存等資源限制,實際操作時,還是需要考慮這些資源的限制的。

    posted on 2016-08-16 21:17 nieyong 閱讀(5774) 評論(2)  編輯  收藏 所屬分類: 壓測

    評論

    # re: Tsung筆記之IP地址和端口限制突破篇 2016-08-18 18:25 王大

    博主,請問下
    最新版1.6.1版本什么時候發(fā)布啊,最近工作需要對TCP協(xié)議做性能測試  回復  更多評論   

    # re: Tsung筆記之IP地址和端口限制突破篇 2016-08-19 16:37 nieyong

    @王大
    當前官方?jīng)]有打1.6.1包,檢出最新代碼:https://github.com/processone/tsung 手動編譯就是1.6.1了。  回復  更多評論   

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導航

    <2016年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    統(tǒng)計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 18亚洲男同志videos网站| 亚洲人成伊人成综合网久久久| 91嫩草私人成人亚洲影院| a级大片免费观看| 亚洲成AV人片在线观看无| 毛片免费在线观看| 久久夜色精品国产噜噜噜亚洲AV| 久久免费国产视频| 亚洲乱码中文字幕小综合| 午夜福利不卡片在线播放免费| 亚洲国色天香视频| 男女啪啪永久免费观看网站| 国产综合激情在线亚洲第一页| 免费国产成人午夜电影| 精品97国产免费人成视频| 亚洲精品美女久久久久99| 日韩精品无码专区免费播放| 亚洲成a人片毛片在线| 在线观看免费大黄网站| 一级黄色免费大片| 亚洲精品无码专区在线在线播放| 今天免费中文字幕视频| 亚洲日韩国产精品无码av| 午夜电影免费观看| 一级毛片在线免费视频| 亚洲av无码专区在线播放| 精品国产污污免费网站aⅴ| 亚洲欧美日韩中文字幕一区二区三区 | 在线观看国产一区亚洲bd| 亚洲国产成人精品女人久久久| 国产真人无码作爱视频免费| 亚洲综合小说久久另类区| 日韩一级在线播放免费观看| 一级午夜a毛片免费视频| 亚洲视频免费在线看| 国产精品久久香蕉免费播放| 青青操视频在线免费观看| 亚洲欧洲日本在线观看| 中文字幕亚洲无线码| 99久久免费国产精品特黄| 深夜A级毛片视频免费|