主题
应用故障排查
课程介绍
应用故障是Linux运维中最常见的问题之一,直接影响业务的可用性和用户体验。本课程将带你学习应用故障的排查方法、日志分析、性能监控等技巧,帮助你快速定位和解决应用问题。
1. 应用故障概述
1.1 应用故障类型
| 故障类型 | 说明 | 严重程度 |
|---|---|---|
| 服务无法启动 | 应用服务启动失败 | 严重 |
| 服务崩溃 | 应用服务运行时崩溃 | 严重 |
| 服务响应慢 | 应用服务响应时间过长 | 中等 |
| 服务无响应 | 应用服务无响应 | 严重 |
| 功能异常 | 应用功能不正常 | 中等 |
| 资源占用过高 | 应用占用CPU/内存过高 | 中等 |
1.2 应用故障现象
现象1:服务无法启动
- 服务启动失败
- 报错信息
- 服务状态为failed
现象2:服务崩溃
- 服务突然停止
- 进程消失
- 日志中有错误信息
现象3:服务响应慢
- 请求超时
- 响应时间长
- 用户体验差
现象4:服务无响应
- 无法连接服务
- 连接超时
- 服务假死
2. 应用服务管理
2.1 查看服务状态
使用systemctl查看服务状态。
基本语法:
bash
systemctl status 服务名示例:
bash
# 查看nginx服务状态
systemctl status nginx
# 查看mysql服务状态
systemctl status mysql
# 查看所有服务状态
systemctl list-units --type=service输出说明:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-01 10:00:00 CST; 1h ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 2 (limit: 4915)
Memory: 5.2M
CPU: 12ms
CGroup: /system.slice/nginx.service
├─1234 "nginx: master process"
└─1235 "nginx: worker process"2.2 启动和停止服务
使用systemctl启动和停止服务。
基本语法:
bash
systemctl start 服务名
systemctl stop 服务名
systemctl restart 服务名示例:
bash
# 启动nginx服务
systemctl start nginx
# 停止nginx服务
systemctl stop nginx
# 重启nginx服务
systemctl restart nginx2.3 查看服务日志
使用journalctl查看服务日志。
基本语法:
bash
journalctl -u 服务名 [选项]常用选项:
| 选项 | 说明 |
|---|---|
-f | 跟踪日志输出 |
-n | 显示最后N行 |
--since | 显示指定时间之后的日志 |
--until | 显示指定时间之前的日志 |
-p | 指定日志级别 |
示例:
bash
# 查看nginx服务日志
journalctl -u nginx
# 跟踪nginx服务日志
journalctl -u nginx -f
# 查看最后100行日志
journalctl -u nginx -n 100
# 查看最近1小时的日志
journalctl -u nginx --since "1 hour ago"
# 查看错误日志
journalctl -u nginx -p err3. 应用日志分析
3.1 查看应用日志
应用日志通常存储在/var/log目录下。
常见日志位置:
bash
# Nginx日志
/var/log/nginx/access.log
/var/log/nginx/error.log
# Apache日志
/var/log/apache2/access.log
/var/log/apache2/error.log
# MySQL日志
/var/log/mysql/error.log
# 应用日志
/var/log/myapp/app.log查看日志:
bash
# 查看日志文件
tail -f /var/log/nginx/error.log
# 查看最后100行日志
tail -n 100 /var/log/nginx/error.log
# 查看错误日志
grep -i error /var/log/nginx/error.log
# 查看最近1小时的日志
find /var/log/nginx -name "*.log" -mmin -603.2 分析错误日志
使用grep和awk分析错误日志。
示例:
bash
# 统计错误数量
grep -i error /var/log/nginx/error.log | wc -l
# 查看最近的错误
grep -i error /var/log/nginx/error.log | tail -n 10
# 统计错误类型
grep -i error /var/log/nginx/error.log | awk '{print $NF}' | sort | uniq -c
# 查看特定时间的错误
grep "2024-01-01 10:" /var/log/nginx/error.log3.3 分析访问日志
使用awk分析访问日志。
示例:
bash
# 统计访问量
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 统计访问最多的URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
# 统计HTTP状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 统计响应时间
awk '{print $NF}' /var/log/nginx/access.log | sort -n | tail -n 104. 应用进程管理
4.1 查看应用进程
使用ps和top查看应用进程。
示例:
bash
# 查看nginx进程
ps aux | grep nginx
# 查看mysql进程
ps aux | grep mysql
# 查看所有进程
ps aux
# 实时查看进程
top4.2 查看进程资源占用
使用top和htop查看进程资源占用。
示例:
bash
# 实时查看进程资源占用
top
# 按CPU排序
top -o %CPU
# 按内存排序
top -o %MEM
# 查看特定进程的资源占用
top -p 1234
# 使用htop(更友好)
htop4.3 查看进程打开的文件
使用lsof查看进程打开的文件。
示例:
bash
# 查看nginx进程打开的文件
lsof -p $(pidof nginx)
# 查看进程打开的端口
lsof -i -P | grep nginx
# 查看进程打开的文件描述符
lsof -p 1234 | wc -l5. 常见应用故障
5.1 服务无法启动
当服务无法启动时,需要排查配置、权限、依赖等问题。
故障现象:
Job for nginx.service failed because the control process exited with error code.排查步骤:
步骤1:查看服务状态
bash
# 查看服务状态
systemctl status nginx
# 查看服务日志
journalctl -u nginx -n 50步骤2:检查配置文件
bash
# 检查配置文件语法
nginx -t
# 查看配置文件
cat /etc/nginx/nginx.conf步骤3:检查端口占用
bash
# 查看端口占用
ss -tlnp | grep 80
# 查看进程
ps aux | grep nginx步骤4:检查权限
bash
# 查看文件权限
ls -l /var/log/nginx
# 修改权限
chmod 755 /var/log/nginx
chown nginx:nginx /var/log/nginx步骤5:检查依赖
bash
# 检查依赖库
ldd /usr/sbin/nginx
# 安装缺失的依赖
apt-get install libxxx5.2 服务崩溃
当服务崩溃时,需要排查内存、日志、核心转储等问题。
故障现象:
nginx: worker process died by signal 11 (Segmentation fault)排查步骤:
步骤1:查看服务日志
bash
# 查看服务日志
journalctl -u nginx -n 100
# 查看应用日志
tail -n 100 /var/log/nginx/error.log步骤2:查看系统日志
bash
# 查看系统日志
dmesg | grep -i error
# 查看内核日志
journalctl -k步骤3:查看核心转储
bash
# 查看核心转储文件
ls -l /var/crash/
# 分析核心转储
gdb /usr/sbin/nginx /var/crash/core.1234步骤4:查看内存使用
bash
# 查看内存使用
free -h
# 查看进程内存使用
ps aux | grep nginx步骤5:检查内存泄漏
bash
# 使用valgrind检查内存泄漏
valgrind --leak-check=full /usr/sbin/nginx5.3 服务响应慢
当服务响应慢时,需要排查性能、网络、数据库等问题。
故障现象:
- 请求超时
- 响应时间长
- 用户体验差
排查步骤:
步骤1:查看服务状态
bash
# 查看服务状态
systemctl status nginx
# 查看服务资源占用
top -p $(pidof nginx)步骤2:查看网络连接
bash
# 查看网络连接
ss -an | grep 80
# 查看连接数
ss -an | grep 80 | wc -l步骤3:查看应用日志
bash
# 查看应用日志
tail -f /var/log/nginx/error.log
# 查看慢查询
grep -i slow /var/log/nginx/error.log步骤4:查看数据库性能
bash
# 查看MySQL慢查询
tail -f /var/log/mysql/slow.log
# 查看MySQL进程
mysql -e "SHOW PROCESSLIST;"步骤5:使用性能分析工具
bash
# 使用strace跟踪系统调用
strace -p $(pidof nginx)
# 使用perf分析性能
perf top -p $(pidof nginx)5.4 服务无响应
当服务无响应时,需要排查死锁、线程阻塞等问题。
故障现象:
- 无法连接服务
- 连接超时
- 服务假死
排查步骤:
步骤1:检查服务状态
bash
# 检查服务状态
systemctl status nginx
# 检查进程状态
ps aux | grep nginx步骤2:检查网络连接
bash
# 检查网络连接
ss -an | grep 80
# 测试端口连通性
telnet localhost 80步骤3:检查线程状态
bash
# 查看线程状态
ps -eLf | grep nginx
# 查看线程堆栈
pstack $(pidof nginx)步骤4:检查死锁
bash
# 使用gdb检查死锁
gdb -p $(pidof nginx)
# 查看线程信息
(gdb) info threads
# 查看线程堆栈
(gdb) thread apply all bt步骤5:重启服务
bash
# 重启服务
systemctl restart nginx6. 应用性能优化
6.1 CPU优化
当应用CPU占用过高时,需要优化代码、配置等。
优化方法:
bash
# 查看CPU使用情况
top -p $(pidof nginx)
# 查看CPU使用率
mpstat -P ALL 1
# 优化worker进程数
vim /etc/nginx/nginx.conf
worker_processes auto;
# 优化worker连接数
worker_connections 1024;6.2 内存优化
当应用内存占用过高时,需要优化内存使用。
优化方法:
bash
# 查看内存使用情况
free -h
# 查看进程内存使用
ps aux | grep nginx
# 优化内存缓存
vim /etc/nginx/nginx.conf
client_body_buffer_size 128k;
client_max_body_size 10m;6.3 网络优化
当应用网络性能差时,需要优化网络配置。
优化方法:
bash
# 查看网络连接
ss -an | grep 80
# 优化TCP参数
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
# 应用配置
sysctl -p7. 应用监控
7.1 实时监控应用
使用top和htop实时监控应用。
bash
# 实时监控nginx
top -p $(pidof nginx)
# 使用htop监控
htop -p $(pidof nginx)7.2 监控应用日志
使用tail和journalctl监控应用日志。
bash
# 监控nginx错误日志
tail -f /var/log/nginx/error.log
# 监控nginx服务日志
journalctl -u nginx -f7.3 监控应用性能
使用perf和strace监控应用性能。
bash
# 使用perf监控性能
perf top -p $(pidof nginx)
# 使用strace跟踪系统调用
strace -p $(pidof nginx)课程总结
这节课我们学习了应用故障排查。
核心内容:
- 应用故障概述
- 应用服务管理(systemctl)
- 应用日志分析
- 应用进程管理
- 常见应用故障(服务无法启动、服务崩溃、服务响应慢、服务无响应)
- 应用性能优化
- 应用监控
重要命令:
systemctl status:查看服务状态journalctl -u:查看服务日志tail -f:实时查看日志ps aux:查看进程top:实时查看进程资源占用lsof:查看进程打开的文件strace:跟踪系统调用perf:性能分析
应用故障是Linux运维中最常见的问题之一,掌握这些排查方法和工具,可以帮助你快速定位和解决应用问题,保障业务可用性。
课后练习
练习1(基础)
完成以下操作:
- 查看nginx服务状态
- 查看nginx服务日志
- 查看nginx进程
- 查看nginx打开的文件
练习2(进阶)
假设nginx服务无法启动,请描述排查步骤。
练习3(拓展)
假设nginx服务响应慢,请描述排查步骤。