Squid 完全指南 / 11 - 性能调优
第十一章:性能调优
11.1 性能调优概述
Squid 性能调优涉及多个层面:内存管理、磁盘 I/O、网络参数、操作系统内核等。调优的目标是在有限的硬件资源下最大化吞吐量和缓存命中率。
┌────────────────────────────────────────────────────┐
│ 性能调优层次 │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 应用层(Squid 配置) │ │
│ │ cache_mem | cache_dir | 连接参数 | I/O线程 │ │
│ └──────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 操作系统层 │ │
│ │ 文件描述符 | TCP 参数 | 内核参数 | 调度器 │ │
│ └──────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 硬件层 │ │
│ │ CPU | 内存 | SSD/HDD | 网卡 | RAID │ │
│ └──────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────┘
11.2 Squid 应用层调优
11.2.1 内存优化
# ============ 内存配置 ============
# 内存缓存大小(建议物理内存的 25-50%)
cache_mem 2048 MB
# 内存中对象最大大小
maximum_object_size_in_memory 512 KB
# 内存替换策略(推荐 GDSF)
memory_replacement_policy heap GDSF
# 内存池大小
memory_pools on
memory_pools_limit 2 GB
# 缓冲池大小
# read_ahead_gap 16 KB
# 请求缓冲区
request_body_max_size 0 KB # 不限制(根据需求调整)
11.2.2 磁盘缓存优化
# ============ 磁盘缓存 ============
# 使用 AUFS 存储(异步 I/O)
cache_dir aufs /var/spool/squid 50000 256 4096
# 使用 Rock 存储(小对象高并发)
cache_dir rock /var/spool/squid/rock 10240 max-size=32768
# 对象大小限制
maximum_object_size 256 MB
minimum_object_size 0 KB
# 缓存替换策略
cache_replacement_policy heap GDSF
# 缓存目录 I/O 线程数
# AUFS 自动管理,无需手动设置
11.2.3 连接优化
# ============ 连接参数 ============
# 客户端连接超时
client_lifetime 1 day
request_timeout 30 seconds
persistent_request_timeout 2 minutes
# 上游连接超时
connect_timeout 30 seconds
read_timeout 5 minutes
request_timeout 30 seconds
# 持久连接
server_persistent_connections on
client_persistent_connections on
pipeline_prefetch on
# 最大连接数(系统级限制,需配合文件描述符)
# 未设置则无限制
11.2.4 I/O 线程优化
# I/O 线程数(默认自动,建议手动设置为 CPU 核心数)
# io_threads 16
# 线程堆栈大小
# stack 65536
# 原始 I/O 缓冲
# read_ahead_gap 16 KB
11.2.5 DNS 优化
# DNS 缓存
dns_nameservers 8.8.8.8 8.8.4.4 114.114.114.114
# DNS 超时
dns_timeout 30 seconds
# DNS 缓存大小
ipcache_size 4096
fqdncache_size 4096
# DNS 死亡时间
dns_v4_first on
11.3 操作系统调优
11.3.1 文件描述符限制
# 查看当前限制
ulimit -n
# 临时设置
ulimit -n 65536
# 永久设置
# /etc/security/limits.conf
proxy soft nofile 65536
proxy hard nofile 65536
# systemd 服务文件
# /etc/systemd/system/squid.service.d/override.conf
[Service]
LimitNOFILE=65536
# 重新加载 systemd
sudo systemctl daemon-reload
sudo systemctl restart squid
11.3.2 TCP 参数优化
# /etc/sysctl.d/99-squid.conf
# 增大连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# TCP 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP 连接复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# TCP keepalive
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# 最大连接数
net.ipv4.ip_local_port_range = 1024 65535
# 网络积压
net.core.netdev_max_backlog = 65535
# 应用配置
sysctl -p /etc/sysctl.d/99-squid.conf
11.3.3 内存管理
# /etc/sysctl.d/99-squid-memory
# 虚拟内存
vm.swappiness = 10
vm.overcommit_memory = 0
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# 文件系统缓存
vm.vfs_cache_pressure = 50
# 应用
sysctl -p /etc/sysctl.d/99-squid-memory
11.3.4 文件系统优化
# 使用 ext4 文件系统(推荐)
# 挂载选项
# /dev/sdb1 /var/spool/squid ext4 defaults,noatime,nodiratime,data=writeback 0 2
# 或使用 XFS
# /dev/sdb1 /var/spool/squid xfs defaults,noatime,logbufs=8 0 0
# 禁用文件访问时间更新
# 在 /etc/fstab 中添加 noatime
# 调整文件系统日志模式
# ext4: data=writeback(不保证数据完整性,但性能更好)
# 注意:仅适用于缓存目录,不适用于重要数据
11.3.5 CPU 调度优化
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 设置为 deadline(适合 I/O 密集型)
echo deadline > /sys/block/sda/queue/scheduler
# SSD 使用 noop
echo noop > /sys/block/sda/queue/scheduler
# CPU 亲和性(多核环境)
# squid.conf 中可以设置 CPU 亲和性(Squid 6.x)
11.4 网络调优
11.4.1 网卡优化
# 增大网卡缓冲
ethtool -G eth0 rx 4096 tx 4096
# 启用 LRO/GRO
ethtool -K eth0 lro on gro on
# 启用 TCP 卸载
ethtool -K eth0 tso on gso on
# 查看网卡统计
ethtool -S eth0 | grep -i drop
11.4.2 多网卡绑定
# 使用 bonding 提高网络吞吐
# /etc/netplan/01-bond.yaml
network:
version: 2
bonds:
bond0:
interfaces: [eth0, eth1]
parameters:
mode: 802.3ad
lacp-rate: fast
mii-monitor-interval: 100
addresses: [192.168.1.1/24]
11.5 性能监控
11.5.1 Squid 内置统计
# 综合统计信息
squidclient -h localhost mgr:info
# 5 分钟统计
squidclient -h localhost mgr:5min
# 内存使用
squidclient -h localhost mgr:mem
# 缓存目录统计
squidclient -h localhost mgr:storedir
# 活跃连接
squidclient -h localhost mgr:active_requests
# 连接统计
squidclient -h localhost mgr:5min | grep "client_http"
11.5.2 系统监控
# CPU 和内存使用
top -p $(pgrep -d',' squid)
# 网络连接数
ss -s
ss -t state established | wc -l
# 磁盘 I/O
iostat -x 1
# 文件描述符使用
cat /proc/$(pgrep squid)/limits | grep "Max open files"
ls /proc/$(pgrep squid)/fd | wc -l
# 网络流量
iftop -i eth0
nload eth0
11.5.3 关键性能指标
| 指标 | 获取方式 | 健康范围 | 说明 |
|---|
| 请求命中率 | mgr:info | > 60% | 缓存效果 |
| 字节命中率 | mgr:info | > 30% | 带宽节省 |
| 平均响应时间 | mgr:5min | < 100ms | 用户体验 |
| 并发连接数 | mgr:5min | < 5000 | 系统负载 |
| 文件描述符 | /proc/.../fd | < 80% 限制 | 资源使用 |
| 内存使用 | mgr:mem | < 80% 可用 | 内存压力 |
| 缓存大小 | mgr:storedir | < 90% 配置 | 存储空间 |
11.6 性能基准测试
11.6.1 使用 ab (Apache Bench)
# 安装
sudo apt install -y apache2-utils
# 测试代理性能
ab -n 10000 -c 100 -X localhost:3128 http://example.com/
# 参数说明:
# -n 10000: 总请求数
# -c 100: 并发数
# -X: 代理服务器地址
11.6.2 使用 wrk
# 安装
sudo apt install -y wrk
# 测试
wrk -t4 -c200 -d30s --latency -s proxy.lua http://example.com/
# proxy.lua 内容:
# wrk.method = "GET"
# wrk.headers["Host"] = "example.com"
11.6.3 使用 hey
# 安装
go install github.com/rakyll/hey@latest
# 测试
hey -n 10000 -c 100 -proxy http://localhost:3128 http://example.com/
11.6.4 基准测试结果解读
# hey 输出示例:
Summary:
Total: 10.2345 secs
Slowest: 0.5234 secs
Fastest: 0.0012 secs
Average: 0.0234 secs
Requests/sec: 976.54
Response time histogram:
0.001 [1] |
0.050 [7823] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.100 [1523] |■■■■■
0.200 [453] |■
0.300 [123] |
0.500 [77] |
11.7 容量规划
11.7.1 硬件需求估算
| 用户规模 | CPU | 内存 | 磁盘 | 网络 |
|---|
| < 100 | 2 核 | 4 GB | 100 GB SSD | 1 Gbps |
| 100-500 | 4 核 | 16 GB | 500 GB SSD | 1 Gbps |
| 500-2000 | 8 核 | 32 GB | 1 TB SSD | 10 Gbps |
| 2000-10000 | 16 核 | 64 GB | 2 TB SSD | 10 Gbps |
| > 10000 | 集群部署 | 集群 | 分布式 | 多链路 |
11.7.2 带宽估算
日均用户数 × 平均请求/用户 × 平均对象大小 = 日流量
日流量 / 86400 = 平均带宽
平均带宽 × 峰值系数(2-3) = 峰值带宽
示例:
1000 用户 × 500 请求 × 100KB = 50GB/天
50GB / 86400 ≈ 580 KB/s ≈ 4.6 Mbps
峰值: 4.6 × 3 ≈ 14 Mbps
11.8 性能调优检查清单
# 1. 检查文件描述符限制
ulimit -n
# 2. 检查缓存命中率
squidclient -h localhost mgr:info | grep "hit"
# 3. 检查内存使用
squidclient -h localhost mgr:mem
# 4. 检查磁盘 I/O
iostat -x 1
# 5. 检查网络连接
ss -s
# 6. 检查 TCP 参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
# 7. 检查 Squid 进程状态
ps aux | grep squid
# 8. 检查日志中的错误
tail -100 /var/log/squid/cache.log | grep -i "error\|warning\|over"
11.9 本章小结
| 调优层面 | 关键参数 | 预期效果 |
|---|
| 内存 | cache_mem, memory_replacement_policy | 提高内存命中率 |
| 磁盘 | cache_dir 类型选择 | 提高 I/O 吞吐 |
| 连接 | 超时、持久连接、pipeline | 降低延迟 |
| 文件描述符 | ulimit -n, systemd LimitNOFILE | 避免连接拒绝 |
| TCP 内核 | somaxconn, tcp_max_syn_backlog | 避免连接丢弃 |
| 文件系统 | noatime, writeback | 减少磁盘 I/O |
扩展阅读