从 nohup 日志入手定位性能问题,关键是把“日志里的事件时间线”与“系统资源指标”对齐,按指标异常→日志佐证→系统层验证的三步走,快速锁定瓶颈。
一、准备与采集
- 规范输出与定位日志
- 运行命令建议统一格式:nohup your_command > output.log 2>&1 &,便于集中分析;默认日志为当前目录的nohup.out。实时查看用tail -f,分页查看用less/more。这些是最基础且高效的日志访问方式。
- 补齐系统资源曲线
- 在问题发生前后,采集资源指标用于对齐分析:top/htop(CPU、内存、进程)、vmstat 1(系统整体与CPU等待)、iostat -x 1(磁盘IO与await)、必要时配合网络延迟工具(如 ping、traceroute、mtr)。这些工具能快速揭示CPU、内存、磁盘IO、网络等维度的瓶颈方向。
- 建立长期可观测性
- 对大日志启用logrotate按日/大小轮转并压缩,避免磁盘被撑满;必要时将关键输出接入syslog/rsyslog或集中式日志平台(如 ELK/Splunk),便于检索与告警。
二、日志里该看什么
- 关键字段
- 时间戳(定位发生时刻)、PID(区分多实例)、stdout/stderr(正常与错误输出)、命令行参数/环境变量(复现环境)、以及应用自行打印的内存/CPU使用或耗时信息。
- 常见性能相关线索
- 高频ERROR/WARN与超时/重试/连接失败(如“Connection refused/timeout”)常指示后端或网络瓶颈。
- 打印的处理耗时、队列长度、GC/内存抖动、线程池满等,能直接反映应用层瓶颈点。
- 对数据库场景,关注慢查询日志与EXPLAIN结果,以定位SQL与索引问题。
三、把日志与系统指标对齐的分析流程
- 步骤1:粗定位异常时段
- 用tail -f或less浏览日志,找出首次出现ERROR/WARN/超时的时间段;若日志无时间戳,优先改造应用输出,否则只能依赖系统时间。
- 步骤2:拉齐资源指标
- 以异常时刻为中心,回看top/htop、vmstat 1、iostat -x 1的采样:
- CPU持续接近100%且wa(iowait)不高,多为CPU计算/锁竞争;
- wa 高且 iostat 中await/svctm偏高,多为磁盘IO瓶颈;
- si/so(swap in/out)不为0,多为内存不足导致抖动。
- 步骤3:日志佐证与根因定位
- 在异常时段内,用grep/awk/sed筛选相关行,统计错误率/超时次数/耗时分布,与资源指标变化一一对应,确认是应用逻辑、数据库、外部依赖还是IO导致。
- 步骤4:针对性验证与优化
- 若是数据库,启用并分析慢查询日志,用EXPLAIN优化索引与SQL;
- 若是应用层,使用cProfile/Py-Spy(Python)或perf/gprof/Valgrind(C/C++)定位热点函数与调用路径;
- 若是网络,用ping/traceroute/mtr验证延迟与丢包。
四、可直接复用的命令清单
- 实时观察与检索
- 实时看日志:tail -f nohup.out
- 分页查看:less nohup.out
- 关键字筛选:grep -i ‘error|warn|timeout’ nohup.out
- 统计错误数:grep -aic ‘error’ nohup.out
- 按时间段粗略筛选(示例:10:00–11:00):sed -n ‘/2025-12-07 10:/,/2025-12-07 11:/p’ nohup.out
- 资源对齐采样
- 系统整体与CPU:vmstat 1 60 > vmstat.log
- 磁盘IO:iostat -x 1 60 > iostat.log
- 交互式观察:top/htop
- 日志治理与接入
- 轮转示例(/etc/logrotate.d/myapp):
- /path/to/output.log { daily; rotate 7; compress; delaycompress; missingok; notifempty; create 640 root adm }
- 接入 syslog:nohup your_command | logger -t myapp -p local6.info &
- 磁盘空间监控:df -h /path/to/logs
- 数据库与网络辅助
- 慢查询与执行计划:mysql> SET slow_query_log=ON; SET long_query_time=1; 以及 EXPLAIN SELECT …
- 网络诊断:ping 、traceroute 、mtr
五、常见症状与处理对照表
| 症状描述 |
优先查日志线索 |
对齐的系统指标 |
常见根因 |
处理建议 |
| 接口普遍变慢 |
超时、重试、耗时突增 |
CPU接近100%且wa不高、load高 |
计算密集/锁竞争 |
采样热点(cProfile/Py-Spy)、优化算法与并发控制 |
| 数据库查询慢 |
慢查询、连接失败 |
wa高、磁盘util高 |
缺失索引/大表扫描/锁等待 |
开启慢查询、EXPLAIN优化、加索引/分库分表 |
| 应用偶发报错 |
ERROR/WARN集中出现 |
si/so不为0、内存抖动 |
内存不足触发swap |
降内存占用、加内存、优化缓存/对象生命周期 |
| 磁盘IO飙升 |
写入/刷盘耗时大 |
await/svctm高、util≈100% |
磁盘瓶颈/日志写入过多 |
异步/批量写、减少打点、升级磁盘/分离日志盘 |
| 外部依赖超时 |
连接超时/拒绝 |
CPU不高、网络延迟高 |
下游服务或网络问题 |
重试退避、熔断限流、网络链路优化 |
以上流程强调“日志时间线+资源指标”的双向验证,能在分钟级内缩小范围并给出可执行的优化方向。