/images/hugo/avatar.png

4. 操作系统

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

3.5 Systemtap Python

本节我们来看看如何使用 Systemtap 来追踪 Python 程序的执行。

1. 环境配置

从 Python 3.6 开始,CPython 可以使用嵌入式“标记”,也称为“探测器”,使得可以通过 DTrace 或 SystemTap 来追踪 Cpython。

3.4 Systemtap 用户空间探测

本节我们继续来学习 Systemtap 的使用 – 用户空间的动态追踪

1. 用户空间探测

SystemTap从0.6版本开始也支持探测用户空间的进程。SystemTap可以探测用户空间进程内函数的调用和退出,可以探测用户代码中预定义的标记,可以探测用户进程的事件。

3.3 Systemtap 内核空间探测

本节我们继续来学习 Systemtap 的使用 – 内核的动态追踪

/images/linux_pf/stap_flow_diagram.png

1. 内核变量的获取

本节我们来看如何获取内核空间中的变量,包括:

  1. 目标变量获取
  2. 全局以及静态变量获取
  3. 内置的便捷变量

2. 内核变量获取

跟内核代码相关的事件,如kernel.function(“function”)和kernel.statement(“statement”),允许使用目标变量获取这部分代码中可访问到的变量的值。stap -L 可以列出特定探测点下可用的目标变量。

3.2 stap 脚本

本节我们来看看 stap 脚本的基本语法。

1. Systemtap 执行细节

SystemTap脚本运行时,会启动一个对应的SystemTap会话。整个会话大致流程如下:

  1. 首先,SystemTap会检查脚本中用到的tapset,确保它们都存在于tapset库中(通常是/usr/share/systemtap/tapset/)
  2. SystemTap会把找到的tapset替换成在tapset库中对应的定义
  3. tapset是tap(听诊器)的集合,指一些预定义的SystemTap事件或函数
  4. SystemTap接着会把脚本转化成C代码,运行系统的C编译器编译出一个内核模块。
  5. SystemTap随即加载该模块,并启用脚本中所有的探,这一步由system-runtime包的staprun完成
  6. 每当被监控的事件发生,对应的处理程序就会被执行。
  7. 一旦SystemTap会话终止,探针会被禁用,内核模块也会被卸载。

1.1 tapsets

tapsets是一些包含常用的探针和函数的内置脚本,你可以在SystemTap脚本中复用它们。当用户运行一个SystemTap脚本时,SystemTap会检测脚本中的事件和处理程序,并在翻译脚本成C代码之前,加载用到的tapset。