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功能挖掘。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 目录: HAProxy是什么 HAProxy的核心能力和关键特性 HAProxy的安装和运行 使用HAProxy搭...
    kelgon阅读 79,747评论 9 159
  • 【进度汇报】 1、锻炼身体:56400步/210000步 2、早睡早起:4/21 3、学习英语:9/30、阅读理解...
    刘旭晖阅读 291评论 0 0
  • 小时候,只知道正月十五是月半。长大后知道它还有个洋气的名字叫元宵节,可我们还是习惯了叫月半。 母亲常说:大年...
    圆圆2408阅读 685评论 0 0