如何检查 Linux 内核调度器是否已配置

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查 Linux 中的内核调度器配置。调度器是管理进程如何共享 CPU 时间的基本组件。了解其设置对于性能分析和故障排除至关重要。

通过实际操作步骤,你将探索三种检查调度器设置的方法:使用 sysctl 命令查看内核参数,检查 /proc/sys/kernel 文件系统中与调度器相关的文件,以及通过 dmesg 检查内核日志以获取调度器特定的消息。这些技术从不同角度展示了调度器的当前状态和行为。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/UserandGroupManagementGroup(["User and Group Management"]) linux/BasicSystemCommandsGroup -.-> linux/help("Command Assistance") linux/BasicSystemCommandsGroup -.-> linux/man("Manual Access") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/UserandGroupManagementGroup -.-> linux/env("Environment Managing") subgraph Lab Skills linux/help -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} linux/man -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} linux/ls -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} linux/cat -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} linux/cd -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} linux/grep -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} linux/env -.-> lab-558724{{"如何检查 Linux 内核调度器是否已配置"}} end

使用 sysctl kernel.sched 检查调度器设置

在这一步中,我们将探讨如何使用 sysctl 命令检查内核的调度器设置。调度器是 Linux 内核的关键部分,它决定了哪个进程可以在 CPU 上运行以及运行多长时间。了解其设置有助于进行性能调优和故障排除。

sysctl 命令用于在运行时修改内核参数。我们也可以使用它来查看这些参数的当前值。内核参数以类似于文件系统的层次结构进行组织。

要查看与内核调度器相关的参数,我们可以使用带有 kernel.sched 前缀的 sysctl 命令。

如果终端尚未打开,请打开它。你可以在桌面左侧找到 Xfce 终端 图标。

现在,输入以下命令并按回车键:

sysctl kernel.sched

你应该会看到类似以下的输出,显示各种与调度器相关的参数及其当前值:

kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 8000000
kernel.sched_wakeup_granularity_ns = 9000000
kernel.sched_latency_ns = 24000000
kernel.sched_migration_cost_ns = 50000
kernel.sched_nr_migrate = 32
kernel.sched_tunable_scaling = 1
kernel.sched_domain.cpu0.domain0 = ...
kernel.sched_domain.cpu0.domain1 = ...
...

确切的输出可能会因具体的内核版本和系统配置而略有不同。此命令为你提供了调度器当前配置的快照。

理解每个参数超出了这个入门实验的范围,但关键要点是,当你想要检查这些设置时,应使用 sysctl kernel.sched 命令。

点击 继续 进入下一步。

在 /proc/sys/kernel 中验证调度器

在上一步中,我们使用 sysctl 来查看内核参数。另一种访问并有时修改这些参数的方法是通过 /proc 文件系统。/proc 文件系统是一个虚拟文件系统,它提供有关进程和其他系统信息。

可以通过 sysctl 访问的内核参数通常会在 /proc/sys 目录中有所体现。具体来说,与调度器相关的参数可以在 /proc/sys/kernel/ 目录下找到。

让我们导航到这个目录并列出其内容。我们将使用 cd 命令来更改目录,使用 ls 命令来列出文件和目录。

输入以下命令将当前目录更改为 /proc/sys/kernel/

cd /proc/sys/kernel/

现在,列出该目录中的文件:

ls

你会看到一长串文件,每个文件都代表一个内核参数。查找以 sched_ 开头的文件。这些文件对应于我们使用 sysctl 看到的 kernel.sched 参数。

...
sched_child_runs_first
sched_latency_ns
sched_migration_cost_ns
sched_min_granularity_ns
sched_nr_migrate
sched_rr_timeslice_ms
sched_rt_period_us
sched_rt_runtime_us
sched_shares_window_ns
sched_tunable_scaling
sched_wakeup_granularity_ns
...

你可以使用 cat 等命令查看这些文件的内容。例如,要查看 sched_latency_ns 的值,请输入:

cat sched_latency_ns

你应该会看到一个数字,这个数字与你使用 sysctl 时看到的 kernel.sched_latency_ns 的值相同。

24000000

这表明 sysctl kernel.sched 提供的信息来自 /proc/sys/kernel/ 目录中的文件。虽然 sysctl 通常在查看和修改参数时更方便,但了解 /proc 文件系统能让你更深入地了解内核如何展示其内部状态。

点击 继续 以继续。

在 dmesg 中检查调度器日志

在这最后一步中,我们将使用 dmesg 命令查看与调度器相关的内核消息。dmesg 是一个用于显示内核环形缓冲区消息的命令。这些消息是内核在启动和运行期间生成的,可能包含有关硬件、驱动程序和系统事件(包括调度器活动)的宝贵信息。

虽然 sysctl/proc/sys 显示的是当前配置,但 dmesg 有时可以显示与调度器初始化或重大事件相关的消息。

要查看内核消息,请输入以下命令:

dmesg

这可能会产生非常长的输出,因为它会显示自系统启动以来的所有内核消息。为了找到专门与调度器相关的消息,我们可以使用 grep 命令来过滤输出。我们将搜索包含 "sched" 一词的行。

输入以下命令:

dmesg | grep sched

| 符号称为管道。它将左边命令(dmesg)的输出作为输入发送给右边的命令(grep sched)。然后,grep sched 会在接收到的输入中搜索包含 "sched" 的行。

你可能会看到类似以下的输出,显示系统启动期间与调度器相关的消息:

[    0.000000] Linux version ... (gcc version ...) #... SMP ...
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-... root=... ro quiet splash vt.handoff=...
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-... root=... ro quiet splash vt.handoff=...
[    0.000000] PID scheduler: ...
[    0.000000] Mount-cache hash table entries: ... (order: ..., 65536 bytes, linear)
[    0.000000] Mountpoint-cache hash table entries: ... (order: ..., 65536 bytes, linear)
[    0.000000] CPU: Testing write buffer coherency: ...
[    0.000000] smpboot: CPU0: ...
[    0.000000] setup_percpu: System has ... CPUs.
[    0.000000] percpu: Embedded ... pages/cpu s...
[    0.000000] pcpu: PCPU: ...
[    0.000000] Built 1-level schedule group tree
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is ...
[    0.000000] rcu: Adjusting scheduler-enlistment delay with ...
[    0.000000] rcu: RCU restricting CPUs from NR_CPUS=... to nr_cpu_ids=...
[    0.000000] rcu: rcu_sched detected stalls on CPUs/tasks:
...

同样,确切的输出会有所不同。此命令对于诊断问题或了解内核如何初始化调度器很有用。

你现在已经学习了三种不同的方法来获取有关 Linux 内核调度器的信息:使用 sysctl 获取当前参数、检查 /proc/sys/kernel/ 中的文件,以及使用 dmesg 检查内核消息。

点击 继续 完成此实验。

总结

在本次实验中,我们学习了如何使用两种主要方法检查 Linux 中的内核调度器配置。首先,我们使用 sysctl kernel.sched 命令查看了各种与调度器相关的参数及其当前值,这为调度器的运行时设置提供了一个快照。

其次,我们探索了 /proc 文件系统,将其作为访问内核参数的另一种方式,特别关注了 /proc/sys/kernel 路径,该路径反映了可通过 sysctl 访问的参数。这些步骤展示了如何通过命令行工具和虚拟文件系统来检查内核调度器的配置。