强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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内存磁盘网络
< 1002 核4 GB100 GB SSD1 Gbps
100-5004 核16 GB500 GB SSD1 Gbps
500-20008 核32 GB1 TB SSD10 Gbps
2000-1000016 核64 GB2 TB SSD10 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

扩展阅读