服务器系统越用越卡,绝大多数情况下不是“中毒”或“玄学”,而是日志文件占满磁盘、后台进程悄悄泄漏内存、硬件性能自然衰减这三件事在同时发力,顺着这条线排查,多数问题能在半小时内定位。
日志文件是最大的隐形磁盘杀手
系统日志和应用日志从不自己清理
服务器和人类似,每天都会书写“日记”,系统日志记录内核事件、登录尝试、服务启停;应用日志记录请求响应、报错堆栈;Nginx和Apache会生成访问日志,每一条请求都写入一行,日积月累,这些文件会膨胀到数十GB甚至上百GB,直接拖垮磁盘I/O。
典型症状是:df -h查看到根分区或/var分区使用率达到90%以上,系统响应变慢,数据库查询耗时明显增加,甚至出现“No space left on device”报错。
排查步骤很直接:
- 执行
du -sh /var/log/按目录查看日志占用大小 - 用
journalctl --disk-usage检查systemd日志占用 - 查看
/var/log/下是否有单个日志文件超过1GB
多数情况下,罪魁祸首是未配置logrotate的Java应用日志或长时间运行的Nginx访问日志,解决办法是配置日志轮转,例如编辑/etc/logrotate.d/nginx,设置按天切割且保留30天,对已膨胀的大文件,用truncate -s 0 /var/log/xxx.log清空而不是直接rm删除,避免文件句柄被占用导致磁盘空间不释放。
数据库日志与临时文件同样值得紧盯
MySQL的binlog、慢查询日志、错误日志是另一大占地大户,默认配置下,binlog可能保留很长时间,堆积几十GB,检查SHOW BINARY LOGS;查看数量,通过expire_logs_days参数控制保留周期,PostgreSQL的WAL日志和MongoDB的journal日志同理。
还有一类容易被忽略的临时文件:/tmp目录下未清理的session文件、程序异常退出留下的core dump、Docker的overlay2目录。docker system prune可以清理悬空镜像和停止的容器,释放的磁盘空间通常很可观。
服务器卡顿怎么排查:进程、内存与CPU的联动分析
内存泄漏是一点一点吃垮性能的
服务器响应变慢但磁盘空间充足时,优先怀疑内存泄漏,长时间运行的Java进程、Python脚本、Node.js服务都可能存在内存只增不减的情况,表现为系统运行一两个月后,free -m查看到available内存持续走低,Swap分区被大量使用,CPU的wa值升高。
具体排查路径:
- 执行
top并按M键排序,观察RES列,找出内存占用异常的进程 - 用
ps aux --sort=-%mem | head -20列出内存占用前20的进程 - 用
pidstat -r -p 进程号 5持续观察该进程内存增长趋势 - 使用
jstat -gcutil 进程号 1000(针对Java进程)查看GC频率和堆内存使用
如果确认进程RSS持续增长且永不回落,基本可以判定内存泄漏,临时缓解手段是重启服务,彻底解决需要开发侧排查代码中的静态集合类引用、未关闭的连接池、缓存无法回收等问题。
CPU负载和僵尸进程背后的信号
uptime输出中load average持续高于CPU核心数两倍以上,说明系统处于过载状态。top查看用户态占用比例,%us高通常是业务代码问题或算法效率低,%sy高可能是系统调用过频繁或锁竞争激烈。
僵尸进程数量多代表父进程未正确回收子进程资源,虽然不占CPU和内存,但占进程表项,积累到上限会导致新进程无法创建,用ps aux | grep defunct查看,kill -9对僵尸进程无效,需要杀掉父进程或重启服务。
调优参数也能挤出一部分性能
- 修改
/etc/sysctl.conf中的vm.swappiness,从默认60调到10,减少Swap使用倾向 - Nginx的
worker_processes设置为CPU核心数,worker_connections结合内存大小调整 - MySQL的
innodb_buffer_pool_size设置为物理内存的60%-70%,但要留出系统余量 - Redis的
maxmemory策略根据实际数据量设置,避免内存溢出触发OOM Killer
云服务器和物理服务器哪个好?老化逻辑存在明显差异
物理服务器的机械硬盘与散热是硬伤
机房服务器使用三到五年后,机械硬盘的I/O性能明显衰减,出现坏道和SMART警告的概率大幅上升。HDD的随机读写能力本身就不适合现代高并发业务,CPU风扇和电源风扇积灰后转速下降,导致CPU温度升高,触发降频保护,性能断崖式下跌,夏季机房空调制冷不足时,表现尤为明显,尤其是南方地区的高温天气。
行业共识指出,物理服务器超过五年,硬件故障率呈指数级上升,定期用smartctl -a /dev/sda检查硬盘健康状态,用lm-sensors查看CPU温度,都超过75℃时需要清灰或更换散热组件。
云服务器跑的慢跟邻居有关
云服务器不存在物理硬件折旧问题,但存在超卖和邻居效应,宿主机上其他实例抢占CPU时间片时,你的实例可能出现CPU steal值升高,top中%st字段长期超过10%,意味着计算资源被严重瓜分,内存和磁盘I/O也有类似争抢,部分云厂商的低配实例使用共享型CPU,突发性能有限,高峰期表现不佳。
云服务器的优势在于弹性升配,控制台点几下就能增加CPU和内存,不需要重新采购硬件,从成本角度,云服务器升级配置价格是可按月折算的,短期业务高峰结束后还能降配,总体开销比一次性购置物理服务器再三年折旧摊平更可控。
| 对比维度 | 物理服务器 | 云服务器 |
|---|---|---|
| 性能衰减主因 | 硬盘老化、散热恶化 | CPU竞争、磁盘I/O争抢 |
| 排查难度 | 需现场检查硬件 | 控制台即可查看监控 |
| 升级成本 | 购置硬件加安装调试,周期长 | 按需付费,分钟级生效 |
| 适合场景 | 数据敏感、长期稳定负载 | 业务波动大、快速迭代 |
运维巡检清单:让卡顿防患于未然
每周必查的三项指标
与其等系统卡了再处理,不如养成固定巡检习惯:
- 磁盘使用率:
df -h确认所有分区低于80%,journal和logrotate持续生效 - 内存与负载:
free -m和uptime记录本周数值,与上周对比,发现趋势性增长立即深挖 - 进程存活状态:
systemctl list-units --failed检查有无数失败的单元,ps aux | grep defunct统计僵尸进程数
例行维护操作
每月执行一次系统级维护:
- 更新安全补丁
yum update -y或apt update && apt upgrade -y - 清理YUM或APT缓存,定位
/var/cache下无用的软件包 - 检查
/etc/crontab中是否有残留的过期任务,避免不必要的脚本定时执行 - 分析
dmesg -T | tail -50关注有无硬件报错和OOM记录
给业务扩容留出提前量
峰值流量到来前,用压测工具模拟请求,观察CPU、内存、I/O的余量,如果核心服务在高峰期CPU使用率超过80%持续三分钟以上,就该考虑升配或扩容节点,提前做比卡顿之后再做,成本更低,用户感知也完全不同。
服务器系统越用越卡是资源积累与硬件衰减的必然结果,但每一次迟滞都有明确的物理或逻辑原因,从日志清理和进程体检入手,结合硬件健康检查和合理的巡检节奏,绝大多数服务器重获新生只需要一个下午,与其反复重启系统“续命”,不如找到病灶一次性根除,这才是让服务器长期健康运行的根本思路。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/774157.html


