背景

小米容器云平台,在构建云厂商集群时,需要通过HAProxy将云厂商LB流量从宿主机转到容器中,但对于HAProxy的性能没有把握。参考网上的一篇HAProxy压测文章,文章中提到HAProxy establish状态连接可以达到 400w,所以以此为目标,进行压测。

参考文章:文章地址

关键点

TCP计数器ListenOverflows大量增加

查看方法

cat /proc/net/netstat | awk '/TcpExt/ { print $21,$22 }'

原因

系统调用listen函数(int listen(int sockfd, int backlog);)的队列长度由min(backlog ,内核参数 net.core.somaxconn ) 决定,对应socket的listen 队列已满的情况下,在新增一个连接时的情况,ListenOverflows计数器加 1 。

解决方案

调整系统参数 net.core.somaxconn = 65535 #默认为128

HAProxy 耗尽cpu问题

现象

HAProxy绑定4核cpu、8核cpu、16核cpu,压测的时候,都会出现CPU 100%被使用的情况。

追查过程

1. 通过 mpstat  -P ALL 1 命令查看cpu 都用在哪里,可以看到cpu都绝大部分用在 sys态上。

2. 通过 strace -p pid -c 查看HAProxy 进程那个系统调用占用cpu 最多,看到cpu 都用在了 connect系统调用上。

3. HAProxy连接后端会使用connect系统调用,查看HAProxy配置,发现HAProxy连接后端就只有两个后端,即这种情况: vegeta(40台压测机器)-》HAProxy-》httptest(2台HAProxy后端),其中 HAProxy连接后端最多只能有63000个端口左右,大量的连接积压在HAProxy机器上,导致cpu被耗尽了。

 

解决方案

大量增加HAProxy的后端,解决HAProxy后端过少的瓶颈。

网卡 drop 数据包

现象

压测的时候,ifconfig发现网卡eth0  RX 出现 droppped。

解决方案

1. 调大网卡Ring buffer

查看:ethtool -g eth0

设置Ring buffer到上限:ethtool -G eth0 rx 4096;ethtool -G eth0 tx 4096

2. 调网卡队缓存队列

net.core.netdev_max_backlog = 2000000  #默认为1000,内核参数配置时,有具体的解释

最新稳定版HAProxy性能

系统自带版本  1.5.18

编译HAProxy 最新稳定版本(1.7.5 )

wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz
tar -xzvf haproxy-1.7.5.tar.gz
cd haproxy-1.7.5/
make  TARGET=linux2628  USE_CPU_AFFINITY=1

压测时资源使用情况

mem:

最新新版:10G

系统自带版本:102G,由于内存不够,使用了swap,

引起cpu iowait占大量增加,导致cpu idle为0。

cpu idle:

最新新版:35%

系统自带版本:0%

结论

相同压力下,新版HAProxy使用内存大量减少。

环境搭建

HAProxy

机器

1台,24 cpu、128G内存的i1 机器

系统版本

centos 7.2

安装系统自带HAProxy:yum install haproxy

sysctl.conf 配置

### 系统中所允许的文件句柄的最大数目
fs.file-max = 12553500
### 单个进程所允许的文件句柄的最大数目
fs.nr_open = 12453500
### 内核允许使用的共享内存大 Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
###单个共享内存段的最大值 Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
### 内核中消息队列中消息的最大值 Controls the maximum size of a message, in bytes
kernel.msgmax = 65536
### 系统救援工具
kernel.sysrq = 0
### 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到缓存队列的数据包的最大数目
net.core.netdev_max_backlog = 2000000
### 默认的TCP数据接收窗口大小(字节)
net.core.rmem_default = 699040
### 最大的TCP数据接收窗口(字节)
net.core.rmem_max = 50331648
### 默认的TCP数据发送窗口大小(字节)
net.core.wmem_default = 131072
### 最大的TCP数据发送窗口(字节)
net.core.wmem_max = 33554432
### 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数
net.core.somaxconn = 65535 ### TCP/UDP协议允许使用的本地端口号
net.ipv4.ip_local_port_range = 15000 65000
net.ipv4.ip_nonlocal_bind = 1
### 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)
net.ipv4.tcp_fin_timeout = 7
### TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_max_orphans = 3276800
### 对于还未获得对方确认的连接请求,可保存在队列中的最大数目
net.ipv4.tcp_max_syn_backlog = 655360
net.ipv4.tcp_max_tw_buckets = 6000000
### 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)
### 第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限.
net.ipv4.tcp_mem = 94500000 915000000 927000000
### 为自动调优定义socket使用的内存。
### 第一个值是为socket接收缓冲区分配的最少字节数;
### 第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;
### 第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)
net.ipv4.tcp_rmem = 32768 699040 50331648
### 为自动调优定义socket使用的内存。
### 第一个值是为socket发送缓冲区分配的最少字节数;
### 第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;
### 第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)
net.ipv4.tcp_wmem = 32768 131072 33554432
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_synack_retries = 2
### 表示是否打开TCP同步标签(syncookie),同步标签可以防止一个套接字在有过多试图连接到达时引起过载
### 内核必须打开了CONFIG_SYN_COOKIES项进行编译,
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
### 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
### 允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
### 启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),
### TCP窗口最大至1GB,TCP连接双方都启用时才生效,默认为1
net.ipv4.tcp_window_scaling = 1
### 最大限度使用物理内存
vm.swappiness = 0

HAProxy配置

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 600s
user haproxy
group haproxy
daemon
#tune.ssl.default-dh-param 2048
maxconn 4000000
nbproc 23
cpu-map 1 1
cpu-map 2 2
cpu-map 3 3
cpu-map 4 4
cpu-map 5 5
cpu-map 6 6
cpu-map 7 7
cpu-map 8 8
cpu-map 9 9
cpu-map 10 10
cpu-map 11 11
cpu-map 12 12
cpu-map 13 13
cpu-map 14 14
cpu-map 15 15
cpu-map 16 16
cpu-map 17 17
cpu-map 18 18
cpu-map 19 19
cpu-map 20 20
cpu-map 21 21
cpu-map 22 22
cpu-map 23 23
stats bind-process 23
defaults
log global
mode tcp
option tcplog
option dontlognull
maxconn 4000000
timeout connect 5000
timeout client 60000
timeout server 60000
# Template Customization
frontend http-in
bind :8200
stats enable
mode http
option httplog
stats auth admin:admin
stats uri /haproxy_stats listen port-30000
bind :30000
mode tcp
option tcplog
balance roundrobin
server staging1 ……
……

HAProxy后端服务

机器

10台,8 cpu、32G内存的3U8机器

系统版本

centos 7.2

程序

简写一个API server

压测机器

机器

80台,8/32 cpu,32/128G内存的机器,机器配置不好统一,所以用80台机器做压测,解决压测端性能、内核参数机器参差不齐的问题。

程序

vegeta   https://github.com/tsenart/vegeta

总结

压测效果复合预期

压测效果基本符合预期,最终establish状态连接达到696W,占用10G内存,CPU使用66%(暂时没有ssl需求,所以没有压测ssl卸载),具体如图:

关键知识点

TCP连接, srcIp:srcPort -》 dstIp:dstPort    srcPort最多63k,并发流量超过63k的时候,应用进程会占用大量cpu。注意压测机器,同样受此限制。

阅读原文

HAProxy压测及参数调优的更多相关文章

  1. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  2. Haproxy压测

    目的:测试Haproxy压测情况 环境: Ha服务器:8核16G虚机,后端6个2核4G,压测客户端3个2核4G 安装和优化: 一.Haproxy #cd /opt/soft #wget http:// ...

  3. Hbase记录-client访问zookeeper大量断开以及参数调优分析(转载)

    1.hbase client配置参数 超时时间.重试次数.重试时间间隔的配置也比较重要,因为默认的配置的值都较大,如果出现hbase集群或者RegionServer以及ZK关掉,则对应用程序是灾难性的 ...

  4. 性能测试三十六:内存溢出和JVM常见参数及JVM参数调优

    堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java h ...

  5. 05:Sysbench压测-innodb_deadlock_detect参数对性能的影响

    目录 sysbench压测-innodb_deadlock_detect参数对性能的影响 一.OLTP测试前准备 二.进行OLTP测试 三.测试结果解读: 四.关于测试后的结论: 五.关于测试后的性能 ...

  6. JVM内存结构、参数调优和内存泄露分析

    1. JVM内存区域和参数配置 1.1 JVM内存结构 Java堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都 ...

  7. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优

    libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...

  8. (转)JVM参数调优八大技巧

    这里和大家分享一下JVM参数调优的八条经验,JVM参数调优,这是很头痛的问题,设置的不好,JVM不断执行FullGC,导致整个系统变得很慢,网站停滞时间能达10秒以上,相信通过本文的学习你对JVM参数 ...

  9. JVM性能参数调优实践,不会执行Full GC,网站无停滞

    原文来自:http://bbs.csdn.net/topics/310110257 本文只做整理记录,供个人学习. 1 JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Full GC,导致整 ...

随机推荐

  1. 【Linux】常见Linux默认的shell

    常见的操作系统下的shell: Linux下默认的shell是Bourne Again shell(bash) Solaris和FreeBSD下默认的是Bourne shell(sh) AIX系统下默 ...

  2. 最大整数(Noip1998连接多位数)

    最大整数(Noip1998连接多位数)[问题描述] 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:343312 ...

  3. notepad++插件实现json、xml格式化

    notepad++比较出色的免费的数据编辑.格式化工具... 现在json.xml文件很流行.格式化也是必须的,方便查看关键信息! 01.下载notepad++及相关插件 npp_7.5.5-x86: ...

  4. weblogic10.3.6打补丁PSU

    weblogic的补丁,非付费不能下载... Oracle WebLogic Server Patch Set Update 10.3.6.0.170418 PATCH_ID - RVBS    #补 ...

  5. Spring+Quartz实现动态添加定时任务

    发布时间:2018-12-03   技术:spring4.0.2+quartz2.2.1   概述 在最近工作中,由于涉及到定时任务特别多,而这些工作又是由下属去完成的,在生成环境中经常会出现业务逻辑 ...

  6. 基于Echarts的股票K线图展示

    发布时间:2018-10-31   技术:javascript+html5+canvas   概述 基于echarts的股票K线图展示,只需引用单个插件,通过简单配置,导入数据,即可实现炫酷复杂的K线 ...

  7. SQL SERVER 2008 “阻止保存要求重新创建表的更改”

    在SQL SERVER2008中,新建数据表以后,若再对该表进行更改,则会出现警告信息“不允许保存更改 阻止保存要求重新创建表的更改”,等等,需要进行一下设置: 工具--->选项--->D ...

  8. ios中第三方库归结

    1:uiscrollview 折叠 展开中不包含tablecell. 展开列表效果 Collapse Click ()  https://github.com/bennyguitar/Collapse ...

  9. ios中Pldatabase的用法(3)

    #import "ViewController.h" @interface ViewController () @property(nonatomic,retain)PLSqlit ...

  10. (转)IntelliJ IDEA java项目导入jar包,打jar包

    以下为转载原文:https://www.cnblogs.com/yulia/p/6824058.html 一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File ->   ...