附录B: 常用故障诊断命令与工具
在分布式调度平台的运维过程中,快速准确地诊断和解决故障是保障系统稳定运行的关键。掌握常用的故障诊断命令和工具能够帮助运维人员快速定位问题根源,缩短故障恢复时间。本文将介绍在分布式调度平台运维中常用的故障诊断命令和工具,涵盖系统监控、日志分析、网络诊断、性能分析等多个方面。
系统监控命令
系统监控是故障诊断的基础,通过监控命令可以快速了解系统的运行状态。
CPU和内存监控
top命令:
# 查看系统整体资源使用情况
top
# 查看特定进程的资源使用情况
top -p <pid>
# 按CPU使用率排序
top -o %CPU
# 按内存使用率排序
top -o %MEM
htop命令:
# 安装htop(如果未安装)
sudo apt-get install htop # Ubuntu/Debian
sudo yum install htop # CentOS/RHEL
# 运行htop
htop
vmstat命令:
# 查看系统虚拟内存统计信息
vmstat 1 5 # 每秒刷新一次,共显示5次
# 查看详细内存统计
vmstat -s
# 查看磁盘统计信息
vmstat -d
iostat命令:
# 安装sysstat包(包含iostat)
sudo apt-get install sysstat
# 查看CPU使用情况
iostat
# 查看磁盘I/O统计(每2秒刷新一次)
iostat -x 2
# 查看特定磁盘的统计信息
iostat -p /dev/sda
网络监控
netstat命令:
# 查看所有网络连接
netstat -an
# 查看TCP连接状态统计
netstat -s -t
# 查看监听端口
netstat -tlnp
# 查看网络接口统计
netstat -i
ss命令:
# 查看所有TCP连接
ss -t
# 查看所有UDP连接
ss -u
# 查看监听端口
ss -tlnp
# 查看特定端口的连接
ss -t src :8080
iftop命令:
# 安装iftop
sudo apt-get install iftop
# 监控eth0接口的流量
iftop -i eth0
# 显示流量总计
iftop -t
进程监控
ps命令:
# 查看所有进程
ps aux
# 查看特定用户的进程
ps -u username
# 查看进程树
ps -ef --forest
# 查看特定进程
ps -p <pid>
lsof命令:
# 查看打开的文件
lsof
# 查看特定进程打开的文件
lsof -p <pid>
# 查看特定端口的占用情况
lsof -i :8080
# 查看网络连接
lsof -i
日志分析工具
日志是诊断问题的重要信息来源,掌握日志分析工具能够帮助快速定位问题。
文本处理工具
grep命令:
# 在文件中搜索特定关键词
grep "error" /var/log/application.log
# 忽略大小写搜索
grep -i "Error" /var/log/application.log
# 显示匹配行的行号
grep -n "exception" /var/log/application.log
# 搜索多个文件
grep "error" /var/log/*.log
# 递归搜索目录
grep -r "error" /var/log/
# 显示匹配行前后几行
grep -A 5 -B 5 "error" /var/log/application.log
awk命令:
# 提取日志中的特定字段
awk '{print $1, $4}' /var/log/access.log
# 统计日志中各状态码的数量
awk '{print $9}' /var/log/access.log | sort | uniq -c | sort -nr
# 过滤特定条件的日志
awk '$9 == "404" {print}' /var/log/access.log
# 计算日志中的平均响应时间
awk '{sum += $12; count++} END {print "Average:", sum/count}' /var/log/access.log
sed命令:
# 替换文本
sed 's/old_text/new_text/g' /var/log/application.log
# 删除包含特定文本的行
sed '/error/d' /var/log/application.log
# 在特定行后插入文本
sed '/pattern/a\New line text' /var/log/application.log
# 显示特定行范围
sed -n '100,200p' /var/log/application.log
日志分析工具
tail命令:
# 查看文件末尾10行
tail /var/log/application.log
# 实时查看日志更新
tail -f /var/log/application.log
# 查看文件末尾100行
tail -n 100 /var/log/application.log
# 从第100行开始查看
tail -n +100 /var/log/application.log
head命令:
# 查看文件开头10行
head /var/log/application.log
# 查看文件开头100行
head -n 100 /var/log/application.log
less/more命令:
# 分页查看大文件
less /var/log/application.log
# 在less中搜索
# /pattern # 向前搜索
# ?pattern # 向后搜索
# n # 下一个匹配
# N # 上一个匹配
# 查看文件并允许滚动
more /var/log/application.log
网络诊断工具
网络问题是分布式系统中常见的故障原因,掌握网络诊断工具至关重要。
连通性测试
ping命令:
# 测试主机连通性
ping google.com
# 发送指定次数的ping包
ping -c 5 google.com
# 设置ping包间隔
ping -i 2 google.com
# 设置超时时间
ping -W 3 google.com
traceroute命令:
# 跟踪网络路径
traceroute google.com
# 使用IPv6跟踪
traceroute6 google.com
# 设置最大跳数
traceroute -m 20 google.com
# 使用特定端口跟踪
traceroute -p 80 google.com
mtr命令:
# 安装mtr
sudo apt-get install mtr
# 实时网络路径跟踪
mtr google.com
# 报告模式
mtr -r google.com
# 设置ping包数量
mtr -c 100 google.com
端口和服务测试
telnet命令:
# 测试TCP端口连通性
telnet localhost 8080
# 测试特定主机和端口
telnet 192.168.1.100 22
nc (netcat)命令:
# 测试TCP端口连通性
nc -zv localhost 8080
# 测试UDP端口
nc -zuv localhost 53
# 发送数据到服务器
echo "GET / HTTP/1.1" | nc google.com 80
# 监听特定端口
nc -l 8080
nmap命令:
# 安装nmap
sudo apt-get install nmap
# 扫描主机开放端口
nmap localhost
# 扫描特定端口范围
nmap -p 8080-8090 localhost
# 服务版本检测
nmap -sV localhost
# 操作系统检测
nmap -O localhost
性能分析工具
性能问题可能导致系统响应缓慢或服务不可用,性能分析工具能够帮助识别瓶颈。
系统性能分析
sar命令:
# 安装sysstat
sudo apt-get install sysstat
# 查看CPU使用情况历史数据
sar -u
# 查看内存使用情况
sar -r
# 查看网络统计
sar -n DEV
# 查看I/O统计
sar -b
# 指定时间范围查看
sar -u -s 10:00:00 -e 11:00:00
perf命令:
# 安装perf工具
sudo apt-get install linux-tools-common linux-tools-generic
# 记录CPU性能数据
perf record -g ./application
# 查看性能报告
perf report
# 实时监控CPU性能
perf top
# 分析特定进程
perf record -p <pid>
Java应用性能分析
jps命令:
# 查看Java进程
jps
# 查看Java进程详细信息
jps -v
# 查看Java进程及主类
jps -l
jstat命令:
# 查看JVM垃圾回收统计
jstat -gc <pid>
# 查看JVM类加载统计
jstat -class <pid>
# 查看JVM编译统计
jstat -compiler <pid>
# 定时查看垃圾回收统计
jstat -gc <pid> 1000 5 # 每秒刷新一次,共5次
jstack命令:
# 查看Java进程的线程堆栈
jstack <pid>
# 查看线程堆栈并保存到文件
jstack <pid> > thread_dump.txt
# 查看死锁信息
jstack -l <pid>
jmap命令:
# 查看JVM堆内存使用情况
jmap -heap <pid>
# 生成堆内存快照
jmap -dump:format=b,file=heap_dump.hprof <pid>
# 查看对象统计信息
jmap -histo <pid>
容器和Kubernetes诊断工具
在容器化环境中,需要使用专门的工具进行故障诊断。
Docker诊断命令
docker stats命令:
# 查看所有容器的资源使用情况
docker stats
# 查看特定容器的资源使用情况
docker stats container_name
# 查看容器资源使用情况(无流式输出)
docker stats --no-stream container_name
docker logs命令:
# 查看容器日志
docker logs container_name
# 实时查看容器日志
docker logs -f container_name
# 查看最近的日志
docker logs --tail 100 container_name
# 查看特定时间范围的日志
docker logs --since "2025-01-01" --until "2025-01-02" container_name
docker exec命令:
# 进入容器执行命令
docker exec -it container_name /bin/bash
# 在容器中执行单个命令
docker exec container_name ps aux
# 查看容器文件系统
docker exec container_name ls -la /
Kubernetes诊断命令
kubectl get命令:
# 查看所有Pod
kubectl get pods
# 查看所有服务
kubectl get services
# 查看节点状态
kubectl get nodes
# 查看命名空间
kubectl get namespaces
# 查看详细信息
kubectl get pods -o wide
kubectl describe命令:
# 查看Pod详细信息
kubectl describe pod pod_name
# 查看服务详细信息
kubectl describe service service_name
# 查看节点详细信息
kubectl describe node node_name
kubectl logs命令:
# 查看Pod日志
kubectl logs pod_name
# 实时查看Pod日志
kubectl logs -f pod_name
# 查看Pod中特定容器的日志
kubectl logs pod_name -c container_name
# 查看前一个容器实例的日志(用于重启后的容器)
kubectl logs pod_name --previous
kubectl exec命令:
# 进入Pod执行命令
kubectl exec -it pod_name -- /bin/bash
# 在Pod中执行单个命令
kubectl exec pod_name -- ps aux
# 进入Pod中特定容器
kubectl exec -it pod_name -c container_name -- /bin/bash
数据库诊断工具
数据库是调度平台的核心组件,数据库问题可能导致整个系统不可用。
MySQL诊断
mysql命令行工具:
# 连接MySQL数据库
mysql -u username -p -h hostname database_name
# 查看数据库状态
mysql> SHOW STATUS;
# 查看进程列表
mysql> SHOW PROCESSLIST;
# 查看慢查询日志设置
mysql> SHOW VARIABLES LIKE 'slow_query_log';
mysqldump命令:
# 备份数据库
mysqldump -u username -p database_name > backup.sql
# 备份特定表
mysqldump -u username -p database_name table_name > table_backup.sql
# 备份并压缩
mysqldump -u username -p database_name | gzip > backup.sql.gz
mysqladmin命令:
# 查看MySQL服务器状态
mysqladmin -u username -p status
# 查看MySQL进程列表
mysqladmin -u username -p processlist
# 关闭MySQL服务器
mysqladmin -u username -p shutdown
PostgreSQL诊断
psql命令行工具:
# 连接PostgreSQL数据库
psql -U username -d database_name -h hostname
# 查看数据库活动
postgres=# SELECT * FROM pg_stat_activity;
# 查看锁信息
postgres=# SELECT * FROM pg_locks;
# 查看表大小
postgres=# SELECT pg_size_pretty(pg_total_relation_size('table_name'));
pg_dump命令:
# 备份数据库
pg_dump -U username -h hostname database_name > backup.sql
# 备份特定表
pg_dump -U username -h hostname database_name -t table_name > table_backup.sql
# 备份并压缩
pg_dump -U username -h hostname database_name | gzip > backup.sql.gz
第三方监控和诊断工具
除了系统自带的命令行工具,还有一些第三方工具能够提供更强大的监控和诊断能力。
监控工具
Prometheus + Grafana:
# Prometheus配置示例
scrape_configs:
- job_name: 'scheduler'
static_configs:
- targets: ['localhost:8080']
metrics_path: '/metrics'
scrape_interval: 15s
ELK Stack (Elasticsearch, Logstash, Kibana):
# Logstash配置示例
input {
file {
path => "/var/log/scheduler/*.log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "ISO8601" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "scheduler-logs-%{+YYYY.MM.dd}"
}
}
性能分析工具
JProfiler:
// JProfiler代理配置
-javaagent:/path/to/jprofiler/bin/javaagent.jar
-Djprofiler.agentPath=/path/to/jprofiler/bin/linux-x64/libjprofilerti.so
YourKit:
// YourKit代理配置
-agentpath:/path/to/yourkit/bin/linux-x64/libyjpagent.so
故障诊断最佳实践
掌握故障诊断工具的同时,还需要遵循一些最佳实践来提高诊断效率。
诊断流程
- 问题确认:首先确认问题是否存在,收集问题现象
- 影响范围评估:评估问题影响的范围和严重程度
- 信息收集:收集相关日志、监控数据、配置信息
- 假设验证:基于收集的信息提出假设并验证
- 根因分析:深入分析找到问题的根本原因
- 解决方案实施:制定并实施解决方案
- 效果验证:验证解决方案的有效性
- 经验总结:总结经验教训,完善监控和预防措施
常见故障排查步骤
调度任务失败:
# 1. 检查调度器状态
systemctl status scheduler-master
# 2. 查看调度器日志
tail -f /var/log/scheduler/master.log
# 3. 检查任务执行日志
kubectl logs task-worker-pod
# 4. 检查任务状态
curl http://scheduler-api/jobs/task-id
# 5. 检查资源使用情况
kubectl top pods
系统响应缓慢:
# 1. 检查系统负载
top
iostat -x 1
# 2. 检查JVM状态
jstat -gc <pid>
jstack <pid>
# 3. 检查数据库性能
mysql> SHOW PROCESSLIST;
mysql> EXPLAIN SELECT * FROM jobs WHERE status = 'running';
# 4. 检查网络延迟
ping worker-node
traceroute worker-node
服务不可用:
# 1. 检查服务状态
systemctl status scheduler-api
# 2. 检查端口监听
netstat -tlnp | grep 8080
# 3. 检查防火墙设置
iptables -L
# 4. 检查负载均衡器状态
curl -I http://load-balancer:8080/health
# 5. 检查容器状态
docker ps
kubectl get pods
小结
掌握常用的故障诊断命令和工具是分布式调度平台运维人员的基本技能。通过系统监控命令可以了解系统运行状态,日志分析工具能够帮助定位问题根源,网络诊断工具可以排查网络问题,性能分析工具能够识别系统瓶颈,容器和数据库诊断工具则专门用于容器化环境和数据库问题的排查。
在实际故障诊断过程中,需要结合多种工具和方法,按照科学的诊断流程进行排查。同时,建立完善的监控体系和告警机制,能够帮助及时发现潜在问题,防患于未然。
随着技术的发展,新的诊断工具和方法不断涌现,运维人员需要持续学习和更新知识,以应对日益复杂的系统环境。通过熟练掌握这些工具和方法,能够显著提高故障诊断效率,保障分布式调度平台的稳定运行。