tsung笔记之ip地址和端口限制突破篇 -凯发k8网页登录

记录工作/学习的点点滴滴。

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
    ].

比如可以配置地址重用:

1. 增加ip地址

这是最为现实、最为方便的办法,向运维的同事多申请若干个ip地址就好。在不考虑其它因素前提下,一个ip地址可以对外建立64k个连接,多个ip就是n * 64k了。这个在tsung中支持的很好。


    
    

增加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还没有打算要提供支持呢,怎么办,自己动手丰衣足食吧:

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特性

    ...
    
3.2 配置可用的额外ip地址

那么这些额外的ip地址如何设置呢?

  • 可以为client元素手动添加多个可用的ip地址

    
       
       
       ......
       
    
    
  • 可以使用新增的iprange特性

    
        
      
    
    

但是需要确保:

  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 阅读(5515) 评论(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包,检出最新代码: 手动编译就是1.6.1了。  回复     

公告

所有文章皆为原创,若转载请标明出处,谢谢~

新浪微博,欢迎关注:

导航

2016年8月
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

常用链接

留言簿(58)

随笔分类(129)

随笔档案(149)

个人收藏

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜

网站地图