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

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

IPVS vs Nginx

特性 IPVS Nginx
层级 第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 模式在大规模服务下具有明显的性能优势,是生产环境推荐的负载均衡方案。