Hetzner VPS负载极低但网站响应迟缓,寻求排查方案
排查方向与监控指标建议
从你描述的情况来看,虽然WHM显示负载只有0.02,但所有网站都加载缓慢,这说明瓶颈不在常规的CPU/内存负载上,咱们可以从几个隐蔽的方向来排查:
一、先搞定SSL日志里的408超时问题
你的ssl_log里大量出现408状态码,这是客户端请求超时——服务器等了半天没收到客户端的完整请求就断开了。这种情况大概率是两种原因:
- 要么是恶意扫描/半开连接攻击:大量机器人发起SSL握手但故意不完成,占着服务器的连接资源(比如Web服务器的worker进程、SSL会话缓存),导致正常请求排不上队
- 要么是网络链路问题:德国VPS到部分用户的线路有丢包、延迟过高,请求传不完就超时了
监控/排查步骤:
- 用
netstat -an | grep SYN_RECV或者ss -s看看半开连接的数量,如果某个IP段有大量SYN_RECV状态的连接,那就是被扫了,直接加防火墙规则封禁 - 用
tcpdump port 443抓包分析SSL握手过程,看看是不是有大量只发了Client Hello就没下文的请求 - 检查Web服务器的超时配置:比如Apache的
Timeout、Nginx的client_header_timeout,如果设置得太短,正常用户的慢请求也会被判定为超时;太长的话又会被恶意连接占用资源,建议调到30-60秒试试
二、深挖数据库的隐性负载
你把脚本改成单条Select后还是慢,说明不是脚本里的查询耗时问题,但数据库可能还有别的坑:
1. 连接泄露问题
虽然没报max_user_connections错误,但如果脚本没正确关闭数据库连接,会有大量处于Sleep状态的连接占着数据库的连接槽,新请求得等这些连接释放才能进来。
- 执行
SHOW PROCESSLIST;看看数据库连接状态,数一下Sleep状态的连接有多少,如果持续增长,那就是连接泄露了,得检查脚本的连接释放逻辑
2. 缓存命中率问题
如果数据库的缓存命中率低,每次查询都要读磁盘,哪怕CPU负载低,磁盘IO拖后腿也会让整个服务变慢。
- 执行
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';,然后算命中率:(1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100,正常得在99%以上,如果低于这个数,说明innodb_buffer_pool_size配置得太小,得调大(你的服务器有256G内存,这个值可以设到128G甚至更高)
三、检查Web服务器的资源限制
1. Worker进程/线程数够不够
比如Apache的MaxRequestWorkers、Nginx的worker_processes和worker_connections,如果设置得太少,哪怕CPU空闲,新请求也得排队等worker进程处理。
- 开启Web服务器的状态页:比如Apache的
server-status、Nginx的ngx_http_stub_status_module,看看当前活跃连接数、等待队列长度,如果等待队列一直在涨,说明worker不够,得调大配置
2. 打开文件数限制
服务器的open files限制如果太低,Web服务器或数据库开不了足够的文件/连接,也会导致请求处理失败或变慢。
- 用
ulimit -a查看当前的打开文件数限制,如果是默认的1024,那肯定不够,得在/etc/security/limits.conf里调高(比如设到65535)
四、重点排查banners.analyticson.com子域名
你说这个子域名的静态资源加载极慢,哪怕脚本执行正常,这里也可能是瓶颈:
1. 静态资源的存储与IO
这些图片和HTML5文件是不是存在机械硬盘上?或者存储目录的磁盘IO太高?
- 用
iostat -x 1查看磁盘的%util和await指标,如果%util接近100%,说明磁盘IO满了,得换SSD或者把静态资源移到更快的存储上
2. 缓存与盗链问题
- 检查静态资源的响应头有没有设置
Cache-Control,如果每次请求都要重新下载,哪怕单文件小,每秒30次的请求累积起来也会拖慢服务器 - 看看Web服务器日志里的
Referer字段,是不是有别的网站盗链你的静态资源?如果有,赶紧加防盗链规则(比如Apache的mod_rewrite、Nginx的valid_referers)
五、系统层面的隐性指标
1. 内存使用细节
你的Top截图里的MEM数值得仔细看,别光看空闲内存,还要看缓存和swap:
- 用
free -h查看内存使用情况,如果swap被频繁使用(si/so数值不为0),说明内存不够用了,得检查有没有进程内存泄漏 - 用
ps aux --sort=-%mem看看内存占用最高的进程,有没有异常进程(比如某个程序内存一直在涨)
2. CPU上下文切换
哪怕负载低,高频率的上下文切换也会让服务器变慢:
- 用
vmstat 1查看cs(上下文切换)数值,如果每秒几万甚至几十万,说明进程/线程切换太频繁,可能是Web服务器的线程数设得太多,或者有进程在频繁抢占CPU
内容的提问来源于stack exchange,提问作者temo
相关产品推荐
相关产品推荐

