LVS、Nginx压测与性能调优(超详细)
off999 2025-01-07 14:56 32 浏览 0 评论
LVS和Nginx作为一个常用的负载均衡软件,充当集群流量入口的角色,需要承载的业务流量一般都比较大,这个时候对LVS/Nginx节点进行一些参数调优,对于发挥它们的性能有很大的帮助。
一、 可能会负载均衡器性能的因素
1. 硬件方面
CPU、内存、网卡。
其中最主要的是CPU和网卡,短连接业务场景下cpu软中断si可能成为性能瓶颈;网卡的最大流量值也可能限制负载均衡器性能的发挥,如常见的千兆网卡,理论最大数据传输速率为1000Mb/s,即125MB/S。LVS对于内存消耗并不多,Nginx相对会消耗内存一些,不过内存一般不会成为瓶颈。
2. 系统方面
Linux系统默认有许多限制,对于在业务流量较大的情况下发挥负载均衡器的性能有很大影响。常见的如: 服务端可接受的最大连接数、可接受的最大半连接数、本地可用端口范围、time-wait连接数、可打开的最大文件句柄数、网卡等待队列大小等。
3. 软件方面
LVS的hash table值,Nginx的nginx.conf调优等。
4. 网络方面
负载均衡器和真实服务器都是通过网络进行通信,如果条件允许,最好将它们置于同机房、同网段下,减小网络时延带来的影响。
二、性能调优介绍
1. 系统参数调优
1.1 网卡多队列与CPU核绑定
网卡多队列是一种硬件技术,即一个物理网卡可以有多个队列通道,需要多队列网卡驱动支持。默认情况下各个队列的请求都是由cpu0核处理,所以很容易因为cpu0核si满造成性能瓶颈。如下所示:
多队列网卡在系统中有多个中断号,通过CPU核绑定,将各个中断号对应的网卡队列绑定到指定的CPU核处理,这样可以发挥多核CPU的优势,将中断请求分摊到多个cpu核上,提升cpu处理性能。
配置方法:
a. 检查系统是否已开启irqbanlance服务,如果有,则关闭该服务,手动进行cpu核绑定。
# ps -ef | grep irqbalance
b. 检查网卡是否支持多队列
#lspci -vvv | grep -A 30 "Ethernet controller"
检查是否存在 MSI-X: Enable+ Count >0,如果存在,说明网卡支持多队列。
c. 查询网卡各队列对应的中断号
# cat /proc/interrupts | grep em3
如下图,可以看到em3网卡有8个队列,分别对应中断号187~194。
d. 将各队列绑定到指定的CPU核
# echo 1 > /proc/irq/187/smp_affinity
# echo 2 > /proc/irq/188/smp_affinity
# echo 4 > /proc/irq/189/smp_affinity
# echo 8 > /proc/irq/190/smp_affinity
# echo 10 > /proc/irq/191/smp_affinity
# echo 20 > /proc/irq/192/smp_affinity
# echo 40 > /proc/irq/193/smp_affinity
# echo 80 > /proc/irq/194/smp_affinity
PS: 这里传入的值为16进制。转换为2进制后对应绑定的cpu核。
如: echo 80 > cat /proc/irq/194/smp_affinity
16进制80转换为2进制为1000 0000,表示将中断号194绑定到cpu7核上面。
从下图可以看到做了网卡多队列与CPU核绑定后,中断处理分摊到了cpu0~7核,处理能力得到提升。
1.2 关注系统链接跟踪表大小
系统链接跟踪表记录了经过系统转发的连接信息,通过加载nf_conntrack模块启用, 对于iptables、SNAT/DNAT等功能是必须启用链接跟踪表的。
但是如果链接跟踪表的值设置的太小,容易造成链接跟踪表满导致丢包的问题。所以需要关注系统的链接跟踪表最大值和当前值的大小,当二者相等时,说明表满,系统会drop新的连接请求。
# sysctl -a | grep nf_conntrack_max (查询系统链接跟踪表最大值)
# sysctl -a | grep nf_conntrack_count (查询系统链接跟踪表当前值)
如下图中的链接跟踪表最大值为65536就太小了,很容易造成丢包。
ps: 链接跟踪表设置大一些虽然不会造成丢包,但是在业务量很大的情况下,如果表过大(上百万的级别),系统查询链接跟踪表会消耗大量的cpu资源,可能会导致系统挂死。
1.3 关闭网卡LRO、GRO特性
现在大多数网卡都具有LRO/GRO功能,即 网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃;
因此,如果我们用LVS来传输大文件,很容易出现丢包,传输速度慢;
解决方法,关闭LRO/GRO功能,命令:(注意查看命令是小k,修改命令是大K)
ethtool -k eth0 查看LRO/GRO当前是否打开
ethtool -K eth0 lro off 关闭GRO
ethtool -K eth0 gro off 关闭GRO
1.4 增大网卡的ring buffer值。
# ethtool -G em4 rx 4096
# ethtool -G em4 tx 4096
1.5 增大网卡等待队列大小
netdev_max_backlog参数表示每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。当网卡流量很大时,可以调大这个参数值。
# sysctl -w net.core.netdev_max_backlog=262144
1.6 增大服务端全连接队列大小
somaxconn参数表示服务端已完成3次握手连接的队列大小,即单个服务可建立的tcp连接最大值。当需要增大服务端处理并发连接的能力时,需要调大该参数值。
# sysctl -w net.core.somaxconn=262144
1.7 增大服务端半连接队列大小
tcp_max_syn_backlog参数表示服务端接收syn消息队列的大小。如果该队列未满,则响应(syn,ack)消息;否则将丢弃客户端的syn包。
# sysctl -w net.ipv4.tcp_max_syn_backlog=262144
1.8 增大系统可用的本地端口范围
# sysctl -w net.ipv4.ip_local_port_range="1024 65535"
1.9 增大系统time_wait状态连接数限制
tcp_max_tw_buckets表示系统允许存在的time_wait状态连接数。Time wait状态是tcp断连中一个正常的状态,它存在的作用主要包括:确保tcp连接可靠的断开和旧连接的报文在网络中彻底消失。如果这个值过小,则客户端不会进入time_wait状态,而是直接从FIN_WAIT状态结束。这时候服务端最后一次挥手的FIN消息会以收到RST结束,可能会导致服务端断连异常。
# sysctl -w net.ipv4.tcp_max_tw_buckets=262144
1.10 启用time_wait状态连接复用
增大tcp_max_tw_buckets值有一个负面影响,就是系统time_wait状态连接过多,将可用端口耗尽,导致没有足够的可用端口新建连接。这时候可以启用time_wait状态连接复用。注意需要同时启用时间戳tcp_timestamps。(注意开启tcp_timestamps后要确认关闭tcp_tw_recycle)
# sysctl -w net.ipv4.tcp_timestamps=1
# sysctl -w net.ipv4.tcp_tw_reuse=1
1.11 增大系统最大文件句柄数
fs.file-max表示系统整体允许打开的最大文件句柄数。这个值一般只需关注一下,如果配置过小,可以增大。
# sysctl -a | grep fs.file-max
1.12 增大系统进程最大文件句柄数
ulimit -n查询的结果表示单个进程允许打开的最大文件句柄数,可用ulimit -n xxx调大该参数值。
# ulimit -n
# ulimit -n xxx
注意这只是在当前shell下生效的,系统重启后会丢失,需要同时修改/etc/security/limits.conf中的nofile值。其中,* 这行的配置表示对非root用户生效。
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
2. LVS参数调优
2.1 增大ipvs模块hash table的大小
ipvs模块hash table默认值为2^12=4096,改为2^20=1048576。
可以用ipvsadm -l命令查询当前hash table的大小。
修改方法:
在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为:
options ip_vs conn_tab_bits=20
重新加载ipvs模块。
3.Nginx参数调优
Nginx的参数配置都在nginx.conf文件中。
3.1 配置worker进程数等于系统cpu核数,并配置cpu核绑定。
worker_processes auto;
worker_cpu_affinity auto;
这里比较方便的是配置为auto,但是根据实际的系统情况指定worker进程数和手动绑定cpu核可能性能会更高一些,比如避开中断irq处理的cpu核,将worker进程绑定到其它空闲的cpu核上。
3.2 使用epoll模型
use epoll;
3.3 关闭TCP的Nagle算法
tcp_nodelay on;
Nagle算法规定了一个TCP连接中最多只能存在一个未被确认的小包,这可能会和系统的延迟ACK机制产生冲突,造成较为严重的时延。
3.4 增大单个worker进程的文件句柄数限制
worker_rlimit_nofile 1024000;
3.5 增大单个worker进程的最大并发连接数限制
worker_connections 1024000;
这里的最大并发连接包括前后端的连接,且该参数值不能大于worker_rlimit_nofile。
4. 硬件与网络配置调优
4.1 对物理网卡做多网卡绑定
采用mode 0或mode 4对多块物理网卡做绑定,提升网卡整体的传输速率。如将两块传输速率为1000MB/S的网卡做mode0绑定,则理论上bond网卡的传输速率为2000MB/S。
4.2 将负载均衡器和真实服务器放在一个局域网内
负载均衡器和真实服务器靠网络传输数据,如果条件允许,将它们放在一个局域网内,避免数据传输走路由器传输。
三、性能分析工具
1. 分析cpu性能
top:按1可以看到每个cpu核的cpu使用情况,同时还能看到各个进程的情况。
sar -u 1:每隔1秒打印出当前cpu的整体使用情况。
mpstat -P ALL 1 :每隔1秒打印出所有cpu核的使用情况。
ps:sar和mastat需要安装sysstat工具包。
2. 分析网卡流量
sar -n DEV 1:每隔1秒打印出所有网卡的流量传输情况。
3. 查看网卡配置
# ethtool xxx
下图em3为千兆网卡,注意这里的单位是小b。
4. 查看bond网卡绑定模式
# cat /proc/net/bonding/xxx
下面的bond0网卡的绑定模式为mode0,轮询。
四、 性能压测工具
这里介绍一个很好用的http压测工具:wrk。
1. 安装方法
#git clone https://github.com/wg/wrk
# make
# ln -s xxx/wrk /usr/sbin/wrk
2. 使用方法
使用方法: wrk <选项> <被测HTTP服务的URL>
Options:
-c, --connections 跟服务器建立并保持的TCP连接数量
-d, --duration 压测时间
-t, --threads 使用多少个线程进行压测
-s, --script 指定Lua脚本路径
-H, --header 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout 超时时间
-v, --version 打印正在使用的wrk的详细版本信息
代表数字参数,支持国际单位 (1k, 1M, 1G)
代表时间参数,支持时间单位 (2s, 2m, 2h)
3. 示例
wrk默认为http长连接。
使用10个线程、1000个长连接对指定URL压测60s,并打印时延信息。
# wrk -t10 -c1000 -d60s --latency "http://xxx/test.html"
Requests/sec: 149863.60 # 每秒的请求数,即QPS
Transfer/sec: 67.02MB # 每秒传输的字节数
指定头域实现http短连接测试。
# wrk -t10 -c1000 -d60s -H "Connection: Close" --latency “http://xxx/test.html”
4. 注意压测客户端也会遇到性能问题,也需要对其进行性能调优。
最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含
spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、
最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主
(666)领取,祝大家更上一层楼!!!
相关推荐
- txt小说下载网站(TXT小说下载网站免费下载)
-
因为许多小说都没有授权,而且99小说下载网的名声过大,被人追究了,不得不关闭了!久久小说下载网是一款免费看小说的软件,该平台每天都会为用户更新大量的小说资源,种类齐全,无论你想看霸道总裁还是古代穿越,...
- ghost系统镜像(ghost磁盘镜像)
-
答方法步骤如下1、一般GHOST工具是在PE启动后使用,这个就是PE中GHOST所在路径,找到这个软件并运行。2、界面是英文版本的,因为软件的易操作易学习性,所以这个软件基本没有中文版版本,然后在弹出...
- 二手车个人出售(闲鱼二手车个人出售)
-
从个人手里买二手车流程,首先查验车辆证照是否齐全,然后审核车辆是否真实有效,签订旧机动车买卖合同,然后到二手车交易市场开具二手车销售统一发票,并收取交易管理服务费,接着办理过户、转籍手续,最后是变更车...
- photoshop网站(ps的网站)
-
PHOTOSHOP的官网是Adobe官网。因为PHOTOSHOP是Adobe公司的产品,所以其官网也是Adobe的官网。同时,Adobe官网还提供其他的设计软件和创意工具,如Illustrator和I...
- qq空间偷看工具网页版(偷看别人qq空间犯法吗)
-
腾讯规定:QQ空间若想控制访问,只允许设置:“好友访问”、“指定对象访问”、“回答问题访问”等多种特定人群访问许可,你所说的“禁止有无痕浏览特权的黄钻访问”,是绝对不可能实现的,腾讯没有开辟这一功能。...
- qq炫舞手机端(QQ炫舞手机端登录入口)
-
要3个G左右,不是占内存,是占硬盘的容量。在我的电脑上QQ炫舞刚下载的时候就有3G左右了,现在已经完全补丁了,才占3.97G,大概也就是这个数了。切记不要安装在C盘你关掉无线网就可以下载了,如果不能下...
- 安全消防教育平台登录(消防安全教育网)
-
这个问题需要更明确的信息才能给出具体的解决方案。一般来说,如果你忘记了账号和密码,可以通过输入注册时填写的手机号或者邮箱来找回。如果有安全问题设置,也可以通过验证安全问题来找回。如果还是无法解决,可以...
- 音乐大全300首免费听(音乐歌曲大全免费)
-
1、《红昭愿》《红昭愿》,这首歌曲由音阙诗听演唱,音阙诗听在古风歌曲界早已有一定名气。这首《红昭愿》与他们之前的风格很相似,歌曲节奏欢快,其中掺杂了不同的音乐元素,融合在一起才有了这一动听的歌曲。2、...
- 搜狗输入法的优势(搜狗输入法的优势和劣势)
-
1、在输入50个左右的字符之后,搜狗输入法的耗电量为225μAh,只从绝对耗电量来看可以说是微乎其微的。但是如果是频繁使用,应该还是会耗一些电的。2、搜狗拼音输入法(简称搜狗输入法、搜狗拼音)是200...
- 直接下载mp3音乐的网站(直接下载mp3音乐的网站推荐)
-
说明书里有呀91flac音乐网,试试这个,绝对好使,但是不要在酷狗上面说有几个网站挺不错的一个酷猪首页上的歌曲都很好听还有一个是http://www.songtaste.com/music/这个网...
- h5视频播放器(h5视频播放器适配竖屏模式)
-
要实现H5播放器在切换窗口时不暂停,可以使用WebAPI中的PageVisibilityAPI。该API允许开发者检测页面是否可见或隐藏。当页面切换到后台时,可以通过监听visibilitych...
-
- 百度云盘网页登录入口(百度网页入口官网网址)
-
手机登陆云盘可以通过更改UA设置来解决,方法如下:1.打开浏览器,点击进入浏览器的菜单选项。2.在设置的页面中,找到【浏览器标识/UA】,这个选项默认是【手机版】,即默认打开手机版网页。点击进入更改3.进入浏览器标识选择页面,将UA设置为电...
-
2026-02-03 00:15 off999
- 韩国色情大片震撼来袭
-
《千与千寻》导演:宫崎骏剧情简介:千寻和爸妈在去新家途中误入了一个诡异世界,爸妈因为贪吃变成了猪,许多半透明的怪人围攻千寻,幸被小白救下。小白给千寻吃了阻止身体消失的药,两人成为朋友。不料小白又被一...
- 天天斗地主单机(欢乐斗地主单机版免费)
-
有,可以在软件商店直接搜索单机斗地主。1.单机斗地主不要钱,不用流量。2.单机的玩法少,有单一的斗地主,闯关式的斗地主,残局式的斗地主,普通的斗地主。3.闯关式的斗地主,这种斗地主AI的水平都是控制...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
