跳转到内容

应用故障排查

课程介绍

应用故障是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 nginx

2.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 err

3. 应用日志分析

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 -60

3.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.log

3.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 10

4. 应用进程管理

4.1 查看应用进程

使用ps和top查看应用进程。

示例

bash
# 查看nginx进程
ps aux | grep nginx

# 查看mysql进程
ps aux | grep mysql

# 查看所有进程
ps aux

# 实时查看进程
top

4.2 查看进程资源占用

使用top和htop查看进程资源占用。

示例

bash
# 实时查看进程资源占用
top

# 按CPU排序
top -o %CPU

# 按内存排序
top -o %MEM

# 查看特定进程的资源占用
top -p 1234

# 使用htop(更友好)
htop

4.3 查看进程打开的文件

使用lsof查看进程打开的文件。

示例

bash
# 查看nginx进程打开的文件
lsof -p $(pidof nginx)

# 查看进程打开的端口
lsof -i -P | grep nginx

# 查看进程打开的文件描述符
lsof -p 1234 | wc -l

5. 常见应用故障

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 libxxx

5.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/nginx

5.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 nginx

6. 应用性能优化

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 -p

7. 应用监控

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 -f

7.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(基础)

完成以下操作:

  1. 查看nginx服务状态
  2. 查看nginx服务日志
  3. 查看nginx进程
  4. 查看nginx打开的文件

练习2(进阶)

假设nginx服务无法启动,请描述排查步骤。

练习3(拓展)

假设nginx服务响应慢,请描述排查步骤。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径