返回文章列表
服务器

服务器响应慢、卡顿是什么原因?怎么解决?

小小
2025-11-14
2小时前
服务器响应慢、卡顿是什么原因?怎么解决?
服务器响应变慢、服务无法启动、磁盘空间告急……面对这些常见故障,盲目重启不仅治标不治本,还可能掩盖真实问题。

本文整理10条关键Linux命令,配合详细使用方法与场景说明,助你高效排查CPU内存端口磁盘Swap等核心资源异常。

日常运维中,快速定位问题是保障系统稳定的第一步。Linux系统本身提供了丰富的诊断工具,掌握以下命令组合,可在5分钟内完成初步故障分析。

1. 定位高CPU占用进程

命令:

ps aux --sort=-%cpu | head -n 11

自定义参考

ps -eo pid,comm,%cpu --no-headers | sort -k3 -nr | head -11 | awk '{printf "PID: %6s | Process: %-20s | CPU: %6.1f%%\n", $1, $2, $3}'

使用说明:该命令按CPU使用率降序列出前11个进程。重点关注 %CPU 列和 COMMAND 列。若某进程持续占用过高CPU(如 >80%),需进一步分析其行为。

注意事项:

多核系统中,单进程CPU使用率可能超过100%(例如4核系统最大为400%)。若 kswapd0 进程CPU占用高,通常反映内存不足,应优先检查内存与Swap使用情况。

2. 查看高内存占用进程

命令:

ps aux --sort=-%mem | head -n 11

自定义参考

ps -eo pid,comm,rss --no-headers | sort -k3 -nr | head -5 | awk '{printf "PID: %6s | Process: %-20s | MEM: %7.2f GB\n", $1, $2, $3/1024/1024}'

使用说明:

按物理内存(RSS)使用量排序,识别内存消耗大户。结合 free -h 查看整体内存状态,避免误判缓存(buff/cache)为实际内存压力。

关键指标:

%MEM:进程占用物理内存百分比RSS:实际使用的物理内存大小(KB)

3. 检查指定端口被哪个进程占用

命令:

ss -tulnp | grep :<端口号>

例如检查80端口:

ss -tulnp | grep :80

*使用说明:

当服务启动失败并提示“Address already in use”时,此命令可快速定位占用端口的PID及程序名。

输出示例:

tcp  LISTEN 0 128 *:80 *:* users:(("nginx",pid=1234,fd=6))

其中 pid=1234 即为占用进程ID。

替代方案:

lsof -i :80 功能类似,但 ss 性能更优,推荐在生产环境使用。

4. 列出所有监听端口及对应进程

命令:

ss -tulnp

使用说明:

全面查看系统当前监听的TCP/UDP端口及其所属进程,适用于安全审计或服务状态核查。

参数解释:

-t:TCP连接-u:UDP连接-l:仅显示监听状态-n:以数字形式显示地址和端口(避免DNS解析延迟)-p:显示进程信息

5. 分析Swap使用情况及占用进程

步骤一:查看Swap总体使用

free -h

若 Swap 行中 used 值显著大于0,说明系统已开始使用交换分区,可能影响性能。

步骤二:定位具体占用Swap的进程(需root权限)

for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k2 -n -r | head

典型场景:

Java应用因堆内存设置不合理,频繁触发Full GC并导致大量内存换出至Swap,表现为系统IO飙升、响应迟缓。

6. 检查磁盘空间使用情况

命令:

df -h

使用说明:

以人类可读格式(GB/MB)展示各挂载点的磁盘使用率。重点关注 /、/var、/home 等关键分区。

告警阈值:

使用率 ≥90%:需立即处理使用率 ≥95%:可能导致服务写入失败甚至崩溃

7. 定位大文件或大目录

命令(在目标目录下执行):

du -sh * | sort -hr

使用流程:通过 df -h 确定空间紧张的分区(如 /var)进入该目录:cd /var执行上述命令,按大小排序子目录逐层深入,直至定位具体大文件(如日志、缓存、core dump等)扩展技巧:

查找全系统大于100MB的文件(忽略权限错误):

find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | head -n 20

8. 查看系统负载情况

命令:

uptime

输出示例:

19:30:01 up 10 days, load average: 4.20, 3.80, 2.90

解读:

三个数值分别表示过去1分钟、5分钟、15分钟的平均负载。

对于N核CPU系统,负载长期 > N 表示存在资源瓶颈负载高 ≠ CPU高,也可能由IO等待(D状态进程)引起辅助命令:

查看CPU核心数:

nproc

9. 检测僵尸进程(Zombie Processes)

命令:

ps aux | awk '$8 ~ /^[Zz]/'

说明:

僵尸进程是已终止但未被父进程回收的子进程,状态为 Z。虽不消耗CPU/内存,但会占用进程表项。大量僵尸进程可能导致系统无法创建新进程。

处理建议:

通常需重启其父进程若父进程为init(PID=1),系统会自动清理,无需干预

10. 识别异常网络连接(潜在攻击迹象)

命令:

ss -tn | tail -n +2 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head

用途:

统计每个远程IP的TCP连接数,用于发现暴力破解、DDoS或异常爬虫行为。

应对措施:

结合防火墙(iptables/firewalld)或云平台安全组封禁可疑IP检查认证日志:grep "Failed" /var/log/secure(CentOS)或 /var/log/auth.log(Ubuntu)

故障排查通用流程建议

**观察现象:**服务不可用?响应慢?写入失败?检查负载:uptime判断系统整体压力分资源排查:CPUps aux --sort=-%cpu内存/Swapfree -h + 进程内存排序磁盘df -h + du -sh网络ss -tulnp + 连接统计定位进程:结合PID进一步分析(日志、strace、lsof等)处理与验证: 修复后持续观察指标是否恢复正常

重要原则:

不要依赖重启解决问题。只有理解根本原因,才能实现真正的系统稳定性

为什么说这一句呢!因我在某项目上经常由项目导致资源问题甲方要求重启让占用释放,我只能默默地配合。


本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议