线上故障排查指南:让你的服务器起死回生的必杀技

网络
作为一名服务端工程师,你是否遇到过线上服务响应特别慢、系统越用越卡这些让人头疼的场景?这些都是我们必须面对和解决的挑战。

你是否遇到过这些让人头疼的场景?

  • 凌晨3点被运维电话惊醒:「线上服务响应特别慢!」
  • 大促活动突然宕机:「CPU 100%,服务器快撑不住了!」
  • 收到用户投诉:「为什么系统越用越卡?」

作为一名服务端工程师,这些都是我们必须面对和解决的挑战。但别担心!

通过这篇实战指南,你将学会:

  • 快速定位性能瓶颈的实用技巧
  • 应对高并发场景的实战经验
  • 系统调优和故障排查的必备工具
  • 内存泄漏等常见问题的解决方案

让我们开始动手实践,把每个技能都变成你的"必杀技"!

日志分析小贴士:安全第一哦!

大家好!今天我要教你一个超级重要的小技巧 - 在碰日志前要先"量体温"!

先来看看日志文件有多重:

$ ls -lh /var/log/nginx/access.log
   │ │  │
   │ │  └── 要查看的文件路径 📁
   │ └──── h表示human readable,让文件大小更易读 👀
   └────── l表示long format,显示详细信息 📋

-rw-r--r-- 1 nginx nginx 6.5M Mar 20 15:00 access.log  # 哇!这个日志有点重量级!🏋️♂️

输出解释:

  • -rw-r--r-- :文件权限(读写权限)
  • nginx nginx:文件所属用户和用户组
  • 6.5M:文件大小(以人类易读的方式显示)
  • Mar 20 15:00:最后修改时间

为什么要这样做呢?因为...

  • 直接用 cat 看大文件就像一口气吃一头大象
  • 服务器会累得直喘气
  • 可能会让其他小伙伴访问不了网站

如果发现日志文件太大,我们有个小妙招:

# 把大象搬到别的地方慢慢吃 🚚
$ scp /var/log/nginx/access.log test-server:/tmp/
   │  │                        │         │
   │  │                        │         └── 目标路径:文件将被复制到这里 📁
   │  │                        └── 目标服务器:可以是主机名或IP地址 🖥️
   │  └── 源文件:要复制的日志文件路径 📄
   └──── scp命令:secure copy,安全复制协议 🔒

scp 命令参数详解:

  • -r:复制整个目录及其内容
  • -P:指定SSH端口号(大写P)
  • -i:使用指定的私钥文件 
  • -v:显示详细的传输过程 
  • -p:保留原文件的修改时间和权限 

使用示例:

# 使用指定端口复制文件
$ scp -P 2222 access.log test-server:/tmp/  # 使用2222端口 🔌

# 使用私钥文件
$ scp -i ~/.ssh/id_rsa access.log test-server:/tmp/  # 指定私钥 🔑

# 复制整个目录
$ scp -r /var/log/nginx/ test-server:/backup/  # 复制整个目录 📂

# 保留文件属性
$ scp -p access.log test-server:/tmp/  # 保留时间和权限 ⏰

小贴士:使用 scp 的注意事项 

  • 确保目标服务器有足够的磁盘空间 
  • 检查网络连接是否稳定 
  • 注意文件权限设置 
  • 大文件传输时建议使用 -C 参数压缩传输

想偷偷看看日志最后几行?试试这个:

$ tail -n 5 access.log
   │   │  │
   │   │  └── 要查看的日志文件 📄
   │   └──── 显示的行数(这里是5行)📏
   └──────── tail命令:查看文件末尾内容 📌

192.168.1.100 GET /api/users 200  # 成功啦!🎉
192.168.1.101 POST /api/login 401 # 哎呀,登录失败了 😅
# ... 更多访问记录 ...

tail 命令参数详解:

  • -n:指定要显示的行数
  • -f:实时监控文件变化(follow模式)
  • -F:类似-f,但是文件被删除后会重试 
  • -q:不显示文件名头部 
  • -v:显示详细的文件名头部 

使用示例:

# 显示最后10行(默认)
$ tail access.log  # 查看最新10条记录 📜

# 实时监控日志更新
$ tail -f access.log  # 像看电影一样实时观察 🎬

# 同时监控多个文件
$ tail -f access.log error.log  # 多文件同步监控 👥

# 显示文件末尾100字节
$ tail -c 100 access.log  # 按字节查看 📊

小贴士:tail 命令使用技巧 

  • 使用 -f 监控时,按 Ctrl+C 可以退出 
  • 配合 grep 可以过滤特定内容 
  • 可以用 -n +1 从头开始显示文件 
  • 建议对大文件使用 tail 而不是 cat 

记住:温柔对待你的日志,日志也会温柔对待你!

来看看谁是最活跃的访客:

$ cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -3
    156 192.168.1.100  # 这位可真是个忠实用户!🥇
     89 192.168.1.101  # 二等奖也不错哦!🥈
     67 192.168.1.102  # 铜牌得主继续加油!🥉

让我们偷偷看看服务器的小秘密:

$ top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM  TIME+   COMMAND
 1234 root      20   0  985148  65404  31220 S  25.0   3.2  12:34   nginx 🏃♂️
 5678 mysql     20   0 1258216 326892  8216 S  15.0   8.1   5:67    mysql 🎲
 9012 redis     20   0  162672  29684   4508 S   5.0   0.7   2:45   redis 🔄
# 看!每个进程都在忙着工作呢!💪

这样看输出结果是不是更有意思了?每个数字背后都有一个小故事在等着你发现!

检查服务器状态:

$ top

这就像给服务器量体温 :

  • PID:每个进程的身份证号 
  • CPU%:进程的"体温" 
  • MEM%:进程的"食量" 
  • COMMAND:进程的"名字" 

小贴士:记住这些命令就像收集宝可梦一样有趣! 

  • 每个命令都有特殊技能
  • 组合使用威力更大
  • 熟能生巧,多练习!

看!这样是不是更容易理解每个命令在做什么了?继续加油,你已经是个小小运维高手啦! 

响应时间分析:从点菜到上菜

让我们用专业工具分析响应时间:

# 测试网站响应时间
$ curl -w "\n⏱️ 总耗时: %{time_total}秒\n" -s https://example.com
⏱️ 总耗时: 0.235秒

# 详细的性能分析
$ ab -n 100 -c 10 https://example.com/
测试结果 📊:
- 平均响应: 0.389秒 ⚡
- 成功率: 98% ✅
- 错误数: 2 ⚠️

错误日志分析:发现并解决问题

当系统出现问题时,错误日志是我们的好帮手。让我们来学习一些实用的日志分析命令:

# 查看错误日志
$ grep ERROR /var/log/app.log
   │    │    │
   │    │    └── 要搜索的日志文件路径 📄
   │    └──── 要搜索的关键词 🔍
   └──────── grep命令:在文件中搜索文本 🔎

[ERROR] 2024-03-20 15:00:23 数据库连接超时 ⚠️
[ERROR] 2024-03-20 15:00:25 内存不足 💥

grep 命令参数详解:

  • -i:忽略大小写
  • -n:显示行号
  • -r:递归搜索目录
  • -v:显示不匹配的行
  • -c:只显示匹配行数

使用示例:

# 显示行号
$ grep -n ERROR /var/log/app.log  # 知道错误在第几行 📑

# 忽略大小写搜索
$ grep -i error /var/log/app.log  # 匹配 ERROR、error 等 🔤

# 递归搜索所有日志文件
$ grep -r ERROR /var/log/  # 搜索整个日志目录 📂

# 统计错误次数
$ grep -c ERROR /var/log/app.log  # 只显示错误数量 🔢

来看看如何统计错误类型:

$ grep ERROR /var/log/app.log | awk '{print $4}' | sort | uniq -c | sort -nr
   │                          │     │            │     │        │     │
   │                          │     │            │     └────── 统计出现次数 📊
   │                          │     │            └── 去重 🎯
   │                          │     └── 排序 📋
   │                          └── 提取第4列(错误类型)✂️
   └── 过滤出错误日志 🔍

  15 数据库超时 📊  # 最常见的错误
   8 内存不足 📈
   3 网络异常 📉

小贴士:分析错误日志的最佳实践

  • 定期检查错误日志,及早发现问题
  • 使用 grep 的 -C 参数查看错误上下文
  • 结合时间戳分析错误发生规律
  • 建立错误类型统计报表,找出常见问题

错误日志分析流程图:

获取日志 📄 --> 过滤错误 🔍 --> 分析原因 🤔 --> 解决问题 ✅

面试要点:日志分析技巧 

面试官最爱问的问题:

  • 如何快速定位性能问题
# 组合使用多个工具
$ dstat -cdngy 1  # 实时监控系统资源 📊
   │   │││││ │
   │   ││││└─ y: 系统统计信息 📈
   │   │││└── g: 显示页面统计信息 📑
   │   ││└─── n: 网络统计信息 🌐
   │   │└──── d: 磁盘统计信息 💾
   │   └───── c: CPU 统计信息 💻
   └───────── 1: 每秒更新一次 ⏱️

$ iotop          # 监控磁盘 I/O 💾
  PID  USER   IO>  DISK READ  DISK WRITE  COMMAND
 1234  mysql  2.1   50.2 M/s   10.1 M/s   mysqld
 5678  nginx  0.8    2.1 M/s    1.2 M/s   nginx

$ netstat -antp  # 查看网络连接 🌐
   │     │││└── p: 显示进程信息 👥
   │     ││└─── t: 只显示TCP连接 🔌
   │     │└──── n: 显示数字地址而不是主机名 🔢
   │     └───── a: 显示所有连接 🌍
   └─────────── 查看网络统计信息 📊
  • 如何处理大型日志文件?
# 使用高效的日志分析方法
$ zcat large.log.gz | grep ERROR | tail -n 100  
   │              │     │      │     │  │
   │              │     │      │     │  └── 显示行数 📏
   │              │     │      │     └──── 查看末尾 📌
   │              │     │      └────────── 过滤ERROR关键词 🔍
   │              │     └─────────────── 管道传递输出 📤
   │              └─────────────────── 压缩文件分隔符 |
   └────────────────────────────── 读取压缩文件 📦

$ awk '/ERROR/ {print $4}' large.log | sort | uniq -c
   │   │       │          │        │     │     │
   │   │       │          │        │     │     └── 计数 🔢
   │   │       │          │        │     └──── 去重 🎯
   │   │       │          │        └────── 排序 📋
   │   │       │          └──────────── 打印第4列 ✂️
   │   │       └────────────────── 执行的动作 🎬
   │   └─────────────────────── 匹配模式 🔍
   └───────────────────────── 文本处理工具 🛠️

性能分析工具对比图:

dstat    ➡️ 系统整体状况 📊
  ├── CPU使用率 💻
  ├── 磁盘I/O 💾
  ├── 网络流量 🌐
  └── 内存使用 🧠

iotop    ➡️ 磁盘I/O详情 💾
  ├── 读取速度 📥
  ├── 写入速度 📤
  └── 进程信息 👥

netstat  ➡️ 网络连接状态 🌐
  ├── TCP/UDP连接 🔌
  ├── 端口占用 🚪
  └── 进程信息 👥

小贴士:性能分析最佳实践 

  • 先用 dstat 获取系统整体状况 
  • 发现 I/O 异常时使用 iotop 深入分析 
  • 网络问题用 netstat 排查 
  • 注意收集足够的样本数据 
  • 建立基准数据,便于对比分析 

常见性能问题及解决方案:

(1) CPU 使用率高 

  • 使用 top 找出高负载进程
  • 分析进程是否存在死循环
  • 考虑增加 CPU 核心或优化代码

(2) 磁盘 I/O 瓶颈 

  • 使用 iotop 监控磁盘读写
  • 检查是否存在大量小文件操作
  • 考虑使用 SSD 或优化存储策略

(3) 网络延迟高

  • 使用 netstat 检查连接状态
  • 分析网络包是否丢失
  • 考虑优化网络配置或增加带宽
责任编辑:赵宁宁 来源: everystep
相关推荐

2012-05-22 09:06:25

2012-05-29 10:19:41

2018-05-17 11:24:24

主机蓝屏重启

2018-09-21 14:32:00

iPaas云应用部署

2013-05-10 09:23:14

iPaaS混合云集成云集成

2009-07-22 15:02:18

2009-10-13 16:38:04

强行关闭VMware虚

2010-08-24 14:57:33

外企职场

2011-06-27 14:56:49

SEO

2013-03-26 09:21:40

Linux服务器故障排查

2013-03-25 09:19:10

Linux服务器故障排查

2023-04-07 17:44:43

2024-08-09 12:11:07

2009-01-03 09:14:00

2021-02-02 10:55:09

等级保护2.0信息安全网络安全

2010-08-11 16:43:05

职场

2013-07-11 09:25:52

2019-12-31 10:24:48

Class 类JVMJava

2017-03-13 15:39:09

Windows 10进程必杀技

2010-08-18 10:12:03

无线路由器
点赞
收藏

51CTO技术栈公众号