目录

4. 操作系统

从本文开始我们将进入Linux性能优化的第二阶段,操作系统部分。操作系统原理是复杂的,不可能也没有能力把操作系统都将清楚。我们会列出每个部分相关的关键术语,并就其中与性能优化相关的关键部分进行讲解。本文是一个关于操作系统和内核知识的概览,为后面做一点准备。

与操作系统相关的术语:

  1. 进程: 一个 OS 的抽象概念,是用来执行程序的环境,运行在用户模式(用户态),通过系统调用或自陷来进入内核模式
  2. 线程: 可被调度的运行在 CPU上的可执行上下文
  3. 系统调用: 一套明确定义的协议,为用户程序请求内核执行特权操作
  4. 自陷: 信号发送到内核,请求执行一段系统程序(特权操作),自陷类型包括系统调用、处理器异常以及中断
  5. 中断: 由物理设备发送到内核的信号,通常是请求 I/O 服务,中断是自陷的一种类型
  6. 时钟: 是一个驱动所有处理器逻辑的数字信号,CPU 以一个特定的时钟频率执行

1. 内核

1.1 时钟

UNIX 内核的一个核心组件是 clock() 例程,从一个计时器中断执行,每执行一次成为一个 tick。功能包括更新系统时间,计时器和线程调度时间片的到时结束,维护CPU计数器,以及执行 callout(内核调度例程)。

但是 clock() 曾经有过性能问题。现代内核已经把许多功能移出了 clock 例程,放到了按需中断中,这是为了努力创造无 tick 内核。包括 Linux 在内,clock 例程即系统计时器中断,除了更新系统时钟和更新 jiffies 计数器之外,执行的工作很少。jiffies 是 Linux 的时间单元与 tick 类似。

1.2 内核态

用户进程通过系统调用执行内核特权操作时,会做上下文切换,从用户态到内核态。

无论是用户态还是内核态,都有自己的软件执行上下文,包括栈和寄存器。这些状态切换上下文是会耗费 CPU 周期的,这对每次I/O都增加了一小部分的时间开销。

1.3 用户栈和内核栈

执行系统调用时,一个进程的线程有两个栈: 一个用户级别栈和一个内核级别的栈。线程被阻塞时,用户级别的栈在系统调用期间不会改变,当执行在内核上下文时,线程用的是一个单独的内核级别栈。此处有一个例外,信号处理程序取决于其配置,可以借用用户级别的栈。

2. Linux 性能监测工具

接下来我们会按照操作系统的组成,讲解各个部分的监测工具和基准测试工具,下面是这些工具的概览,来自brendangregg

2.1 监测工具

/images/linux_pf/linux_cmd.png

/images/linux_pf/linux_static_tools.png

2.2 测试工具

/images/linux_pf/linux_benchmarking_tools.png

2.3 内核调参工具

/images/linux_pf/linux_tuning_tools.png