百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Lvs性能手册(lvs slb)

zhezhongyun 2025-04-02 00:27 48 浏览

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 sizeofstruct 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 -Ccat /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带宽



相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...