部署爬虫的VPS系统调优,核心是先解决文件描述符、内存回收和网络队列三个瓶颈,再根据所选VPS的线路类型调整TCP参数,这样能把任务成功率拉高,而不是盲目堆配置。
爬虫VPS系统调优怎么做?先诊断三个高频崩溃点
爬虫进程在VPS上跑着跑着就消失、连接被拒、任务卡死,多数情况不是代码写得烂,而是系统层默认参数压根没为高并发短连接场景做过适配,业内专家指出,多数爬虫VPS卡顿不是CPU瓶颈,而是网络队列和文件描述符没调对。
文件描述符不够用,爬虫进程直接被拒
爬虫同时打开大量TCP连接,Linux默认给单个进程的1024个文件描述符上限很快就被撞穿,很多人在本地跑得好好的,部署到VPS就报Too many open files,这就是典型的资源天花板。
先看当前限制:
ulimit -n
临时调到65535:
ulimit -n 65535
永久修改要动两个地方,第一处是/etc/security/limits.conf,加入:
soft nofile 65535
hard nofile 65535
第二处是systemd服务单元,如果爬虫用systemd托管,编辑/etc/systemd/system/爬虫.service,在[Service]段加:
LimitNOFILE=65535
内核级上限也要同步修改:
sysctl -w fs.file-max=2097152
改完必须重新登录或重启服务才生效,如果爬虫是通过nohup或screen启动的,需要确认启动脚本继承了新限制。
内存OOM与Swap抖动让爬虫被kill
低价VPS内存通常只有1G或2G,爬虫跑一阵子就触发OOM Killer,进程被内核随机杀掉,日志里只留下一条Killed,排查顺序:
dmesg | grep -i oom查看是否有OOM记录free -h查看内存和Swap使用量top -o %MEM按内存占用排序
调优核心是降低Swap使用倾向,避免磁盘换页把整台机器拖成幻灯片:
sysctl -w vm.swappiness=10
默认值通常是60,改成10后内核会尽量用物理内存,减少硬盘交换,同时给爬虫进程套memory cgroup,防止单个进程吃光内存:
systemd-run --scope -p MemoryLimit=512M --user python3 /opt/crawler/main.py
如果爬虫需要开无头浏览器渲染页面,内存限制要放宽到1G以上,否则Chromium子进程会被频繁杀掉。
网络连接堆积,TIME_WAIT把端口占满
爬虫频繁建立和断开连接,TIME_WAIT状态会大量堆积,本地端口范围不够用,新连接建立失败,查看当前连接状态:
ss -s ss -tan state time-wait | wc -l
调优参数如下:
sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_fin_timeout=15 sysctl -w net.ipv4.ip_local_port_range="1024 65535" sysctl -w net.core.somaxconn=65535
tcp_tw_reuse允许复用TIME_WAIT连接,tcp_fin_timeout缩短FIN_WAIT超时,ip_local_port_range扩大可用端口,somaxconn提高全连接队列长度,这些参数写进/etc/sysctl.conf后执行sysctl -p永久生效。
国内VPS和国外VPS哪个适合爬虫?网络与合规先看线路
选VPS不能只看价格,目标站点在哪决定了线路,备案要求决定了合规成本,国内VPS访问国内站点延迟低,但必须备案;国外VPS免备案,但访问国内站点可能绕路。
香港VPS跑爬虫需要注意什么?绕不开的跨境延迟
香港VPS跑爬虫,线路质量参差不齐,如果目标站点在中国大陆,香港VPS的延迟通常比美国VPS低,但晚高峰可能绕路,用mtr -r 目标IP测试回程路由,重点看丢包出现在哪个跃点。
- 避开CN2 GIA和普通线路混卖的商家,晚高峰容易丢包
- DNS解析建议用商家内网DNS或国内公共DNS,解析慢会拖累整个爬取流程
- 香港VPS不需要备案,适合短期爬取任务,但跨境稳定性不如国内VPS直连
国内VPS跑爬虫要备案,合规门槛更高
国内VPS访问国内网站快,但部署爬虫需要完成ICP备案,行业共识认为,合规爬取公开数据时,国内VPS更稳,但备案周期长,如果目标站点有反爬,来自国内数据中心IP的请求更容易被识别。
| 对比维度 | 国内VPS | 国外VPS | 香港VPS |
|---|---|---|---|
| 访问国内站点延迟 | 低 | 高 | 中等 |
| 备案要求 | 必须 | 不需要 | 不需要 |
| 价格水位 | 便宜 | 便宜 | 略贵 |
| 跨境稳定性 | 好 | 一般 | 看线路 |
| 爬虫IP被识别概率 | 相对高 | 相对低 | 中等 |
低价VPS跑爬虫够用吗?先算清三项资源账
低价VPS多数是1核1G或1核2G,硬盘SSD但IO有隐性限制,是否够用取决于任务类型:
- 纯HTTP请求型爬虫,1核1G能跑,前提是单进程控制在50并发以内
- 需要无头浏览器渲染的爬虫,1G内存基本不够,开几个Chromium页面就OOM
- 大量解析HTML或JSON的爬虫,CPU是瓶颈,1核容易跑满
建议先用dstat -tcmnd观察资源占用,再决定是否升级,很多时候把并发数降下来,低价VPS也能稳定运行。
实操:一套可直接复用的VPS系统调优配置
内核参数一次性配置
创建文件/etc/sysctl.d/99-crawler.conf,写入:
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
vm.swappiness = 10
vm.vfs_cache_pressure = 50
fs.file-max = 2097152
保存后执行:
sysctl -p /etc/sysctl.d/99-crawler.conf
netdev_max_backlog和tcp_max_syn_backlog提高网络队列,防止突发流量丢包。vfs_cache_pressure调低后,内核会尽量保留目录项缓存,加快文件系统访问。
systemd服务单元模板
把爬虫交给systemd管理,能统一限制资源并自动重启:
[Unit]
Description=My Crawler Service
After=network.target
[Service]
User=crawler
WorkingDirectory=/opt/crawler
ExecStart=/usr/bin/python3 /opt/crawler/main.py
Restart=always
RestartSec=5
LimitNOFILE=65535
MemoryMax=1G
CPUQuota=80%
[Install]
WantedBy=multi-user.target
将文件放到
/etc/systemd/system/crawler.service,执行:
systemctl daemon-reload systemctl enable --now crawler
MemoryMax=1G限制内存使用上限,CPUQuota=80%防止爬虫吃满CPU影响SSH登录。
监控与自动恢复
调优做完后要持续观察,而不是丢在一边不管,用systemctl status crawler看服务状态,journalctl -u crawler -f跟踪运行日志。
写一个cron脚本,每10分钟检查进程数,超过阈值就重启:
#!/bin/bash
COUNT=$(pgrep -fc 'main.py')
if [ "$COUNT" -gt 200 ]; then
systemctl restart crawler
fi
把脚本放进/etc/cron.d/crawler_monitor,注意文件权限设为644,结尾必须有换行符。
调优不是一次性工作,而是根据爬虫任务反馈持续调整,把文件描述符、内存和网络队列这三块稳住,低价VPS也能跑出稳定任务,选择国内VPS还是国外VPS,核心看目标站点位置和备案条件,香港VPS适合折中方案,但线路要实测。
爬虫VPS系统调优常见问题解答
爬虫VPS系统调优有哪些必改的内核参数?
必改的内核参数集中在网络和内存:net.ipv4.tcp_tw_reuse、net.ipv4.tcp_fin_timeout、net.ipv4.ip_local_port_range、net.core.somaxconn、vm.swappiness,其中tcp_tw_reuse和ip_local_port_range对频繁短连接的爬虫效果最直接,改完能明显减少连接建立失败。
爬虫部署到VPS经常被kill怎么办?
先执行dmesg | grep -i oom确认是否触发OOM Killer,如果是,降低并发数,关闭无头浏览器渲染,给systemd服务设置MemoryMax限制,如果还不行,启用Swap但把vm.swappiness调到10,避免大量换页拖慢系统,最后考虑定时重启进程释放内存碎片。
香港VPS跑爬虫为什么经常超时?
多数情况是回程线路绕路或晚高峰丢包,用mtr -r 目标IP持续观察,看丢包出现在哪个跃点,如果丢包出现在跨境节点,换商家或改用国内VPS(需备案),DNS解析慢也会表现为超时,把/etc/resolv.conf里的DNS换成商家内网DNS或公共DNS后再试,超时问题通常能缓解。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/657828.html





