1. 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%被使用的情况。

追查过程

  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

  1. 调网卡队缓存队列

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 性能优化相关推荐

  1. 带你重走 TiDB TPS 提升 1000 倍的性能优化之旅

    今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例. 性能优化这个事情核心只有一句话,用户响应时间去哪儿了?性能优化很困难的原因在于,为了定位用户响 ...

  2. nginx应用总结(2)--突破高并发的性能优化

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...

  3. Nginx突破高并发的性能优化 - 运维笔记

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...

  4. 事务对性能影响_MySQL数据库性能优化史诗级大总结

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...

  5. MySQL数据库(九) 集群 Cluster 和性能优化

    文章目录 6 MySQL 集群 Cluster 6.1 MySQL主从复制 6.1.1 主从复制架构和原理 6.1.2 实现主从复制配置 6.1.3 主从复制相关 6.1.4 实现级联复制 6.1.5 ...

  6. MySQL数据库性能优化史诗级大总结

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据真好 ...

  7. MySQL相关参数配置及性能优化

    MySQL及其优化 文章目录 MySQL及其优化 数据库相关概念 事务的四大特性ACID 影响mysql数据库性能的几个方面 数据库性能优化的重点 CentOS系统参数优化 内核相关参数(/etc/s ...

  8. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  9. MegEngine推理性能优化

    MegEngine推理性能优化 MegEngine「训练推理一体化」的独特范式,通过静态图优化保证模型精度与训练时一致,无缝导入推理侧,再借助工业验证的高效卷积优化技术,打造深度学习推理侧极致加速方案 ...

最新文章

  1. 【带你重拾Redis】Redis持久化
  2. ASA LAB-ASA NAT配置大全
  3. java中输入任意一个数 分别写出他个位 十位_Java 任意输入一个整数,求各个位数之和...
  4. nginx下的session一致性
  5. python读取csv文件并修改指定内容-pandas读取CSV文件时查看修改各列的数据类型格式...
  6. 中psr_PSR-SX900测评:雅马哈升级幅度较大的高品质编曲键盘
  7. python硬盘api-使用python获取电脑的磁盘信息方法
  8. springboot中获得app_在SpringBoot中读取环境变量
  9. leetcode-189. Rotate Array
  10. Windows 平台安装 MongoDB
  11. 大数据时代--windows下spark的安装与配置教程
  12. Ubuntu下emacs使用搜狗输入法
  13. mysql 按照汉字的拼音排序、按照首字母分类
  14. excel嵌入动态二维码 含中文
  15. mysql的分页——limit、offset
  16. 利用Python生成双月分类数据集
  17. 常见的注册表修改大全
  18. 《深入理解Linux内核》-3.3. 进程切换
  19. C语言编程实现书号查询功能,图书图书管理系统——查询模块的设计与实现(C语言).doc...
  20. SSM框架的基本概念(什么是ssm框架?)

热门文章

  1. Java全栈技术体系汇总----主目录----持续更新
  2. 国仁网络资讯:抖音无货源模式怎么运营变现;超详细流程变现教程。
  3. openssl 非对称加密算法DSA命令详解
  4. 苹果各种LTE有锁机改4G最新IPCC下载
  5. 【git】Your configuration specifies to merge with the ref ‘refs/heads/xxx
  6. c语言根据首字母判断星期几,C语言根据指定日期计算是星期几
  7. 批量删除HTML链接软件,Excel原来也可以批量删除超链接
  8. 程序员的马斯洛需求层次
  9. 异构传感器定位论文概述
  10. 前端数据交互中JS中find,include方法的使用场景