当服务器进程出现卡顿,第一步是确定问题类型。通过以下命令组合快速诊断:
使用top命令查看整体资源占用:
```bash top -b -n 1 | head -20 ```重点关注CPU使用率超过80%的进程,以及内存占用持续增长的情况。
使用vmstat命令查看系统瓶颈:
```bash vmstat 1 5 ```关键指标解读:
对疑似卡顿的进程进行深入分析:
1. 查看进程状态:
```bash ps aux | grep [进程名或PID] ```STAT列中,D状态表示不可中断睡眠,通常是I/O等待;Z状态表示僵尸进程。
2. 使用strace跟踪系统调用:
```bash strace -p [PID] -T -tt -o strace.log ```分析输出文件,查找频繁的系统调用和耗时操作。
3. 使用perf进行性能剖析:
```bash perf record -p [PID] -g -- sleep 30 perf report ```生成火焰图,直观显示函数调用栈和耗时分布。
内存问题是导致进程卡顿的常见原因,按以下步骤排查:
1. 监控进程内存增长:
```bash watch -n 1 'ps -p [PID] -o rss,vsz,cmd' ```持续观察RSS(实际物理内存)是否稳定增长。
2. 使用valgrind检测内存泄漏(适用于开发环境):
```bash valgrind --leak-check=full --show-leak-kinds=all ./your_program ```3. 分析/proc文件系统:
```bash cat /proc/[PID]/smaps | grep -E "^Size|^Rss|^Pss" ```查看进程内存映射详情,定位内存占用区域。
1. 获取当前堆内存使用情况:
```bash jstat -gcutil [PID] 1000 10 ```2. 生成堆转储文件:
```bash jmap -dump:live,format=b,file=heapdump.hprof [PID] ```3. 使用MAT工具分析堆转储文件,查找内存泄漏对象。
CPU使用率过高会导致进程响应缓慢,排查方法如下:
1. 使用perf top实时查看热点函数:
```bash perf top -p [PID] ```2. 对Go程序使用pprof:
```bash 在程序中导入pprof包 import _ "net/http/pprof" 启动HTTP服务后访问 http://localhost:6060/debug/pprof/profile?seconds=30 ```
3. 对Python程序使用cProfile:
```bash python -m cProfile -o profile.stats your_script.py python -m pstats profile.stats ```1. 查看进程线程状态:
```bash pstree -p [PID] | head -20 ps -T -p [PID] -o pid,tid,pcpu,stat ```2. 对Java程序使用jstack:
```bash jstack [PID] > thread_dump.txt ```搜索"deadlock"关键词,分析线程等待关系。
磁盘I/O和网络I/O瓶颈都会导致进程卡顿。
1. 使用iostat查看磁盘性能:
```bash iostat -x 1 5 ```关注%util列,持续接近100%说明磁盘饱和;await列过高说明I/O响应慢。
2. 使用iotop查看进程级I/O:
```bash iotop -o -p [PID] ```3. 检查文件描述符限制:
```bash ulimit -n cat /proc/[PID]/limits | grep "open files" ```1. 使用netstat查看网络连接状态:
```bash netstat -anp | grep [PID] | head -20 ```2. 监控TCP连接状态:
```bash ss -t -a -n | grep ESTAB | wc -l ```3. 使用tcpdump抓包分析:
```bash tcpdump -i eth0 -s 0 -w capture.pcap host [目标IP] and port [端口] ```数据库连接池问题常导致进程卡顿。
1. 检查当前数据库连接数:
```sql -- MySQL SHOW PROCESSLIST; SHOW VARIABLES LIKE 'max_connections'; -- PostgreSQL SELECT count() FROM pg_stat_activity; SHOW max_connections; ```2. 应用连接池配置示例(以HikariCP为例):
```java HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/db"); config.setUsername("user"); config.setPassword("password"); config.setMaximumPoolSize(20); config.setMinimumIdle(5); config.setConnectionTimeout(30000); config.setIdleTimeout(600000); config.setMaxLifetime(1800000); config.setLeakDetectionThreshold(2000); ```当生产环境出现严重卡顿时,立即执行以下操作:
1. 保存当前现场:
```bash 保存进程状态 pstack [PID] > pstack_$(date +%Y%m%d_%H%M%S).log jstack [PID] > jstack_$(date +%Y%m%d_%H%M%S).log Java进程 保存系统状态 sar -u -r -d 1 10 > system_$(date +%Y%m%d_%H%M%S).log ```2. 临时重启策略:
1. 配置Nginx限流:
```nginx http { limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; server { location /api/ { limit_req zone=api burst=20 nodelay; proxy_pass http://backend; } } } ```建立完善的监控体系,预防问题发生。
1. 基础监控项:
2. 应用级监控:
创建自动化巡检脚本:
```bash !/bin/bash check_server_health.sh LOG_FILE="/var/log/health_check_$(date +%Y%m%d).log" { echo "=== 系统检查 $(date) ===" echo "1. 负载情况:" uptime echo -e "\n2. 内存使用:" free -h echo -e "\n3. 磁盘使用:" df -h echo -e "\n4. 进程状态:" ps aux --sort=-%cpu | head -10 echo -e "\n5. 网络连接:" netstat -an | grep ESTABLISHED | wc -l } >> $LOG_FILE 2>&1 ```设置crontab定期执行:
```bash 每天凌晨2点执行检查 0 2 /opt/scripts/check_server_health.sh ```服务器进程卡顿排查需要系统化的方法:从系统资源监控开始,逐步深入到进程内部状态。关键是要建立完整的监控体系,在问题发生前就能发现异常。所有操作命令和配置都需要根据实际环境调整,建议在测试环境验证后再应用到生产环境。定期进行压力测试和故障演练,确保团队熟悉应急处理流程。
下一篇: 别瞎折腾了,服务器进销存系统搭建全攻略
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图