第273集:故障排查资源
教学目标
- 理解Linux故障排查的重要性
- 掌握系统日志的分析方法
- 熟悉性能分析和诊断工具
- 学习网络和内存调试技巧
- 能够独立解决常见的Linux问题
核心知识点
1. 系统日志
1.1 日志系统
| 日志类型 | 位置 | 用途 |
|---|---|---|
| 系统日志 | /var/log/syslog | 系统消息 |
| 内核日志 | /var/log/kern.log | 内核消息 |
| 认证日志 | /var/log/auth.log | 用户认证 |
| 应用日志 | /var/log/app.log | 应用程序 |
| 错误日志 | /var/log/error.log | 错误信息 |
1.2 日志分析
# 查看系统日志
sudo tail -f /var/log/syslog
# 查看内核日志
sudo dmesg | tail -100
# 查看认证日志
sudo tail -f /var/log/auth.log
# 搜索错误日志
sudo grep -i error /var/log/syslog
# 搜索特定时间段的日志
sudo journalctl --since "2024-01-01 00:00:00" --until "2024-01-01 23:59:59"
# 查看特定服务的日志
sudo journalctl -u nginx
# 查看特定优先级的日志
sudo journalctl -p err
# 导出日志到文件
sudo journalctl --since today > /tmp/today.log
# 实时查看日志
sudo journalctl -f
# 查看上次启动的日志
sudo journalctl --boot=-1
# 查看特定用户的日志
sudo journalctl _UID=10002. 性能分析
2.1 CPU性能
# 查看CPU使用率
top
# 查看CPU详细信息
cat /proc/cpuinfo
# 查看CPU负载
uptime
# 查看CPU统计信息
mpstat 1 10
# 查看每个CPU的使用情况
sar -P ALL 1 10
# 查看进程CPU使用情况
pidstat -u 1 10
# 查看CPU时间分布
time command
# 分析CPU性能
perf top
# 记录CPU性能数据
perf record -a sleep 60
# 分析性能数据
perf report
# 查看CPU缓存命中率
perf stat -e cache-references,cache-misses command2.2 内存性能
# 查看内存使用情况
free -h
# 查看内存详细信息
cat /proc/meminfo
# 查看进程内存使用情况
ps aux --sort=-%mem | head -20
# 查看内存统计信息
vmstat 1 10
# 查看内存映射
pmap pid
# 查看内存泄漏
valgrind --leak-check=full ./program
# 分析内存使用
smem
# 查看共享内存
ipcs -m
# 查看内存分配
cat /proc/pid/maps
# 监控内存使用
watch -n 1 free -h3. 网络诊断
3.1 网络连接
# 查看网络接口
ip link show
# 查看网络配置
ip addr show
# 查看路由表
ip route show
# 查看网络连接
ss -tulpn
# 查看网络统计
netstat -i
# 查看网络流量
iftop
# 查看网络带宽
nload
# 测试网络连接
ping -c 4 google.com
# 追踪网络路径
traceroute google.com
# 测试网络延迟
mtr google.com
# 查看DNS解析
nslookup google.com
# 测试DNS解析
dig google.com
# 查看网络端口
lsof -i :80
# 查看网络套接字
ss -s3.2 网络抓包
# 安装tcpdump
sudo apt-get install tcpdump
# 抓取网络包
sudo tcpdump -i eth0
# 抓取特定端口的包
sudo tcpdump -i eth0 port 80
# 抓取特定主机的包
sudo tcpdump -i eth0 host 192.168.1.1
# 抓取特定协议的包
sudo tcpdump -i eth0 tcp
# 保存抓包结果
sudo tcpdump -i eth0 -w capture.pcap
# 读取抓包文件
tcpdump -r capture.pcap
# 使用Wireshark分析
sudo apt-get install wireshark
wireshark capture.pcap
# 使用tshark命令行分析
tshark -r capture.pcap
# 抓取HTTP请求
sudo tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# 抓取HTTPS请求
sudo tcpdump -i eth0 -A -s 0 'tcp port 443 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'4. 内存调试
4.1 内存泄漏检测
# 安装Valgrind
sudo apt-get install valgrind
# 检测内存泄漏
valgrind --leak-check=full --show-leak-kinds=all ./program
# 检测内存错误
valgrind --tool=memcheck ./program
# 检测缓存使用
valgrind --tool=cachegrind ./program
# 检测堆栈使用
valgrind --tool=massif ./program
# 分析内存使用
ms_print massif.out.12345
# 使用AddressSanitizer
gcc -fsanitize=address -g program.c
./a.out
# 使用LeakSanitizer
gcc -fsanitize=leak -g program.c
./a.out
# 查看进程内存映射
cat /proc/pid/maps
# 查看进程内存状态
cat /proc/pid/status
# 查看进程内存统计
cat /proc/pid/statm4.2 内存分析
# 分析内存使用
smem --sort pss
# 查看进程内存详情
smem -c name pss vss rss
# 查看用户内存使用
smem -u
# 查看内存映射
pmap -x pid
# 分析堆内存
heaptrack ./program
# 查看堆内存报告
heaptrack_print heaptrack.pid.log
# 使用gdb分析内存
gdb ./program
# 在gdb中查看内存
(gdb) print variable
(gdb) x/10x variable
(gdb) info proc mappings
# 使用strace跟踪内存调用
strace -e trace=mmap,munmap,brk ./program5. 内核调试
5.1 内核调试工具
# 查看内核日志
sudo dmesg
# 查看内核参数
sudo sysctl -a
# 修改内核参数
sudo sysctl -w net.ipv4.ip_forward=1
# 永久修改内核参数
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
# 重新加载内核参数
sudo sysctl -p
# 查看内核模块
lsmod
# 加载内核模块
sudo modprobe module_name
# 卸载内核模块
sudo rmmod module_name
# 查看内核模块信息
modinfo module_name
# 查看内核版本
uname -r
# 查看内核配置
zcat /proc/config.gz | grep CONFIG_
# 使用ftrace跟踪内核函数
echo function > /sys/kernel/debug/tracing/current_tracer
echo function_name > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/trace
# 使用perf跟踪内核事件
perf record -e sched:sched_switch -a sleep 10
perf report
# 使用kprobes跟踪内核函数
echo 'p:myprobe do_sys_open' > /sys/kernel/debug/kprobes/myprobe
echo 1 > /sys/kernel/debug/kprobes/myprobe/enable
cat /sys/kernel/debug/tracing/trace5.2 崩溃分析
# 配置内核崩溃转储
sudo apt-get install kdump-tools
# 配置kdump
sudo dpkg-reconfigure kdump-tools
# 查看崩溃转储
ls /var/crash/
# 分析崩溃转储
crash /var/lib/kdump/vmlinuz /var/crash/crash.dump
# 在crash中查看信息
crash> bt
crash> log
crash> sys
crash> ps
# 使用gdb分析核心转储
gdb ./program core
# 在gdb中查看堆栈
(gdb) bt
(gdb) bt full
(gdb) info threads
(gdb) thread apply all bt
# 查看核心转储限制
ulimit -c
# 设置核心转储限制
ulimit -c unlimited
# 配置核心转储位置
echo "/tmp/core.%e.%p.%h.%t" | sudo tee /proc/sys/kernel/core_pattern
# 启用核心转储
echo "1" | sudo tee /proc/sys/kernel/core_uses_pid6. 故障排查工具
6.1 系统监控
# 安装htop
sudo apt-get install htop
# 使用htop监控系统
htop
# 安装iotop
sudo apt-get install iotop
# 使用iotop监控IO
sudo iotop
# 安装nethogs
sudo apt-get install nethogs
# 使用nethogs监控网络
sudo nethogs
# 安装glances
sudo apt-get install glances
# 使用glances监控系统
glances
# 安装atop
sudo apt-get install atop
# 使用atop监控系统
sudo atop
# 安装sysstat
sudo apt-get install sysstat
# 使用sar监控系统
sar -u 1 10
# 使用iostat监控IO
iostat -x 1 10
# 使用mpstat监控CPU
mpstat -P ALL 1 106.2 故障诊断
# 诊断系统问题
sudo systemd-analyze
# 诊断启动时间
sudo systemd-analyze blame
# 诊断服务
sudo systemctl status service_name
# 诊断网络
sudo netplan try
sudo netplan --debug apply
# 诊断磁盘
sudo fsck /dev/sda1
# 诊断内存
sudo memtest86+
# 诊断CPU
sudo stress-ng --cpu 4 --timeout 60s
# 诊断磁盘IO
sudo fio --name=random-write --ioengine=libaio --rw=randwrite --bs=4k --direct=1 --size=512M --numjobs=4 --runtime=60 --time_based --group_reporting
# 诊断网络
sudo iperf3 -s
sudo iperf3 -c server_ip
# 诊断系统调用
strace -p pid
# 诊断文件访问
inotifywait -m /path/to/watch
# 诊断进程
strace -f -e trace=open,read,write ./program实用案例分析
案例1:系统性能问题排查
场景描述
系统响应缓慢,CPU使用率高,需要排查性能问题。
实施步骤
- 收集系统信息
# 创建诊断脚本
cat > diagnose_performance.sh << 'EOF'
#!/bin/bash
# 创建诊断目录
DIAG_DIR="/tmp/diagnosis_$(date +%Y%m%d_%H%M%S)"
mkdir -p $DIAG_DIR
# 收集系统信息
echo "=== System Information ===" > $DIAG_DIR/system_info.txt
uname -a >> $DIAG_DIR/system_info.txt
cat /etc/os-release >> $DIAG_DIR/system_info.txt
# 收集CPU信息
echo "=== CPU Information ===" > $DIAG_DIR/cpu_info.txt
cat /proc/cpuinfo >> $DIAG_DIR/cpu_info.txt
mpstat -P ALL 1 5 >> $DIAG_DIR/cpu_info.txt
# 收集内存信息
echo "=== Memory Information ===" > $DIAG_DIR/memory_info.txt
free -h >> $DIAG_DIR/memory_info.txt
cat /proc/meminfo >> $DIAG_DIR/memory_info.txt
# 收集进程信息
echo "=== Process Information ===" > $DIAG_DIR/process_info.txt
ps aux --sort=-%cpu | head -20 >> $DIAG_DIR/process_info.txt
ps aux --sort=-%mem | head -20 >> $DIAG_DIR/process_info.txt
# 收集网络信息
echo "=== Network Information ===" > $DIAG_DIR/network_info.txt
ip addr show >> $DIAG_DIR/network_info.txt
ip route show >> $DIAG_DIR/network_info.txt
ss -tulpn >> $DIAG_DIR/network_info.txt
# 收集磁盘信息
echo "=== Disk Information ===" > $DIAG_DIR/disk_info.txt
df -h >> $DIAG_DIR/disk_info.txt
iostat -x 1 5 >> $DIAG_DIR/disk_info.txt
# 收集系统日志
echo "=== System Logs ===" > $DIAG_DIR/system_logs.txt
journalctl -xe --since "1 hour ago" >> $DIAG_DIR/system_logs.txt
# 收集内核日志
echo "=== Kernel Logs ===" > $DIAG_DIR/kernel_logs.txt
dmesg | tail -100 >> $DIAG_DIR/kernel_logs.txt
echo "Diagnosis completed. Results saved to $DIAG_DIR"
EOF
chmod +x diagnose_performance.sh
./diagnose_performance.sh- 分析性能瓶颈
# 分析CPU使用
cat > analyze_cpu.sh << 'EOF'
#!/bin/bash
# 查看CPU使用率
echo "=== CPU Usage ==="
top -bn1 | head -20
# 查看CPU时间分布
echo "=== CPU Time Distribution ==="
mpstat -P ALL 1 5
# 查看进程CPU使用
echo "=== Process CPU Usage ==="
pidstat -u 1 5
# 分析CPU性能
echo "=== CPU Performance ==="
perf top -n 20
EOF
chmod +x analyze_cpu.sh
./analyze_cpu.sh
# 分析内存使用
cat > analyze_memory.sh << 'EOF'
#!/bin/bash
# 查看内存使用
echo "=== Memory Usage ==="
free -h
# 查看内存统计
echo "=== Memory Statistics ==="
vmstat 1 5
# 查看进程内存使用
echo "=== Process Memory Usage ==="
ps aux --sort=-%mem | head -20
# 分析内存使用
echo "=== Memory Analysis ==="
smem --sort pss
EOF
chmod +x analyze_memory.sh
./analyze_memory.sh
# 分析IO使用
cat > analyze_io.sh << 'EOF'
#!/bin/bash
# 查看磁盘使用
echo "=== Disk Usage ==="
df -h
# 查看IO统计
echo "=== IO Statistics ==="
iostat -x 1 5
# 查看进程IO使用
echo "=== Process IO Usage ==="
iotop -o -b -n 5
EOF
chmod +x analyze_io.sh
sudo ./analyze_io.sh- 优化系统性能
# 优化CPU调度
echo "=== Optimize CPU Scheduling ==="
echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 优化内存使用
echo "=== Optimize Memory Usage ==="
echo "1" | sudo tee /proc/sys/vm/swappiness
echo "3" | sudo tee /proc/sys/vm/vfs_cache_pressure
# 优化IO调度
echo "=== Optimize IO Scheduling ==="
echo "deadline" | sudo tee /sys/block/sda/queue/scheduler
# 优化网络参数
echo "=== Optimize Network Parameters ==="
echo "net.core.rmem_max = 16777216" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_max = 16777216" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_rmem = 4096 87380 16777216" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 4096 65536 16777216" | sudo tee -a /etc/sysctl.conf
# 应用内核参数
sudo sysctl -p
# 优化系统服务
echo "=== Optimize System Services ==="
sudo systemctl disable bluetooth
sudo systemctl disable cups
sudo systemctl disable avahi-daemon案例2:网络故障排查
场景描述
网络连接不稳定,需要排查网络问题。
实施步骤
- 诊断网络问题
# 创建网络诊断脚本
cat > diagnose_network.sh << 'EOF'
#!/bin/bash
# 创建诊断目录
DIAG_DIR="/tmp/network_diagnosis_$(date +%Y%m%d_%H%M%S)"
mkdir -p $DIAG_DIR
# 收集网络接口信息
echo "=== Network Interfaces ===" > $DIAG_DIR/interfaces.txt
ip addr show >> $DIAG_DIR/interfaces.txt
# 收集路由信息
echo "=== Routing Table ===" > $DIAG_DIR/routing.txt
ip route show >> $DIAG_DIR/routing.txt
# 收集网络连接
echo "=== Network Connections ===" > $DIAG_DIR/connections.txt
ss -tulpn >> $DIAG_DIR/connections.txt
# 测试网络连接
echo "=== Network Connectivity ===" > $DIAG_DIR/connectivity.txt
ping -c 4 8.8.8.8 >> $DIAG_DIR/connectivity.txt
ping -c 4 google.com >> $DIAG_DIR/connectivity.txt
# 测试DNS解析
echo "=== DNS Resolution ===" > $DIAG_DIR/dns.txt
nslookup google.com >> $DIAG_DIR/dns.txt
dig google.com >> $DIAG_DIR/dns.txt
# 追踪网络路径
echo "=== Network Trace ===" > $DIAG_DIR/trace.txt
traceroute google.com >> $DIAG_DIR/trace.txt
# 抓取网络包
echo "=== Network Capture ===" > $DIAG_DIR/capture.txt
sudo tcpdump -i eth0 -c 100 -w $DIAG_DIR/capture.pcap
echo "Network diagnosis completed. Results saved to $DIAG_DIR"
EOF
chmod +x diagnose_network.sh
sudo ./diagnose_network.sh- 分析网络问题
# 分析网络接口
cat > analyze_interfaces.sh << 'EOF'
#!/bin/bash
# 查看网络接口状态
echo "=== Interface Status ==="
ip link show
# 查看网络接口统计
echo "=== Interface Statistics ===
ip -s link show
# 查看网络接口配置
echo "=== Interface Configuration ==="
ip addr show
EOF
chmod +x analyze_interfaces.sh
./analyze_interfaces.sh
# 分析网络连接
cat > analyze_connections.sh << 'EOF'
#!/bin/bash
# 查看网络连接
echo "=== Network Connections ==="
ss -tulpn
# 查看网络统计
echo "=== Network Statistics ===
netstat -i
# 查看网络流量
echo "=== Network Traffic ===
iftop -t -s 10
EOF
chmod +x analyze_connections.sh
sudo ./analyze_connections.sh
# 分析网络性能
cat > analyze_network_performance.sh << 'EOF'
#!/bin/bash
# 测试网络带宽
echo "=== Network Bandwidth ==="
iperf3 -c server_ip -t 10
# 测试网络延迟
echo "=== Network Latency ==="
mtr -c 10 -r google.com
# 测试网络丢包
echo "=== Network Packet Loss ==="
ping -c 100 8.8.8.8 | grep "packet loss"
EOF
chmod +x analyze_network_performance.sh
./analyze_network_performance.sh- 修复网络问题
# 重启网络服务
echo "=== Restart Network Service ==="
sudo systemctl restart NetworkManager
# 重置网络接口
echo "=== Reset Network Interface ==="
sudo ip link set eth0 down
sudo ip link set eth0 up
# 清除DNS缓存
echo "=== Flush DNS Cache ==="
sudo systemd-resolve --flush-caches
# 更新DNS服务器
echo "=== Update DNS Servers ==="
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 8.8.4.4" | sudo tee -a /etc/resolv.conf
# 修复网络配置
echo "=== Fix Network Configuration ==="
sudo netplan apply
# 检查防火墙
echo "=== Check Firewall ==="
sudo ufw status
sudo iptables -L -n
# 重启防火墙
echo "=== Restart Firewall ==="
sudo ufw reload课后练习
基础练习
- 查看系统日志
- 监控系统性能
- 诊断网络问题
进阶练习
- 分析内存泄漏
- 调试内核问题
- 优化系统性能
挑战练习
- 排查复杂系统问题
- 建立故障排查流程
- 创建自动化诊断工具
思考问题
- 如何快速定位问题根源?
- 如何预防常见问题?
- 如何提高故障排查效率?
总结
本集详细介绍了Linux系统故障排查的资源和方法,包括系统日志、性能分析、网络诊断、内存调试、内核调试以及故障排查工具等内容。通过本集的学习,您应该能够:
- 理解Linux故障排查的重要性
- 掌握系统日志的分析方法
- 熟悉性能分析和诊断工具
- 学习网络和内存调试技巧
- 能够独立解决常见的Linux问题
故障排查是Linux系统管理的重要技能,它帮助快速定位和解决问题,提高系统稳定性和可靠性。在实际工作中,应建立完善的故障排查流程,熟练使用各种诊断工具,并不断积累经验,以提高故障排查的效率和准确性。