Subsections of Components

Cgroup有什么作用

cgroup 的功能非常丰富,除了 CPU 限制外,还提供了多种系统资源的管控能力:

1. 内存管理(memory)

1.1 内存限制

# 设置内存使用上限
echo "100M" > /sys/fs/cgroup/memory/group1/memory.limit_in_bytes

# 设置内存+Swap 上限
echo "200M" > /sys/fs/cgroup/memory/group1/memory.memsw.limit_in_bytes

1.2 内存统计和监控

# 查看内存使用情况
cat /sys/fs/cgroup/memory/group1/memory.usage_in_bytes
cat /sys/fs/cgroup/memory/group1/memory.stat

1.3 内存压力控制

# 设置内存回收压力
echo 100 > /sys/fs/cgroup/memory/group1/memory.swappiness

2. 块设备 I/O 控制(blkio)

2.1 I/O 带宽限制

# 限制读带宽 1MB/s
echo "8:0 1048576" > /sys/fs/cgroup/blkio/group1/blkio.throttle.read_bps_device

# 限制写带宽 2MB/s  
echo "8:0 2097152" > /sys/fs/cgroup/blkio/group1/blkio.throttle.write_bps_device

2.2 I/OPS 限制

# 限制每秒读操作数
echo "8:0 100" > /sys/fs/cgroup/blkio/group1/blkio.throttle.read_iops_device

# 限制每秒写操作数
echo "8:0 50" > /sys/fs/cgroup/blkio/group1/blkio.throttle.write_iops_device

2.3 I/O 权重分配

# 设置 I/O 优先级权重(100-1000)
echo 500 > /sys/fs/cgroup/blkio/group1/blkio.weight

3. 进程控制(pids)

3.1 进程数限制

# 限制最大进程数
echo 100 > /sys/fs/cgroup/pids/group1/pids.max

# 查看当前进程数
cat /sys/fs/cgroup/pids/group1/pids.current

4. 设备访问控制(devices)

4.1 设备权限管理

# 允许访问设备
echo "c 1:3 rwm" > /sys/fs/cgroup/devices/group1/devices.allow

# 拒绝访问设备
echo "c 1:5 rwm" > /sys/fs/cgroup/devices/group1/devices.deny

5. 网络控制(net_cls, net_prio)

5.1 网络流量分类

# 设置网络流量类ID
echo 0x100001 > /sys/fs/cgroup/net_cls/group1/net_cls.classid

5.2 网络优先级

# 设置网络接口优先级
echo "eth0 5" > /sys/fs/cgroup/net_prio/group1/net_prio.ifpriomap

6. 挂载点控制(devices)

6.1 文件系统访问限制

# 限制挂载命名空间操作
echo 1 > /sys/fs/cgroup/group1/devices.deny

7. 统一层级 cgroup v2 功能

cgroup v2 提供了更统一的管理接口:

7.1 资源保护

# 内存低水位线保护
echo "min 50M" > /sys/fs/cgroup/group1/memory.low

# CPU 权重保护
echo 100 > /sys/fs/cgroup/group1/cpu.weight

7.2 I/O 控制

# I/O 权重
echo "default 100" > /sys/fs/cgroup/group1/io.weight

# I/O 最大带宽
echo "8:0 rbps=1048576 wbps=2097152" > /sys/fs/cgroup/group1/io.max

8. 实际应用场景

8.1 容器资源限制

# Docker 容器资源限制
docker run -it \
  --cpus="0.5" \
  --memory="100m" \
  --blkio-weight=500 \
  --pids-limit=100 \
  ubuntu:latest

8.2 systemd 服务限制

[Service]
MemoryMax=100M
IOWeight=500
TasksMax=100
DeviceAllow=/dev/null rw
DeviceAllow=/dev/zero rw
DeviceAllow=/dev/full rw

8.3 Kubernetes 资源管理

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: app
    resources:
      limits:
        cpu: "500m"
        memory: "128Mi"
        ephemeral-storage: "1Gi"
      requests:
        cpu: "250m" 
        memory: "64Mi"

9. 监控和统计

9.1 资源使用统计

# 查看 cgroup 资源使用
cat /sys/fs/cgroup/memory/group1/memory.stat
cat /sys/fs/cgroup/cpu/group1/cpu.stat
cat /sys/fs/cgroup/io/group1/io.stat

9.2 压力状态信息

# 查看内存压力
cat /sys/fs/cgroup/memory/group1/memory.pressure

10. 高级功能

10.1 资源委托(cgroup v2)

# 允许子 cgroup 管理特定资源
echo "+memory +io" > /sys/fs/cgroup/group1/cgroup.subtree_control

10.2 冻结进程

# 暂停 cgroup 中所有进程
echo 1 > /sys/fs/cgroup/group1/cgroup.freeze

# 恢复执行
echo 0 > /sys/fs/cgroup/group1/cgroup.freeze

cgroup 的这些功能使得它成为容器化技术(如 Docker、Kubernetes)的基础,提供了完整的资源隔离、限制和统计能力,是现代 Linux 系统资源管理的核心技术。

Mar 7, 2024

IPVS

IPVS 是什么?

IPVS(IP Virtual Server) 是 Linux 内核内置的第4层(传输层)负载均衡器,是 LVS(Linux Virtual Server)项目的核心组件。

基本概念

  • 工作层级:传输层(TCP/UDP)
  • 实现方式:内核空间实现,高性能
  • 功能:将 TCP/UDP 请求负载均衡到多个真实服务器

IPVS 的核心架构

客户端请求
    ↓
虚拟服务 (Virtual Service) - VIP:Port
    ↓
负载均衡调度算法
    ↓
真实服务器池 (Real Servers)

IPVS 的主要作用

1. 高性能负载均衡

# IPVS 处理能力可达数十万并发连接
# 相比 iptables 有更好的性能表现

2. 多种负载均衡算法

# 查看支持的调度算法
grep -i ip_vs /lib/modules/$(uname -r)/modules.builtin

# 常用算法:
rr      # 轮询 (Round Robin)
wrr     # 加权轮询 (Weighted RR)
lc      # 最少连接 (Least Connection)
wlc     # 加权最少连接 (Weighted LC)
sh      # 源地址哈希 (Source Hashing)
dh      # 目标地址哈希 (Destination Hashing)

3. 多种工作模式

NAT 模式(网络地址转换)

# 请求和响应都经过负载均衡器
# 配置示例
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 10.244.1.10:80 -m
ipvsadm -a -t 192.168.1.100:80 -r 10.244.1.11:80 -m

DR 模式(直接路由)

# 响应直接返回客户端,不经过负载均衡器
# 高性能模式
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 10.244.1.10:80 -g
ipvsadm -a -t 192.168.1.100:80 -r 10.244.1.11:80 -g

TUN 模式(IP 隧道)

# 通过 IP 隧道转发请求
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 10.244.1.10:80 -i
ipvsadm -a -t 192.168.1.100:80 -r 10.244.1.11:80 -i

IPVS 在 Kubernetes 中的应用

kube-proxy IPVS 模式的优势

# 性能对比
iptables: O(n) 链式查找,规则多时性能下降
ipvs:   O(1) 哈希表查找,高性能

Kubernetes 中的 IPVS 配置

# 查看 kube-proxy 是否使用 IPVS 模式
kubectl -n kube-system get pods -l k8s-app=kube-proxy -o yaml | grep mode

# 查看 IPVS 规则
ipvsadm -Ln

IPVS 的核心功能

1. 连接调度

# 不同调度算法的应用场景
rr      # 通用场景,服务器性能相近
wrr     # 服务器性能差异较大
lc      # 长连接服务,如数据库
sh      # 会话保持需求

2. 健康检查

# IPVS 本身不提供健康检查
# 需要配合 keepalived 或其他健康检查工具

3. 会话保持

# 使用源地址哈希实现会话保持
ipvsadm -A -t 192.168.1.100:80 -s sh

IPVS 管理命令详解

基本操作

# 添加虚拟服务
ipvsadm -A -t|u|f <service-address> [-s scheduler]

# 添加真实服务器
ipvsadm -a -t|u|f <service-address> -r <server-address> [-g|i|m] [-w weight]

# 示例
ipvsadm -A -t 192.168.1.100:80 -s wlc
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:8080 -m -w 1
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:8080 -m -w 2

监控和统计

# 查看连接统计
ipvsadm -Ln --stats
ipvsadm -Ln --rate

# 查看当前连接
ipvsadm -Lnc

# 查看超时设置
ipvsadm -L --timeout

IPVS 与相关技术对比

IPVS vs iptables

特性IPVSiptables
性能O(1) 哈希查找O(n) 链式查找
规模支持大量服务规则多时性能下降
功能专业负载均衡通用防火墙
算法多种调度算法简单轮询

IPVS vs Nginx

特性IPVSNginx
层级第4层 (传输层)第7层 (应用层)
性能内核级,更高用户空间,功能丰富
功能基础负载均衡内容路由、SSL终止等

实际应用场景

1. Kubernetes Service 代理

# kube-proxy 为每个 Service 创建 IPVS 规则
ipvsadm -Ln
# 输出示例:
TCP  10.96.0.1:443 rr
  -> 192.168.1.10:6443    Masq    1      0          0
TCP  10.96.0.10:53 rr
  -> 10.244.0.5:53        Masq    1      0          0

2. 高可用负载均衡

# 配合 keepalived 实现高可用
# 主备负载均衡器 + IPVS

3. 数据库读写分离

# 使用 IPVS 分发数据库连接
ipvsadm -A -t 192.168.1.100:3306 -s lc
ipvsadm -a -t 192.168.1.100:3306 -r 192.168.1.20:3306 -m
ipvsadm -a -t 192.168.1.100:3306 -r 192.168.1.21:3306 -m

总结

IPVS 的主要用途:

  1. 高性能负载均衡 - 内核级实现,处理能力强大
  2. 多种调度算法 - 适应不同业务场景
  3. 多种工作模式 - NAT/DR/TUN 满足不同网络需求
  4. 大规模集群支持 - 适合云原生和微服务架构
  5. Kubernetes 集成 - 作为 kube-proxy 的后端,提供高效的 Service 代理

在 Kubernetes 环境中,IPVS 模式相比 iptables 模式在大规模服务下具有明显的性能优势,是生产环境推荐的负载均衡方案。