如何检查 Linux 中是否配置了磁盘调度器

LinuxLinuxBeginner
立即练习

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

简介

在本次实验中,我们将探讨如何在 Linux 环境中确定已配置的磁盘调度器。了解当前活动的 I/O 调度器对于性能调优和优化存储操作至关重要。

我们将通过以下方法实现这一目标:检查 /sys 文件系统以直接查询块设备的调度器配置;使用 dmesg 命令验证内核环形缓冲区中的调度器信息;检查可能影响设备配置(包括调度器)的 udev 规则。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/ls -.-> lab-558708{{"如何检查 Linux 中是否配置了磁盘调度器"}} linux/cat -.-> lab-558708{{"如何检查 Linux 中是否配置了磁盘调度器"}} linux/grep -.-> lab-558708{{"如何检查 Linux 中是否配置了磁盘调度器"}} end

使用 cat /sys/block/*/queue/scheduler 检查调度器

在这一步中,我们将探讨如何检查 Linux 中块设备正在使用的 I/O 调度器。I/O 调度器是一个内核组件,它决定了块 I/O 操作提交到存储设备的顺序。不同的调度器针对不同的工作负载进行了优化。

我们可以通过查看 /sys 文件系统中的文件来获取这些信息。/sys 文件系统是一个虚拟文件系统,它提供了访问内核数据结构的接口。

要检查所有块设备的调度器,我们可以使用 cat 命令和通配符。* 通配符可以匹配任意字符,因此 /sys/block/*/queue/scheduler 将匹配 /sys/block/ 下列出的每个块设备的调度器文件。

如果终端尚未打开,请打开它。你可以通过点击桌面左侧的 Xfce Terminal 图标来打开终端。

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

cat /sys/block/*/queue/scheduler

你将看到类似如下的输出:

noop [deadline] cfq
noop [deadline] cfq

输出显示了可用的调度器,当前正在使用的调度器用方括号 [] 括起来。在这个例子中,deadline 调度器当前正在为块设备启用。

了解哪个调度器处于活动状态对于性能调优非常重要,特别是在服务器环境或有特定存储需求的系统中。

dmesg 中验证调度器

在上一步中,我们使用 /sys 文件系统检查了当前活动的 I/O 调度器。另一个可以找到内核和设备初始化信息的地方是内核环形缓冲区,你可以使用 dmesg 命令查看它。

dmesg 命令用于打印内核的消息缓冲区。这个缓冲区包含了内核在启动和运行期间产生的消息,包括检测到的硬件和设备驱动的信息。

我们可以使用 dmesg 查看系统启动过程中与块设备及其配置的调度器相关的消息。由于 dmesg 的输出可能很长,我们将使用 grep 命令过滤输出,查找包含 "scheduler" 这个词的行。

在终端中输入以下命令并按回车键:

dmesg | grep scheduler

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

你应该会看到类似如下的输出:

[    X.XXXXXX] io scheduler noop registered
[    X.XXXXXX] io scheduler deadline registered
[    X.XXXXXX] io scheduler cfq registered
[    X.XXXXXX] sdX: [sd-mod] Asking for cache data failed
[    X.XXXXXX] sdX: [sd-mod] Assuming drive cache: write through
[    X.XXXXXX] sdX: [sd-mod] Enabled discard support
[    X.XXXXXX] sdX: [sd-mod] **Using deadline scheduler**

查找提到 "Using [调度器名称] scheduler" 的行。这可以确认在启动时为你的块设备选择了哪个调度器。输出可能会根据具体的系统配置略有不同,但你应该会看到已注册的调度器以及正在使用的调度器的相关信息。

这种方法提供了系统启动过程中的历史信息,而检查 /sys 文件系统则能让你了解当前的状态。这两种方法都是了解系统 I/O 配置的有用方式。

检查 /etc/udev/rules.d 中的 udev 规则

在前面的步骤中,我们学习了如何使用 /sysdmesg 检查活动的 I/O 调度器。现在,让我们来看看系统在检测到设备时是如何配置以自动设置调度器的。这通常由 udev 处理。

udev 是 Linux 内核的设备管理器。它管理 /dev 中的设备节点,并处理系统中添加或移除硬件设备时的所有用户空间事件。udev 使用规则来匹配设备并执行操作,例如设置权限或配置设备参数(如 I/O 调度器)。

udev 规则通常存储在 /etc/udev/rules.d/ 目录中。这些文件的扩展名为 .rules。我们可以检查这些文件,看看是否有针对某些设备专门设置 I/O 调度器的规则。

首先,让我们使用 ls 命令列出 /etc/udev/rules.d/ 目录中的文件:

ls /etc/udev/rules.d/

你会看到一个文件列表,可能包含一些与块设备或存储相关的文件。输出可能如下所示:

10-snapd.rules  50-cloudimg-settings.rules  70-snap.core.rules  70-snap.lxd.rules  70-snap.microk8s.rules  70-snap.snapd.rules  70-snap.snapd-desktop-integration.rules  99-vmware-scsi-udev.rules

现在,让我们查看其中一个文件,看看是否能找到与调度器相关的规则。我们将使用 cat 命令显示文件内容。例如,让我们查看 99-vmware-scsi-udev.rules(确切的文件名可能会因环境而异,但要找一个看起来与存储或设备相关的文件):

cat /etc/udev/rules.d/99-vmware-scsi-udev.rules

你可能会看到匹配特定设备属性然后设置属性的规则。查找使用 ATTR 关键字匹配设备属性并使用 ATTR{queue/scheduler} 属性设置调度器的行。

例如,设置 deadline 调度器的规则可能如下所示:

## Set scheduler for VMware SCSI devices
ACTION=="add|change", SUBSYSTEM=="block", ATTRS{idVendor}=="VMware", ATTRS{idModel}=="VMware Virtual S", ATTR{queue/scheduler}="deadline"

此规则匹配具有特定厂商和型号属性的块设备 (SUBSYSTEM=="block"),并在它们被添加或更改时将其调度器设置为 deadline

通过检查这些规则,你可以了解系统上的默认 I/O 调度器是如何配置的。

总结

在本次实验中,我们学习了如何使用两种主要方法检查 Linux 中配置的磁盘调度器。首先,我们使用 cat 命令查看 /sys/block/*/queue/scheduler 的内容,从而利用 /sys 文件系统。这使我们能够查看可用的调度器,并通过方括号标识出当前正在使用的调度器。

其次,我们使用 dmesg 命令探索内核环形缓冲区,以验证设备初始化期间的调度器信息。这为确认活动调度器提供了另一种方法,并让我们深入了解与存储设备相关的内核消息。最后,我们简要提及了检查 /etc/udev/rules.d 中的 udev 规则,它可能是调度器配置的位置,不过在提供的内容中并未详细介绍具体步骤。