Haproxy压测及参数调优

Posted exman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haproxy压测及参数调优相关的知识,希望对你有一定的参考价值。

Haproxy压测及参数调优

[root@3b9d411b-0a16-4bc4-acd8-10f71b997c29 etc]# ss -s&&free -g
Total: 102008 (kernel 102040)
TCP:   102003 (estab 101812, closed 56, orphaned 77, synrecv 0, timewait 0/0), ports 30060

Transport Total     IP        IPv6
*     102040    -         -        
RAW   0         0         0        
UDP   4         3         1        
TCP   101947    101946    1        
INET      101951    101949    2        
FRAG      0         0         0        

             total       used       free     shared    buffers     cached
Mem:             7          2          5          0          0          0
-/+ buffers/cache:          2          5
Swap:            0          0          0
先看上面的信息:
  • 这台机器已将建立10w个链接,最高压测到17w左右
  • 但是内存和cpu都没有到达瓶颈

cpu和内存的原因可能是没有用ssl链接都是基于http链接计算量小的缘故,也有可能是vegeta
没有输出足够的压力源导致,后期会完善压测方法,由此说明我们haproxy还有更大潜力挖掘。

下面会介绍单个Haproxy机器上实现这种规模访问所需的配置,和详细的内核调优方法。

测试目标

我们要测试的组件是HAProxy 1.6 版。生产环境是在4核8G的机器上运行该软件,当前所有的连接都是非 SSL 的。

测试目标有两方面:

  • 将线上环境Haproxy连接数从可怜的2000链接数提升到1w

  • 其次,希望能够测试单个 HAProxy 每秒请求数和最大并发连接数的上限

目标一主要因为业务方面需要提高和优化Haproxy性能。 目标二是为了可以在生产环境中部署最少规模的 HAProxy 机器。

组件和配置

  • 使用多台客户端机器来执行 HAProxy 压力测试。

  • 线上测试的 HAProxy1.6的机器 4核,8G,centos6.9

  • 相关后端服务器,5台4核4g,centos6,每个机器运行5个tomcat

压测工具及机器

工具

机器

  • 三台4核4g,内核参数一致

优化参数

  • sysctl.conf配置
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536
# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.default.send_redirects = 1
### 表示是否打开TCP同步标签(syncookie),同步标签可以防止一个套接字在有过多试图连接到达时引起过载
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.ip_local_port_range = 20000 65000
net.ipv4.tcp_max_syn_backlog = 40960
net.ipv4.tcp_max_tw_buckets = 819200
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_dsack = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
### 系统中所允许的文件句柄的最大数目
fs.file-max = 65535
### 单个进程所允许的文件句柄的最大数目
fs.nr_open = 65535
kernel.pid_max = 65536
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1
  • /etc/security/limits.conf配置
*                soft    nproc           65535
*                hard    nproc           65535
*                soft    nofile          65535
*                hard    nofile          65535
  • HAproxy 配置
global
    group root
    user root
    daemon
    nbproc 1
    log 127.0.0.1 local3
    pidfile /var/run/haproxy/pid/10.163.162.65_80.pid
    ulimit-n 1000000 ##这里增大文件打开数
    max-spread-checks  1000ms
    maxconn     30000000 ##这里放开限制
    maxconnrate 30000000
    maxsessrate 30000000
    maxsslconn  30000000
    maxsslrate  30000000
    tune.ssl.default-dh-param 2048
    spread-checks 20
    stats timeout 5000ms
    stats maxconn 50
    stats socket /var/run/haproxy/sock/10.163.162.65_80.sock mode 600 level admin process 1
defaults
    mode http
    maxconn     30000000 ##这里最好与上面一致,否则默认限制2000,找了好久
    option  abortonclose
    option redispatch
    option forwardfor
    balance roundrobin
    log 127.0.0.1 local3 err
    retries 3
    option clitcpka
    option srvtcpka
listen 10.163.162.65:80
    balance roundrobin
    bind 10.163.162.65:80  
    option tcp-check
    option httplog
    #option dontlognull
    timeout http-keep-alive 10s
    timeout http-request    10s
    errorfile 400 /usr/local/haproxy/errorfile/400.html
    errorfile 403 /usr/local/haproxy/errorfile/403.html
    errorfile 408 /usr/local/haproxy/errorfile/408.html
    errorfile 500 /usr/local/haproxy/errorfile/500.html
    errorfile 502 /usr/local/haproxy/errorfile/502.html
    errorfile 503 /usr/local/haproxy/errorfile/503.html
    errorfile 504 /usr/local/haproxy/errorfile/504.html
    timeout connect 100000
    timeout queue   100000
    timeout client  100000
    timeout server  100000
    timeout check   100000
    cookie SERVERID insert indirect nocache
     
        ##后端服务器
        server  172.16.100.110:8480 172.16.100.110:8480 cookie 1852060044 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.110:8180 172.16.100.110:8180 cookie 1852051288 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.110:8080 172.16.100.110:8080 cookie 1852051260 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.110:8280 172.16.100.110:8280 cookie 1852059892 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.110:8380 172.16.100.110:8380 cookie 1852059664 check inter 30000 rise 3 fall 3 weight 22 
        
        server  172.16.100.162:8480 172.16.100.162:8480 cookie 2852060044 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.162:8180 172.16.100.162:8180 cookie 2852051288 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.162:8080 172.16.100.162:8080 cookie 2852051260 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.162:8280 172.16.100.162:8280 cookie 2852059892 check inter 30000 rise 3 fall 3 weight 22  
        server  172.16.100.162:8380 172.16.100.162:8380 cookie 2852059664 check inter 30000 rise 3 fall 3 weight 22

压测过程

  • ab
#!/bin/bash
for i in `seq 1 10000`
do
ab -c 10000 -n 100000  http://10.163.162.103/index.html
done

压测结果

Total: 15694 (kernel 15725)
TCP:   16529 (estab 15077, closed 748, orphaned 170, synrecv 0, timewait 747/0), ports 6077

Transport Total     IP        IPv6
*     15725     -         -        
RAW   0         0         0        
UDP   4         3         1        
TCP   15781     15780     1        
INET      15785     15783     2        
FRAG      0         0         0 

             total       used       free     shared    buffers     cached
Mem:             7          1          5          0          0          0
-/+ buffers/cache:          1          5
Swap:            0          0          0

发现客户端资源消耗的比较大,反而压不上去。

  • 引入vegeta

使用3台客户端vegeta进行压力测试

echo "POST http://10.163.162.65" | vegeta -cpus=4 attack -duration=10m  -header="sleep:1000"  -rate=2000 -workers=500 | tee reports.bin | vegeta report

这里我们简单了解下Vegeta提供的一些参数细节:

1 -cpus=4,定义客户端使用的内核数量。为了能够达到需要的压力值,我们将施压机配置适当调整。仔细观察结果数据会发现,实际压力并不大,配置调整的主要目的是为了能够支撑大量状态为后端服务器休眠的连接。
2 -duration=10m,该参数顾名思义,如果没有指定执行时间,测试将永久运行。
3 -rate=2000,每秒钟请求数。

压测结果

Total: 188713 (kernel 189041)
TCP:   188652 (estab 162234, closed 22, orphaned 0, synrecv 0, timewait 21/0), ports 40061

Transport Total     IP        IPv6
*     189041    -         -        
RAW   0         0         0        
UDP   4         3         1        
TCP   188630    188629    1        
INET      188634    188632    2        
FRAG      0         0         0        

             total       used       free     shared    buffers     cached
Mem:             7          2          4          0          0          0
-/+ buffers/cache:          2          4
Swap:            0          0          0

很轻松达到了16w,而且客户端资源没有消耗太大情况下,看样子如果在客户端配置好的情况下20w也不成问题。

结论

内核主要优化的点:

  • 内核中 fs.file-max = 65535 ### 系统中所允许的文件句柄的最大数目,客户端内核也要优化
  • net.ipv4.tcp_syncookies = 1 ### 表示是否打开TCP同步标签(syncookie),同步标签可以防止一个套接字在有过多试图连接到达时引起过载
  • 其他内核参数也要适当的优化
    haproxy主要优化的点:

global的

  • ulimit-n 1000000 ##这里增大文件打开数
  • maxconn 30000000 ##这里放开限制

defaults 中的

  • maxconn 30000000 ##这里最好与上面一致,否则默认限制2000
    压测工具:
  • ab很消耗客户端资源而且压力源不够稳定,没有多核提升性能
  • vegeta这个工具很好压力源稳定,还有很多的功能没有挖掘出来
    压测工具直接影响压测结果,所以一定要选好。
    后端服务:
  • 后端服务器不要太多,本次测试时发现10台以上不会增加多连接数
  • 每个服务器内存分大点,跑5个tomcat很容易被打死

本次压测效果基本符合预期,发现主要是内核参数与haproxy配置参数不当导致,还有压测工具要选对,后期还有进一步优化的可能比如:nbproc绑定cpu,vegeta功能挖掘。



作者:bobozaker
链接:https://www.jianshu.com/p/21d03ad14477
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于Haproxy压测及参数调优的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用HAProxy实现单机200万SSL连接

高并发Haproxy压力测试与优化之道

大促系统全流量压测及稳定性保证——京东交易架构分享(含PPT)

centos 7 之haproxy的配置文件详解及haproxy参数调优

flink调优之压测任务的合理并行度

jvm参数解析(含调优过程)