网站首页 > 技术文章 正文
lvs是做什么的
lvs通常用做tcp/udp协议的四层负载均衡
相比也可以用于四层负载的Nginx组件,Lvs因为运行在内核态,性能高是它的主要优势,同样,因为运行在内核态中,无法像Nginx那样,对四层的tls做卸载等动作。
lvs性能相关指标(用户视角)
客户端的连接数
- UDP模式下,按连接超时时间计算(根据业务需求决定)。可通过ipvsadm -l --timeout来查看udp超时时间
- TCP模式下,即为tcp连接数
客户端请求流量
即client与lvs、lvs与RS之间交互的流量
客户端请求平均包大小
即client与lvs、lvs与RS之间的平均包大小
lvs性能相关参数
会话超时时间
查看
ipvsadm -l --timeout
修改
ipvsadm --set ${tcptimeout} ${tcpfintimeout} ${udptimeout}
vm conntrack最大个数
查看
sysctl -a |grep net.netfilter.nf_conntrack_max
查看当前nf_conntrack个数
# 方式一
conntrack -C
# 方式二
cat /proc/net/nf_conntrack | wc -l
修改
sysctl -w net.netfilter.nf_conntrack_max=1024
hashsize
什么是hashsize
hashsize也就是nf_conntrack_buckets,如果不手动指定。linux会根据机器的内存计算。如果要支持海量的nf_conntrack,则可以适当调大。
// nf_conntrack_core.c
nf_conntrack_htable_size
= (((nr_pages << PAGE_SHIFT) / 16384)
/ sizeof(struct hlist_head));
if (BITS_PER_LONG >= 64 &&
nr_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE)))
nf_conntrack_htable_size = 262144;
else if (nr_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
nf_conntrack_htable_size = 65536;
if (nf_conntrack_htable_size < 1024)
nf_conntrack_htable_size = 1024;
hlist_head的大小在64位的机器下大小为16
查看
cat /sys/module/nf_conntrack/parameters/hashsize
修改 (方式一)
echo 65536 > /sys/module/nf_conntrack/parameters/hashsize
修改(方式二)永久生效
# exmaple file, you can modify this config if exists. File name doesn't matter.
# 样例文件,你可以修改已存在的这个文件。文件名称并不重要。
touch /etc/modprobe.d/lvs.conf
echo "options nf_conntrack hashsize=65536" >> /etc/modprobe.d/lvs.conf
# then you need reboot
# 需要重试来使配置生效
文件句柄数
查看
ulimit -n
修改
不同的linux发行版,修改方式不太一样,以RedHat为例
num=`ulimit -n`
sed -i "s|$num|65536|g" /etc/security/limits.d/*-nofile.conf
lvs性能瓶颈
虚拟机内存
contnrack使用slab分配内存,可以通过slabtop命令查看nf_conntrack模块占用的内存。当连接数较高时,Lvs的内存瓶颈在于会话管理。
conntrack最大理论内存占用为
max_mem_used = conntrack * max * sizeof (struct nf_conntrack) + conntrack_buckets * sizeof (struct list_head)
使用如下python代码计算
import ctypes
# 这个是nf_conntrack的动态库所在路径
# libnetfilter git地址 git://git.netfilter.org/libnetfilter_conntrack
LIBNETFILTER_CONNTRACK = '/usr/lib/aarch64-linux-gnu/libnetfilter_conntrack.so.3.7.0'
nfct = ctypes.CDLL(LIBNETFILTER_CONNTRACK)
print("max size of struct nf_conntrack:")
print(nfct.nfct_maxsize())
print("sizeof(struct list_head):")
print(ctypes.sizeof(ctypes.c_void_p) * 2)
其中nfct_maxsize出自于
git://git.netfilter.org/libnetfilter_conntrack中的src/conntrack/api.c
/**
* nfct_maxsize - return the maximum size in bytes of a conntrack object
*/
在如下操作系统下
uname -a
> Linux primary 5.4.0-122-generic #138-Ubuntu SMP Wed Jun 22 15:05:39 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
以100万conntrack_max,65536buckets为例,占用的内存为
1_000_000 * 392 + 65536 * 16 约等于 373.84 + 1 为374M内存
网卡流量
最大进出带宽。在云上,通常由云厂商限制。如果你将lvs上面的浮动Ip通过EIP的方式暴露出去(这很常见),还需要考虑EIP自身的带宽
网卡进出包个数(PPS)
最大进出包个数
虚拟机能支持的最大网络连接数
ECS上可以支持的最大网络连接数。在云上,通常由云厂商限制
Lvs监控&扩容
cpu使用率
可在超过百分之80的时候告警。处理方式:
- 如果内存还没有到达瓶颈,可以通过扩大hashsize的方式,降低hash链上元素的个数,减少匹配消耗的cpu
- 如果内存水位也较高。对CPU进行扩容
内存使用率
可在超过内存容量百分之80的时候告警。处理方式:扩容内存
conntrack个数
通过conntrack -C或cat /proc/net/nf_conntrack | wc -l, 定期进行统计,使用sysctl -w
net.netfilter.nf_conntrack_max进行扩容
网卡流量、网卡进出包个数
可以利用云厂商的监控或nicstat命令查看。处理方式:扩容网卡
最大网络连接数
可以利用云厂商的监控或netstat -an|egrep "tcp|udp"|grep -v "LISTEN"|wc -l查看。处理方式:扩容ECS规格
EIP带宽
通过云厂商的指标来监控。处理方式,扩容EIP的BGP带宽
猜你喜欢
- 2025-06-15 CentOS6下通过Yum安装 heartbeat教程
- 2025-06-15 基于FFmpeg+VAAPI的硬件加速渲染技术
- 2025-06-15 C#技术分享【PDF转换成图片——13种方案】
- 2025-06-15 针对开源IDS SURICATA的实践和超大流量高性能压测
- 2025-06-15 [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
- 2025-06-15 打造基于 Linux 的自动化漏洞扫描平台 OpenVAS+ Redis+ PostgreSQL
- 2025-06-15 Debian 12.10 发布,安全性与稳定性提升
- 2025-06-15 安卓系统手机文件夹及其文件详细解析
- 2025-06-15 Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 2025-06-15 【提示】上图明起恢复读者办证,增设电话预约入馆服务!
- 最近发表
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- think in java (14)
- javascript权威指南 (19)
- nfs (25)
- componentart (17)
- yii框架 (14)
- springbatch (28)
- oracle数据库备份 (25)
- iptables (21)
- 自动化单元测试 (18)
- python编写软件 (14)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- dfn (14)
- http error 503 (21)
- pop3服务器 (18)
- 图表组件 (17)
- android退出应用 (21)