Linux 在启动过程中,有三个特殊的进程,也就是 PID 号最小的三个进程

  • 0号进程为 idle 进程,这也是系统创建的第一个进程,它在初始化 1 号和 2 号进程后,演变 为空闲任务。当 CPU 上没有其他任务执行时,就会运行它。
  • 1号进程为 init 进程,通常是 systemd 进程,在用户态运行,用来管理其他用户态进程。
  • 2号进程为 kthreadd 进程,在内核态运行,用来管理内核线程。
  • kswapd0:用于内存回收。
  • kworker:用于执行内核工作队列,分为绑定CPU(名称格式为 kworker/CPU:ID)和未绑 定 CPU(名称格式为 kworker/uPOOL:ID)两类。
  • migration:在负载均衡过程中,把进程迁移到CPU上。每个CPU都有一个migration内核线程。 jbd2/sda1-8:jbd 是 Journaling Block Device 的缩写,用来为文件系统提供日志功能,以 保证数据的完整性;名称中的 sda1-8,表示磁盘分区名称和设备号。每个使用了 ext4 文件系 统的磁盘分区,都会有一个 jbd2 内核线程。
  • pdflush:用于将内存中的脏页(被修改过,但还未写入磁盘的文件页)写入磁盘(已经在 3.10 中合并入了 kworker 中)。

perf

  1. perf record -a -g -p 9 -- sleep 30
  • net_rx_action 和 netif_receive_skb,表明这是接收网络包(rx 表示 receive)。
  • br_handle_frame ,表明网络包经过了网桥(br 表示 bridge)。
  • br_nf_pre_routing ,表明在网桥上执行了 netfilter 的 PREROUTING(nf 表示 netfilter)。 而我们已经知道 PREROUTING 主要用来执行 DNAT,所以可以猜测这里有 DNAT 发生。
  • br_pass_frame_up,表明网桥处理后,再交给桥接的其他桥接网卡进一步处理。比如,在新的网卡上接收网络包、执行 netfilter 过滤规则等等。
  • 横轴表示采样数和采样比例。一个函数占用的横轴越宽,就代表它的执行时间越长。同一层的 多个函数,则是按照字母来排序。
  • 纵轴表示调用
  • 栈,由下往上根据调用关系逐个展开。换句话说,上下相邻的两个函数中,下面 的函数,是上面函数的父函数。这样,调用栈越深,纵轴就越高。

strace

strace 基于系统调用 ptrace 实现
由于 ptrace 是系统调用,就需要在内核态和用户态切换。当事件数量比较多时,繁忙的 切换必然会影响原有服务的性能;
ptrace 需要借助 SIGSTOP 信号挂起目标进程。这种信号控制和进程挂起,会影响目标 进程的行为。
所以,在性能敏感的应用(比如数据库)中,我并不推荐你用 strace (或者其他基于 ptrace 的性能工具)去排查和调试。
可以尝试使用 perf trace