菜单

系统调试

相关源文件

目的与范围

本文档提供了 Linux 和类 Unix 环境中系统调试的命令行工具和技术的全面概述。系统调试包括识别、诊断和故障排除与 CPU、内存、磁盘、网络、进程和整体系统性能相关的问题。重点在于跨各种发行版实用的、基于命令行的调试方法。

有关特定于应用程序的调试或开发调试方法,请参阅命令行工具关系

来源: README.md312-353

系统调试概述

系统调试涉及监视和分析操作系统的不同组件,以识别瓶颈、故障或意外行为。Linux 命令行提供了一套丰富的专用工具,有助于检查系统状态、资源利用率和进程行为。

调试类别

以下是主要系统调试域及其相应工具的分类

来源: README.md316-322 README.md326-350

资源监视工具

CPU 和内存监视

这些工具有助于识别性能瓶颈、高 CPU 使用率和内存消耗问题。

工具主要目的常见用法
top实时进程查看器通用监视
htop增强型 top更好的可视化和用户界面
free内存使用检查内存可用性和缓存
vmstat虚拟内存统计信息内存和 CPU 负载概览
mpstat多处理器统计每个 CPU 的使用率监视

解释 free 的示例输出

  • 内存输出中的“cached”值表示 Linux 内核的文件缓存,这有效地算作可用内存。
  • 总内存 = 已使用 + 空闲 + 缓冲区 + 缓存

来源: README.md316-317 README.md322-323

磁盘和 I/O 监视

这些工具有助于诊断磁盘空间问题、I/O 瓶颈和文件系统问题。

工具主要目的常见用法
iostatI/O 统计信息查看详细的磁盘性能指标
iotopI/O 监视跟踪哪些进程使用最多的 I/O
ncdu磁盘使用情况分析器查找占用磁盘空间的内容
df磁盘可用空间检查已挂载文件系统的可用空间
du磁盘使用情况测量目录/文件占用的空间

命令示例

iostat -mxz 15  # Show CPU stats and detailed disk stats every 15 seconds

当删除文件后磁盘空间未被释放时,请使用

lsof | grep deleted | grep "filename-of-my-big-file"

来源: README.md316-317 README.md328-329 README.md352-353

网络调试

连接和流量分析

来源: README.md318-319 README.md326-334

网络监控工具

工具主要目的常见用法
netstat网络统计查看所有网络连接
ss套接字统计netstat 的现代替代品
iftop接口流量监视每个接口的带宽使用情况
nethogs每个进程的带宽按进程划分的网络流量
mtr网络路径分析用于故障排除的增强型 traceroute
wireshark / tshark数据包分析详细检查网络流量

使用以下命令检查侦听端口

netstat -lntp  # For TCP
netstat -lnup  # For UDP
ss -plat       # Modern alternative for TCP

对于 Web 调试,请使用

curl -I https://example.com  # Check headers only

来源: README.md314-315 README.md318-319 README.md330-334

进程分析和调试

进程检查工具

来源: README.md324-327 README.md335-342

进程调试工具

工具主要目的常见用法
strace系统调用跟踪查看进程对内核发出的调用
ltrace库调用跟踪监视对库函数的调用
ldd库依赖检查程序需要的共享库
gdbGNU 调试器连接到正在运行的进程进行调试
lsof列出打开的文件查看进程打开的文件/套接字

命令示例

strace -p <pid>      # Attach to a running process
strace -c <command>  # Profile system calls made by a command

用于调试的有用 /proc 条目

  • /proc/cpuinfo - CPU 信息
  • /proc/meminfo - 内存信息
  • /proc/xxx/cwd - PID 为 xxx 的进程的当前工作目录
  • /proc/xxx/exe - 可执行文件的路径
  • /proc/xxx/fd/ - 打开的文件描述符
  • /proc/xxx/smaps - 内存映射详情

来源: README.md336-342

Java 应用调试

Java 应用需要特殊的调试方法

  1. 生成线程转储和堆摘要: kill -3 <pid>
  2. 使用 JDK 工具
    • jps - 列出 Java 进程
    • jstat - JVM 统计监视
    • jstack - Java 线程堆栈跟踪
    • jmap - 内存映射和堆转储

可以使用 SJK tools 进行高级 Java 调试。

来源: README.md324-325

综合系统分析

系统级监视

对于全面的系统监视和分析,有几种工具可以提供跨多个子系统的集成视图。

工具主要目的常见用法
dstat系统统计快速系统概览,包含集成指标
glances系统监视器多子系统仪表板
sar系统活动报告历史性能数据分析
sysdig系统探索深入的系统可见性和故障排除
perf性能分析器内核级性能分析

使用 sar 进行的历史分析可深入了解过去的性能问题,显示 CPU、内存、网络等指标。

来源: README.md320-321 README.md343-346

调试方法的整合

来源: README.md320-321 README.md343-350

系统信息和诊断

这些工具可用于识别底层系统和诊断硬件相关问题

  • unameuname -a:显示系统信息,包括内核版本
  • lsb_release -a:发行版特定的信息
  • dmesg:查看内核环形缓冲区消息(适用于硬件或驱动程序问题)

来源: README.md348-350

调试工作流示例

识别内存泄漏

  1. 监视系统内存: free -h (以人类可读的格式显示内存使用情况)
  2. 识别占用内存的进程: tophtop (按内存使用量排序)
  3. 检查进程内存映射: cat /proc/<pid>/smaps
  4. 对于 Java 应用程序: jmap -heap <pid>

排查高 CPU 使用率

  1. 检查总体 CPU 负载: topmpstat
  2. 识别特定进程: top (按 P 键可按 CPU 排序)
  3. 检查进程正在做什么: strace -p <pid>
  4. 或分析进程: perf top -p <pid>

诊断磁盘空间问题

  1. 检查文件系统使用情况: df -h
  2. 查找大目录: du -sh /* 然后深入查看
  3. 或使用交互式分析器: ncdu /
  4. 检查已删除但仍打开的文件: lsof | grep deleted

网络连接问题

  1. 检查服务是否在监听: netstat -lntp | grep <port>
  2. 测试连接: curlwget
  3. 分析网络路径: mtr <destination>
  4. 如有需要,捕获数据包: tshark -i <interface> -f "port <port>"

来源: README.md316-350

与其他命令行工具集成

系统调试通常需要结合其他领域的工具

  1. 日志文件处理工具(参见 处理文件和数据
  2. 进程管理命令(参见 日常使用
  3. 基本系统监控(参见 基础知识

Unix-like系统的强大之处在于通过管道组合各种专用工具。例如

ps aux | grep high-cpu-process | awk '{print $2}' | xargs strace -p

此管道根据名称查找进程,提取其 PID,并将其附加到 strace。

来源: README.md98-106 README.md336-342

平台特定考量

虽然大多数调试工具在不同的 Linux 发行版中都可用,但有些工具具有特定于平台的变体或替代方案

Linux 发行版

大多数工具都可以通过包管理器获得

apt-get install htop iotop iftop # Debian/Ubuntu
yum install htop iotop iftop     # Red Hat/CentOS
pacman -S htop iotop iftop       # Arch Linux

macOS

许多此类工具可以通过 Homebrew 或 MacPorts 获得。一些内置工具的语法与 Linux 略有不同。有关更多详细信息,请参阅 macOS 专用

Windows

Windows 用户可以通过 Cygwin、WSL(Windows Subsystem for Linux)或 Windows 特定的替代方案访问类似功能。有关具体信息,请参阅 Windows 指南

来源: README.md552-568

总结

有效的系统调试需要了解多种专用工具以及根据上下文解释其输出的能力。Linux/Unix 命令行提供了强大的工具集,用于诊断系统堆栈的各个级别的硬件和内核到应用程序的问题。

通过掌握这些调试工具,系统管理员和开发人员可以有效地识别和解决性能问题、资源限制和意外的系统行为。

来源: README.md312-353