Ubuntu系统下Squid代理服务器迁移后的系统参数调优咨询(含文件描述符不足问题)
兄弟,我刚看到你从RHEL迁移Squid到Ubuntu后遇到文件描述符不足的警告,还导致性能上不去的问题——这情况我之前帮同行处理过,先给你解决核心问题,再聊聊Ubuntu上运行Squid需要额外关注的系统调优点:
先搞定文件描述符不足的问题
你提到Squid当前的文件描述符上限是1024,这是Ubuntu默认的进程限制,比RHEL的默认设置要严格,所以会出现之前没遇到的警告。解决方法分临时应急和永久生效两种:
临时应急(重启后失效)
如果想立刻缓解问题,可以先临时调高Squid进程的文件描述符限制:
# 先找到Squid的进程PID,比如你这里是1966 sudo prlimit --nofile=65535:65535 -p 1966
之后重启Squid让新限制生效:
sudo systemctl restart squid
永久生效(推荐)
要让限制永久生效,需要修改systemd的服务配置,因为Ubuntu用systemd管理服务,这和RHEL的配置逻辑略有差异:
- 创建Squid的systemd覆盖配置文件:
sudo mkdir -p /etc/systemd/system/squid.service.d sudo nano /etc/systemd/system/squid.service.d/override.conf
- 在文件里添加以下内容,把文件描述符上限调到足够大(比如65535,根据你的业务量调整):
[Service] LimitNOFILE=65535 LimitNOFILESoft=65535
- 重载systemd配置并重启Squid:
sudo systemctl daemon-reload sudo systemctl restart squid
- 验证是否生效:
# 查看Squid进程的文件描述符限制 cat /proc/$(pidof squid)/limits | grep "Max open files"
另外,也可以在系统全局的限制文件/etc/security/limits.conf里添加Squid用户的限制,双重保险:
squid soft nofile 65535 squid hard nofile 65535
Ubuntu上Squid运行的其他系统参数调优
除了文件描述符,Ubuntu还有几个系统层面的参数需要调整,来匹配Squid的代理负载:
内核网络参数调优
编辑/etc/sysctl.conf文件,添加或修改以下参数,优化网络连接处理能力:
# 增大监听队列的最大长度,避免连接被丢弃 net.core.somaxconn = 65535 # 网络设备接收队列的最大长度,适配高并发 net.core.netdev_max_backlog = 32768 # TCP握手队列的最大值,应对突发的连接请求 net.ipv4.tcp_max_syn_backlog = 65535 # 允许重用TIME_WAIT状态的套接字,快速释放连接资源 net.ipv4.tcp_tw_reuse = 1 # 缩短FIN_WAIT2的超时时间,减少无效连接占用 net.ipv4.tcp_fin_timeout = 30 # 降低TCP连接的内存压力 net.ipv4.tcp_mem = 8388608 12582912 16777216
修改后执行sudo sysctl -p让参数生效。
文件系统优化
如果你的Squid缓存目录挂载在ext4文件系统上,建议修改挂载选项来减少磁盘IO开销:
编辑/etc/fstab,找到缓存目录的挂载行,添加noatime,dir_index选项,比如:
/dev/sdb1 /var/spool/squid ext4 defaults,noatime,dir_index 0 2
然后执行sudo mount -o remount /var/spool/squid让挂载选项生效。
内存与交换分区优化
Ubuntu默认的交换分区使用策略比较激进,可能导致Squid进程被频繁换页,影响性能:
编辑/etc/sysctl.conf,添加:
# 降低交换分区使用优先级,优先用物理内存 vm.swappiness = 10 # 保证系统保留足够的空闲内存,避免OOM Killer误杀Squid vm.min_free_kbytes = 65536
执行sudo sysctl -p生效。
备注:内容来源于stack exchange,提问作者shige

