Kernel Profiling
实验目标:
- 熟悉 Linux 内核分析的基础知识
- 了解基本的分析工具
- 学习剖析方法和良好实践
本课程旨在将我们迄今为止在内核空间中所做的工作与现实世界的用例合并,在这些用例中,我们不编写内核空间代码,但我们使用分析工具查看内核,以便调试我们在编写常规的低级应用程序时遇到的问题
本课程的另一个重点是学习调试软件问题的一般方法,我们将介绍一些工具,这些工具让我们从内核中深入了解应用程序的运行方式
1 | make clean |
在使用 I/O 时,我们必须记住,与内存(速度快一个数量级)和调度(处理CPU上当前运行的内容)相比,它是操作系统中最慢的系统之一
Investigating Reduced Responsiveness
在插入 io.ko 模块时会降低系统的响应能力,我们看到命令行在键入命令时会断断续续,但是当运行顶部时,我们看到系统的负载不高,并且没有任何进程占用资源
了解 io.ko 模块正在做什么,以及为什么它会降低系统的响应能力
1 |
|
- 加载内核模块 io.ko 后,程序 shell 有明显的卡顿
- 使用
top
命令:
1 | Mem: 33064K used, 205848K free, 100K shrd, 292K buff, 4444K cached |
- 发现没有进程占用资源
Launching New Threads
执行调度二进制文件时,它会从 100 个正在运行的实例并行打印消息,有两种形式:
- 创建线程
- 创建进程
1 |
|
- 进程:结果更加稳定,但速度慢
- 线程:速度更快,但结果不稳定
Tuning CP
我们的目标是在 linux 中编写一个集成在 Linux 中的 cp 工具的副本,该工具已由内存二进制文件实现,它实现了两种我们可以用于复制操作的方法:
- 使用 read 系统调用读取内存中缓冲区中源文件的内容,并使用 write 系统调用将该缓冲区写入目标文件
- 使用 mmap 系统调用将源文件和目标文件映射到内存,并将源文件的内容复制到内存中的目标文件
对比两种方法的性能:
- 调查两种复制机制中的哪一种更快(对于此步骤,您将使用1024块大小)
- 找到哪种复制机制更快,请更改块大小参数,看看哪个值能为您提供最佳副本
1 |
|
- 结果:
1 | root@qemux86:~/skels/kernel_profiling/3-memory# ./memory 1 10240000 1 2 |
- 使用 read/write 有明显的延迟,使用 I/O,速度较慢
- 使用 mmap 几乎可以瞬间完成,使用映射,速度较快
I/O Latency
我们编写了一个读取磁盘内容的模块,插入 bio.ko 模块,我们看到系统负载出现较大峰值
1 | Mem: 180032K used, 58880K free, 156K shrd, 324K buff, 15248K cached |
Bad ELF
我们设法构建了一个ELF文件(作为 Unikraft 构建的一部分),该文件在进行静态分析时是有效的,但无法执行
1 | ➜ 5-bad-elf git:(master) ✗ ./bad_elf |
- 结果:
1 | ➜ 5-bad-elf git:(master) ✗ readelf -a bad_elf |