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

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

凌晨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 # 哇!这个日志有点重量级!🏋️♂️1.2.3.4.5.6.7.

输出解释:

-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,安全复制协议 🔒1.2.3.4.5.6.7.

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/ # 保留时间和权限 ⏰1.2.3.4.5.6.7.8.9.10.11.

小贴士:使用 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 # 哎呀,登录失败了 😅 # ... 更多访问记录 ...1.2.3.4.5.6.7.8.9.

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 # 按字节查看 📊1.2.3.4.5.6.7.8.9.10.11.

小贴士: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 # 铜牌得主继续加油!🥉1.2.3.4.

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

复制
$ 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 🔄 # 看!每个进程都在忙着工作呢!💪1.2.3.4.5.6.

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

检查服务器状态:

复制
$ top1.

这就像给服务器量体温 :

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 ⚠️1.2.3.4.5.6.7.8.9.10.

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

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

复制
# 查看错误日志 $ grep ERROR /var/log/app.log │ │ │ │ │ └── 要搜索的日志文件路径 📄 │ └──── 要搜索的关键词 🔍 └──────── grep命令:在文件中搜索文本 🔎 [ERROR] 2024-03-20 15:00:23 数据库连接超时 ⚠️ [ERROR] 2024-03-20 15:00:25 内存不足 💥1.2.3.4.5.6.7.8.9.

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 # 只显示错误数量 🔢1.2.3.4.5.6.7.8.9.10.11.

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

复制
$ grep ERROR /var/log/app.log | awk {print $4} | sort | uniq -c | sort -nr │ │ │ │ │ │ │ │ │ │ │ └────── 统计出现次数 📊 │ │ │ └── 去重 🎯 │ │ └── 排序 📋 │ └── 提取第4列(错误类型)✂️ └── 过滤出错误日志 🔍 15 数据库超时 📊 # 最常见的错误 8 内存不足 📈 3 网络异常 📉1.2.3.4.5.6.7.8.9.10.11.

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

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

错误日志分析流程图:

复制
获取日志 📄 --> 过滤错误 🔍 --> 分析原因 🤔 --> 解决问题 ✅1.
面试要点:日志分析技巧 

面试官最爱问的问题:

如何快速定位性能问题
复制
# 组合使用多个工具 $ 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: 显示所有连接 🌍 └─────────── 查看网络统计信息 📊1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.
如何处理大型日志文件?
复制
# 使用高效的日志分析方法 $ zcat large.log.gz | grep ERROR | tail -n 100 │ │ │ │ │ │ │ │ │ │ │ └── 显示行数 📏 │ │ │ │ └──── 查看末尾 📌 │ │ │ └────────── 过滤ERROR关键词 🔍 │ │ └─────────────── 管道传递输出 📤 │ └─────────────────── 压缩文件分隔符 | └────────────────────────────── 读取压缩文件 📦 $ awk /ERROR/ {print $4} large.log | sort | uniq -c │ │ │ │ │ │ │ │ │ │ │ │ │ └── 计数 🔢 │ │ │ │ │ └──── 去重 🎯 │ │ │ │ └────── 排序 📋 │ │ │ └──────────── 打印第4列 ✂️ │ │ └────────────────── 执行的动作 🎬 │ └─────────────────────── 匹配模式 🔍 └───────────────────────── 文本处理工具 🛠️1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

性能分析工具对比图:

复制
dstat ➡️ 系统整体状况 📊 ├── CPU使用率 💻 ├── 磁盘I/O 💾 ├── 网络流量 🌐 └── 内存使用 🧠 iotop ➡️ 磁盘I/O详情 💾 ├── 读取速度 📥 ├── 写入速度 📤 └── 进程信息 👥 netstat ➡️ 网络连接状态 🌐 ├── TCP/UDP连接 🔌 ├── 端口占用 🚪 └── 进程信息 👥1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

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

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

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

(1) CPU 使用率高 

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

(2) 磁盘 I/O 瓶颈 

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

(3) 网络延迟高

使用 netstat 检查连接状态分析网络包是否丢失考虑优化网络配置或增加带宽

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器