news 2026/10/14 3:32:34

LVS 凭什么比 Nginx 快?四种工作模式与调度算法拆开讲

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LVS 凭什么比 Nginx 快?四种工作模式与调度算法拆开讲

Nginx 和 HAProxy 做负载均衡,都要把数据包从内核态提到用户态、处理完再送回去;LVS 直接在内核里改完地址就转发了,这一步之差就是数量级的差距。这篇不碰实验环境,只把原理讲透:先分清「管理工具」与「转发引擎」谁在干活,再拆开 NAT、DR、TUN、FULLNAT 四种模式的报文改写规则,然后是 10 种调度算法与 ipvsadm 全套命令。动手部署的部分另有一篇《LVS 负载均衡怎么落地?NAT 与 DR 两套实验全记录》。文中命令名与选项均标注英文原意,完整清单见文末《附:命令英文全称速查表》。

本文概要:

项目内容
文章主题LVS 原理篇:内核态 ipvs 转发机制与工具/引擎分工 → NAT / DR / TUN / FULLNAT 四种工作模式 → 10 种调度算法 → ipvsadm 命令速查
所属类别Linux 系统管理 → Web 服务 → LVS 负载均衡
知识关键字ipvs·ip_vs·ipvsadm·Keepalived·netlink·VIP·DIP·RIP·CIP·-m·-g·-i

概念图给出「客户端 → Director → 真实服务器」这条主链路。全篇分五章:定位与术语、内核转发路径、四种工作模式、调度算法、命令速查。动手部署的部分见姊妹篇《LVS 负载均衡怎么落地?NAT 与 DR 两套实验全记录》。

一、LVS 是谁,凭什么快

1.1 一句话定位

Linux 虚拟服务器(LVS,Linux Virtual Server)用负载均衡技术把多台服务器组成一台虚拟服务器。它为快速增长的网络访问需求提供了「负载能力易扩展、价格低廉」的解决方案。

LVS 是章文嵩博士 1998 年创建的开源负载均衡软���。它工作在内核空间,按请求报文的目标 IP 与目标端口把请求调度到后端集群中的某个节点。

它和 Nginx、HAProxy 的根本差别就在这里。Nginx 与 HAProxy 跑在用户空间,数据包要「内核 → 用户 → 内核」走两遍;LVS 的转发逻辑全在内核里完成。

1.2 术语先对齐

缩写英文全称含义
VS / DirectorVirtual Server / Director调度器,也就是负载均衡器
RSReal Server后端服务器、真实服务器,也叫 Backend Server
VIPVirtual IP调度器对外提供服务的 IP 地址
DIPDirector IP调度器与后端 RS 通信的 IP 地址
RIPReal Server IP后端真实服务器自己的 IP 地址
CIPClient IP客户端的 IP 地址

一台调度器一般配两个地址:VIP 对外提供服务,DIP 对内和后端通信。

1.3 管理工具与转发引擎:两者不是一回事

  • ipvsadm:跑在用户空间的命令行工具,在 Director 上定义集群服务、添加 Real Server;
  • ipvs:跑在内核空间的代码块(内核模块ip_vs),挂在 netfilter 的 INPUT 钩子上,真正执行转发。

关系可以类比iptables与 netfilter:一个「下命令」,一个「干活」。ipvsadm 自己一个包都不转发,它通过 netlink 把「虚拟服务、RS 列表、调度算法」下发到内核;此后每个进来的包都由ip_vs直接查表转发。

对比项ipvsadmipvs(内核ip_vs)
运行位置用户空间内核空间
是不是进程是,用完即退不是,是内核模块
职责下发 / 查看 / 保存规则查表、改写报文、转发
卸载后规则表仍在内核里转发照常,业务不中断
包里的那个「服务」是什么

yum install ipvsadm除了主程序还会装一个 systemd 单元,名字容易误导。它的职责只有一条:开机时把规则文件读回内核。

Type=oneshot ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore /etc/sysconfig/ipvsadm" ExecStop=/sbin/ipvsadm -C RemainAfterExit=yes

Type=oneshot说明它执行一次就结束,不是常驻守护进程;RemainAfterExit=yes让命令跑完后仍标记 active,所以status里看不到进程属正常。这也解释了启动失败的原因:/etc/sysconfig/ipvsadm不存在时ipvsadm-restore返回非零、服务直接报错,所以要先touch它。

卸掉管理工具,转发还能跑吗

能。转发是内核在做,ipvsadm 只是遥控器。

动作结果
停ipvsadm.service执行ipvsadm -C,规则清空、转发停止
只删命令(rpm -e ipvsadm)不重启已下发的规则留在内核,转发照常
重启且规则没存过规则丢失,又无命令恢复,服务起不来

⚠️ 删包不会卸载内核模块,ip_vs会一直在内存里。想真停掉转发得ipvsadm -C或modprobe -r ip_vs。一句话记:卸载不会立刻中断服务,但会让你失去全部配置与排查手段。

生产上谁在管这套规则

ipvsadm 不做健康检查,只认当前写进内核的那份规则。生产上真正管 LVS 的是Keepalived。它内置 ipvs 规则管理组件,通过netlink把配置块下发到内核,与 ipvsadm 走同一套内核接口。同时它还负责两件事:用 VRRP 决定谁是主调度器,用健康检查决定摘除哪台 RS。所以双机主备场景里规则由它下发,但仍建议装着 ipvsadm——规则出问题时,ipvsadm -Ln是唯一能直接看到内核规则表的工具。

要把某台主机配成 Director,先确认内核支持 ipvs 并装好 ipvsadm。Director 要转发所有请求、压力较大,生产环境中不要用虚拟机。

二、工作原理:报文在内核里走的四步

ipvs 借助内核 netfilter 子系统处理进入本机的数据包,过程分四步:

  1. 客户端向调度器 Director Server 发起请求,请求进入内核空间;
  2. PREROUTING 链先收到请求,判断目标 IP 是本机,于是把数据包送给 INPUT 链;
  3. IPVS 是挂在 INPUT 链上的代码块。它把请求和自己定义好的集群服务逐个比对;
  4. 一旦命中集群服务,IPVS 就改掉报文的目标 IP 与端口,再从 POSTROUTING 送出。

第 4 步送出去的时候,POSTROUTING 会发现目标地址正好落在后端服务器网段,于是按路由把包交给那台后端机。

三、四种工作模式

常用的工作模式有四种:lvs-nat、lvs-dr、lvs-tun、lvs-fullnat。差别可以一句话记住:NAT 改目标地址,DR 改 MAC 地址,TUN 再套一层 IP 头。

3.1 NAT 模式:改目标地址

把请求报文的目标地址与目标端口改成某台 RS 的,源地址保持不变。

图:NAT 模式四个阶段的字段对照,蓝底为被改写的字段。

回程要点:RS 以 RIP 为源把响应交给 Director,Director 再把源地址改回 VIP 发给客户端。进出双向都过调度器,这既是 NAT 的瓶颈,也是「RS 网关必须指向 DIP」的由来——回包不经过调度器,进出就不对称。

3.2 DR 模式:只改 MAC

为请求报文重新封装 MAC 首部:源 MAC 换成 DIP 网卡的,目标 MAC 换成某台 RS 接口的。IP 首部一动不动,源 IP 仍是 CIP,目标 IP 始终是 VIP。

图:DR 模式只动二层——源 MAC 与目标 MAC 被改写,IP 首部一字未动。

回程要点:RS 处理完,用 lo 口上的 VIP 作源地址直接把响应发给客户端,不经过 Director。这是 DR 吞吐远高于 NAT 的原因,代价是 RS 与 DS 必须能二层互通、且 RS 的 VIP 不能响应 ARP。

3.3 TUN 模式:外面再套一层 IP

原报文一字不改,只在外面再封装一个 IP 首部:外层源 IP 为 DIP,外层目标 IP 为 RIP。

图:TUN 模式在原报文外再套一层 IP 首部(源 DIP → 目标 RIP),内层一字不改。

回程要点:RS 拆掉最外层 IP 后,发现内层目标是自己的 lo 接口 VIP,处理完直接把响应发给客户端;RS 的网关不能、也不可能指向 DIP。

3.4 FULLNAT 模式:源和目标一起改

NAT 只改目标地址,于是有「RS 网关必须指向 DIP」这条硬约束。fullnat 把源地址与目标地址一起改:源地址改成 DIP,目标地址改成 RIP。

图:FULLNAT 与 NAT 的差别就在第二步——NAT 只改目标 IP,FULLNAT 连源 IP 一起改。

RS 看到的来源变成 DIP 同网段,回包按普通路由就能回到 Director,网关不必再指向调度器。⚠️ 它不在主线内核里,属于 LVS 的扩展实现(阿里巴巴开源的那一套),使用前要确认内核支持。

3.5 四种模式横向对照

对比项NATDRTUNFULLNAT
改写什么目标 IP + 端口源 / 目标 MAC外层加一个 IP 首部源 IP + 目标 IP
响应经过 Director 吗经过不经过不经过经过
RS 网关要求必须指向 DIP不能指向 DIP不能指向 DIP无要求
与 DS 二层互通不要求必须同一物理网络不要求(可跨机房)不要求
支持端口映射支持不支持不支持支持
地址要求RS 与 DIP 均私网RIP 可公可私三个地址均须公网无特殊要求
对 RS 的要求任意 OSlo 口配 VIP + 关 ARP支持 IP 隧道任意 OS
内核支持主线自带主线自带主线自带需扩展内核
典型场景小规模、后端需改端口高吞吐 Web 集群跨机房容灾后端网关不可改的云环境

一条选择顺序:能二层互通就上 DR(吞吐最高、配置也不复杂);后端必须跨机房就选 TUN;网关动不了或要端口映射就考虑 NAT,规模大了再上 FULLNAT。

四、10 种调度算法

算法表里rr~sh属静态(不看后端负载),lc~lblcr属动态(参考实际连接数)。几条选择经验:

  • 后端性能一致用rr,性能有差异用wrr或wlc;
  • 需要同一客户端固定落到同一台,用sh(缓存命中同理可用dh);
  • 请求耗时差异大,用lc或wlc更稳;
  • sed与nq是 WLC 的改良版,nq额外保证不会让某台机器一直空着。

五、ipvsadm 命令速查

ipvsadm 分两件事:管理集群服务(VIP 这一层),管理集群服务里的 Real Server。

参数含义英文原意
-A添加一个新的集群服务Add
-E编辑一个已有的集群服务Edit
-D删除一个集群服务Delete
-C清空所有规则Clear
-R重新载入规则Restore
-S保存规则Save
-a添加一条 Real Server 规则add
-e编辑一条 Real Server 规则edit
-d删除一条 Real Server 规则delete
-L/-l列出已定义的规则List
-Z清空计数器Zero
-t服务使用 TCP 协议TCP
-u服务使用 UDP 协议UDP
-f防火墙标记(firewall-mark)方式定义服务firewall mark
-s指定调度算法scheduler
-p持久连接时长,配合ipvsadm -Lcn查看持久连接状态persistent
-M定义掩码,配合持久连接按网段做会话保持netmask
-r指定后端 Real Server 的地址real server
-g定义为 LVS-DR 模型gateway
-i定义为 LVS-TUN 模型ipip
-m定义为 LVS-NAT 模型masquerade
-w定义权重,后面跟具体权值weight
-n数字形式显示 IP 与端口,不做域名解析numeric
--stats显示累计的连接与流量统计statistics

命令按用途分三组记:

## 定义集群服务(VIP 层)ipvsadm -A|E -t|u|f service-address[-s scheduler][-p[timeout]][-M netmask]ipvsadm-D-t|u|f service-address# 删除一个集群服务ipvsadm-C# 清空所有规则ipvsadm-R# 重新载入规则ipvsadm-S[-n]# 保存规则## 管理集群服务里的 Real Serveripvsadm -a|e -t|u|f service-address-rserver-address[-g|i|m][-w weight]ipvsadm-d-t|u|f service-address-rserver-address# 删除一条 RS 规则## 查看与计数ipvsadm -L|l[options]ipvsadm-L-n# 不解析域名,直接显示 IPipvsadm-Z[-t|u|f service-address]# 清空计数器ipvsadm-Lcn# 查看持久连接状态

⚠️ipvsadm -S的输出重定向到/etc/sysconfig/ipvsadm才会持久保存;ipvsadm.service启动时正是从这个文件读取规则(详见 1.3)。

5.1 装完之后:文件清单与状态检查

包里除主程序/usr/sbin/ipvsadm,还有ipvsadm-save(等价-S)、ipvsadm-restore(等价-R)与单元文件ipvsadm.service。两个配置容易混:/etc/sysconfig/ipvsadm是规则数据(需手工touch),ipvsadm-config才是服务配置。要直接看内核里生效的规则,也可以读/proc/net/ip_vs(连接表在/proc/net/ip_vs_conn)。

规则能生效的前提是ip_vs模块已加载。modprobe解决「内核有没有这个能力」,yum install ipvsadm解决「有没有命令去用它」:

grep-i'ip_vs'/boot/config-$(uname-r)# 检查内核编译时是否带 ipvs 支持lsmod|grepip_vs# 查看模块是否已加载modprobe ip_vs# 手工加载(首次执行 ipvsadm 时也会自动加载)

附:命令英文全称速查表

命令 / 缩写英文全称 / 原意作用
LVSLinuxVirtualServerLinux 虚拟服务器,内核态负载均衡方案
ipvsIP VirtualServer内核里执行转发的代码,挂在 INPUT 钩子上
ipvsadmIPVSadministration用户空间管理工具
ipvsadm-save/ipvsadm-restoreIPVS adminsave/restore规则导出到文件 / 从文件读回内核
ip_vsIPVirtualServer提供转发能力的内核模块名
netlinknet link用户空间与内核通信的套接字协议,ipvsadm 与 Keepalived 都走它
Keepalivedkeepalive+daemon高可用守护进程,用 VRRP 做主备并用健康检查维护 RS
VRRPVirtualRouterRedundancyProtocol虚拟路由冗余协议,决定谁是主调度器
VS/RSVirtualServer /RealServer虚拟服务器(调度器)/ 后端真实服务器(详见 1.2 术语表)
VIP/DIP/RIP/CIPVirtual /Director /Real server /ClientIP对外服务地址 / 调度器内网地址 / 后端地址 / 客户端地址
NATNetworkAddressTranslation网络地址转换,NAT 模式改目标地址
Masqmasqueradeipvsadm 回显里 NAT 模式的标记
DRDirectRouting直接路由,只改 MAC 的模式
TUNTUNnel隧道模式,外层再套一个 IP 头
FULLNATfullNAT源地址与目标地址同时改写
oneshot/RemainAfterExitone shot / remain after exitsystemd 单元类型:执行一次即结束、结束后仍标记 active(见 1.3)
RR/WRR/LC/WLCRoundRobin /Weighted RR /LeastConnections /Weighted LC轮询 / 加权轮询 / 最少连接 / 加权最少连接(10 种算法详见第四章)
SED/NQ/LBLC/DH/SHShortestExpectedDelay /NeverQueue /Locality-Based LC /DestinationHash /SourceHash其余调度算法
sysctlsystemctl查看与修改内核参数

📚 参考资料(官方文档 · 中英双语)

  • Linux Virtual Server 官方网站(LVS 三大模式与项目背景的原始文档)
  • IPVS 内核参数文档(kernel.org)(连接表、调度器与转发相关内核参数)
  • Server Load Balancer overview(Alibaba Cloud)(四层与七层负载均衡的产品化解释)
  • 负载均衡 SLB 产品概述(阿里云)(中文版)

其余手册在服务器上直接查,不依赖网络、不占链接数:

man8ipvsadm# 集群服务与 Real Server 的全部选项man5sysctl.conf# 内核参数的写法

总结:LVS 这条线的逻辑是「入口统一、转发在内核」。工具与引擎各管一头:ipvsadm(或接管的 Keepalived)在用户空间通过 netlink 定义「谁是对外入口(VIP)、后面有哪几台机器」,ip_vs内核模块按-s指定的算法挑一台,再按-m、-g、-i决定怎么改写报文。所以卸掉管理工具不会让正在跑的转发停下来,但会失去全部配置与排查手段。NAT 只改目标地址、双向都过调度器;DR 只改 MAC、回程不过调度器,是生产里最常用的那一种;TUN 能跨机房但 RS 要支持隧道。觉得有用可以收藏;如果你也踩过 DR 模式 VIP 被 RS 抢答 ARP 的坑,欢迎在评论区聊聊当时是怎么定位的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 3:31:23

WPS AI 办公落地:AI 抽取、翻译、AIPPT 三个真实场景怎么接

在日常办公场景中,我们常常陷入一种“低效忙碌”的怪圈:为了制作一份演示文稿,需要在 PPT 软件里反复调整排版、对齐文本框,耗费数小时却只完成了内容的堆砌;面对堆积如山的合同文档,只能依靠肉眼逐行扫描&…

作者头像 李华
网站建设 2026/10/14 3:31:08

20261013_205810_大模型预训练如何进行:从数据准备到小模型训练实践

没有人把世界上所有问题的答案逐条写给模型,它为什么还能接话、解释概念、写文章?答案的一部分,藏在模型正式提供服务之前的大规模学习中。 这篇先把事情讲简单:模型用一组可调整的数值处理输入,这些数值叫参数。训练…

作者头像 李华
网站建设 2026/10/14 3:30:38

用AI重构15万行代码:效率提升70%,小白也能看懂的大模型工程化实践

本文介绍了如何利用AI Coding进行大型系统重构,通过建立工程化方法论,将重构过程分解为规划、设计、执行、验收四个阶段,并利用Harness和Loop机制约束AI行为,实现高效、可控的重构。文章以去哪儿机票报价系统为例,展示…

作者头像 李华
网站建设 2026/10/14 3:30:12

perf mem

perf mem 获取内存分配信息的机制与 perf kmem 完全不同:它不监听内核的分配事件,而是通过 CPU 硬件性能计数器,直接采样程序实际发生的每一次内存“访问”(加载/存储)。 核心机制:硬件采样,而…

作者头像 李华