聶永的博客

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

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

          前言

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

          但現在我還想繼續深入一下,如何突破這個限制呢 ?

          如何突破限制

          這部分就是要從多個方面去討論如何如何突破限制單個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地址

          這是最為現實、最為方便的辦法,向運維的同事多申請若干個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可以有多種方式:

          • 增加物理網卡方式,一個網卡綁定一個IP地址
            • 代價高
          • 一個網卡上綁定多個可用的虛擬IP地址
            • 比如 ifconfig eth0:2 10.10.10.102 netmask 255.255.255.0
            • 虛擬IP必須是真實可用,否則收不到回包數據

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

          2. 考慮Linux內核新增SO_REUSEPORT端口重用特性

          以被壓測的一個TCP服務器為例,繼續拿網絡四元組說事。

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

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

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

          1. 目標服務器增加多個可用IP地址,服務程序綁定指定端口即可
            • N個IP地址,可用存在 64K * N
          2. 服務程序綁定多個Port,這個針對程序而言難度不大
            • 針對單個IP,監聽了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地址的綁定不需要顯示的配置在物理網卡、虛擬網卡上面,避免了很多手動操作的麻煩。但是需要主動指定這種配置,比如下面的C語言版本代碼

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

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

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

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

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

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

          • 可以為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地址目前都沒有被已有服務器在使用
          2. 并且可以被正常綁定到物理/虛擬網卡上面
          3. 完全可用
          3.3 配置路由規則支持

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

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

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

          3.4 進階,我們使用一個新的網段專用于測試

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

          壓測端前面已經配置好了,現在需要為被壓測的服務器添加路由規則,這樣在響應數據包的時候能夠路由到壓測端:

          route add -net 10.10.10.0 netmask 255.255.255.0 gw 172.16.247.130
          

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

          ?

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

          route del -net 10.10.10.0 netmask 255.255.255.0
          

          小結

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

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

          評論

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

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

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

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

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

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

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贵州省| 赤峰市| 荣昌县| 佳木斯市| 嘉祥县| 梅河口市| 都江堰市| 武邑县| 贵港市| 河北省| 周宁县| 措勤县| 定西市| 沁阳市| 甘洛县| 万州区| 万山特区| 黄大仙区| 维西| 镶黄旗| 四子王旗| 奈曼旗| 黄陵县| 遵义县| 汕尾市| 郸城县| 平定县| 专栏| 巴南区| 北京市| 荥经县| 龙江县| 金沙县| 宣武区| 新郑市| 英德市| 山丹县| 龙江县| 芜湖市| 泽普县| 太原市|