ionice 对 NFS 客户端有影响吗?

ionice 对 NFS 客户端有影响吗?

我需要在 NFS 共享上递归删除数百万个目录,为了避免任何性能问题,我运行以下命令:

ionice -c 3 -t find /dir -type f -exec rm {};

这将删除所有文件和剩余的空目录,我可以使用 rm -rf 删除。

但我无法说出 ionice 是否对上述命令有任何影响。

来自 man,ionice class 3:

以空闲 io 优先级运行的程序只有在定义的宽限期内没有其他程序请求磁盘 io 时才会获得磁盘时间。空闲 io 进程对正常系统活动的影响应该为零。

从源代码中,我看到 ionice 设置了ioprio_set

那么,ioprio_set是什么?

ioprio_get() 和 ioprio_set() 系统调用分别获取和设置一个或多个线程的 I/O 调度类和优先级。

这是否意味着进程线程带有额外的属性,以便 I/O 调度程序使用它们来调度进程的 I/O?

这让我想到了以下问题:

  • I/O 调度程序是否通常知道磁盘上的 I/O 负载,还是仅将 I/O 调度到磁盘?
  • 如果是这种情况,即 I/O 调度程序知道磁盘上的负载并据此做出决策,我认为 IO 调度类和优先级不会对远程磁盘的 IO 调度产生任何影响。因此 ionice 不会产生任何影响。
  • 如果不是,我认为 IO 调度类和优先级也会影响远程磁盘(如 NFS)的 IO 调度。因此,如果多个用户/进程使用同一个 NFS 磁盘,ionice 将会工作,其中 I/O 调度程序会根据其他用户/进程是否使用同一个 NFS 磁盘来为给定线程调度 IO。

如果我完全错了,请纠正我。

也可以有一种方法可以从服务器端执行操作,但我想先从客户端尝试。

答案1

请注意,我的回答假设您使用的是 Linux,因为我很确定该ionice命令是 Linux 特有的。

I/O 调度程序在块层而不是文件系统层运行。因此,它只对本地存储设备和远程连接的块存储(如 NBD、iSCSI 或 ATAoE 连接的存储设备)有影响。因此,NFS 客户端上的 NFS 共享没有特殊的 I/O 调度(但服务器仍然会这样做,只是不知道远程 I/O 优先级),但可能对 iSCSI、NBD 或 ATAoE 设备有调度(然而,许多发行版会使用无操作调度程序来设置这些设备,这意味着这里唯一的 I/O 调度也是在服务器端完成的)。它会影响 NFS 的唯一可能情况是,如果您使用具有块布局的 pNFS,但您可能没有这样做,而且我不太确定它如何与块层交互,所以我将忽略这一点)。

至于 I/O 优先级实际上,这取决于您使用的特定 I/O 调度程序。至少,noop 和 deadline(可能还有新的 mq-deadline)调度程序根本不关注它,而 CFQ、BFQ 和我认为新的 Kyber 调度程序会对其进行一些操作,但它们不会对它执行完全相同的操作。据我所知,对于 CFQ,类的行为类似于等效的 CPU 调度类(实时 I/O 类的行为类似于 RT FIFO CPU 调度类)。我相信 BFQ 只是将它们用作其调度算法的提示(而不是它们对 CFQ 的更大影响),但我对此并不确定。

现在,就您的具体示例而言,它ionice应该根本不会产生影响,但它可能不会对本地文件系统产生太大影响,除非磁盘已被其他进程充分利用(您指定的“空闲”调度类不是真正的空闲调度程序,但即使是,find大多数时候也不会占用太多的磁盘时间,rm命令使用的甚至更少)。

另外,稍微偏离主题的一点是,但find您引用的命令只会删除文件(因为选项-type f),所以它并不完全等同于rm -rf,并且您可以通过将替换为来提高其(本地)性能-exec rm {} ;-delete它可以做同样的事情而不需要为它删除的每个文件创建一个新的进程。

相关内容