Haproxy 性能优化
- List item
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
cat 65535 > /proc/sys/net/core/somaxconn
HAProxy 耗尽cpu问题
现象
HAProxy绑定4核cpu、8核cpu、16核cpu,压测的时候,都会出现CPU 100%被使用的情况。
追查过程
通过 mpstat -P ALL 1 命令查看cpu 都用在哪里,可以看到cpu都绝大部分用在 sys态上。
通过 strace -p pid -c 查看HAProxy 进程那个系统调用占用cpu 最多,看到cpu 都用在了 connect系统调用上。
HAProxy连接后端会使用connect系统调用,查看HAProxy配置,发现HAProxy连接后端就只有两个后端,即这种情况: vegeta(40台压测机器)-》HAProxy-》httptest(2台HAProxy后端),其中 HAProxy连接后端最多只能有63000个端口左右,大量的连接积压在HAProxy机器上,导致cpu被耗尽了。
解决方案
大量增加HAProxy的后端,解决HAProxy后端过少的瓶颈。
网卡 drop 数据包
现象
压测的时候,ifconfig发现网卡eth0 RX 出现 droppped。
解决方案
- 调大网卡Ring buffer
查看:ethtool -g eth0
设置Ring buffer到上限:ethtool -G eth0 rx 4096;ethtool -G eth0 tx 4096
- 调网卡队缓存队列
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
编辑/etc/security/limits.conf 添加以下内容
- soft nofile 10000000
- hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000
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 性能优化相关推荐
- 带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例. 性能优化这个事情核心只有一句话,用户响应时间去哪儿了?性能优化很困难的原因在于,为了定位用户响 ...
- nginx应用总结(2)--突破高并发的性能优化
在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...
- Nginx突破高并发的性能优化 - 运维笔记
在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...
- 事务对性能影响_MySQL数据库性能优化史诗级大总结
点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...
- MySQL数据库(九) 集群 Cluster 和性能优化
文章目录 6 MySQL 集群 Cluster 6.1 MySQL主从复制 6.1.1 主从复制架构和原理 6.1.2 实现主从复制配置 6.1.3 主从复制相关 6.1.4 实现级联复制 6.1.5 ...
- MySQL数据库性能优化史诗级大总结
点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据真好 ...
- MySQL相关参数配置及性能优化
MySQL及其优化 文章目录 MySQL及其优化 数据库相关概念 事务的四大特性ACID 影响mysql数据库性能的几个方面 数据库性能优化的重点 CentOS系统参数优化 内核相关参数(/etc/s ...
- kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势
陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...
- MegEngine推理性能优化
MegEngine推理性能优化 MegEngine「训练推理一体化」的独特范式,通过静态图优化保证模型精度与训练时一致,无缝导入推理侧,再借助工业验证的高效卷积优化技术,打造深度学习推理侧极致加速方案 ...
最新文章
- 【带你重拾Redis】Redis持久化
- ASA LAB-ASA NAT配置大全
- java中输入任意一个数 分别写出他个位 十位_Java 任意输入一个整数,求各个位数之和...
- nginx下的session一致性
- python读取csv文件并修改指定内容-pandas读取CSV文件时查看修改各列的数据类型格式...
- 中psr_PSR-SX900测评:雅马哈升级幅度较大的高品质编曲键盘
- python硬盘api-使用python获取电脑的磁盘信息方法
- springboot中获得app_在SpringBoot中读取环境变量
- leetcode-189. Rotate Array
- Windows 平台安装 MongoDB
- 大数据时代--windows下spark的安装与配置教程
- Ubuntu下emacs使用搜狗输入法
- mysql 按照汉字的拼音排序、按照首字母分类
- excel嵌入动态二维码 含中文
- mysql的分页——limit、offset
- 利用Python生成双月分类数据集
- 常见的注册表修改大全
- 《深入理解Linux内核》-3.3. 进程切换
- C语言编程实现书号查询功能,图书图书管理系统——查询模块的设计与实现(C语言).doc...
- SSM框架的基本概念(什么是ssm框架?)
热门文章
- Java全栈技术体系汇总----主目录----持续更新
- 国仁网络资讯:抖音无货源模式怎么运营变现;超详细流程变现教程。
- openssl 非对称加密算法DSA命令详解
- 苹果各种LTE有锁机改4G最新IPCC下载
- 【git】Your configuration specifies to merge with the ref ‘refs/heads/xxx
- c语言根据首字母判断星期几,C语言根据指定日期计算是星期几
- 批量删除HTML链接软件,Excel原来也可以批量删除超链接
- 程序员的马斯洛需求层次
- 异构传感器定位论文概述
- 前端数据交互中JS中find,include方法的使用场景