我正在寻找类似于ionice
和trickle
和pv -L
和tc
- 的命令,但它对文件的 IO 进行了限制。
ionice
查看本地机器上的块设备。我希望它能用于一般的文件 I/O。如果它不适用于 NFS 上安装的 encfs,那么它对我来说就毫无用处了。
trickle
塑造网络 I/O - 而不是文件系统 I/O。因此,如果我的程序访问 encfs 上的文件,它将不知道该文件是安装在 NFS 还是本地目录上。
tc
类似于trickle
:它塑造网络 I/O - 而不是文件系统 I/O。
pv -L
仅适用于管道。我需要它对程序打开的所有文件起作用。想想 Firefox:它以多个线程打开文件进行读写。
我想要这个:
thecommand --read 5M --write 1M firefox
限制firefox
以 5 MB/s 的速度读取文件并以 1 MB/s 的速度写入文件。
firefox
只是一个例子:我希望它适用于任何打开不同文件进行读写的程序。
我希望无论是firefox
访问本地文件还是 NFS/tmpfs/encfs/SSHFS/RandomFS 上的文件,限制都能起作用。
如果它只对动态链接程序起作用则是可以的(即,如果它执行一些 LD_PRELOAD 魔法则是可以的)。
有这样的野兽吗?
糟糕的解决方案:
跑步:
主要缺点:它不提供速度选项,但它可能是另一个答案的基础。
虽然这是一个糟糕的解决方案,但核心功能基本上是正确的:它通过拦截
read
和处理所有文件write
。它不关心文件是存储在本地还是网络文件系统上。它不需要任何需要 root 访问权限的专门设置。编辑:
现在做成了一个小的命令行工具: https://git.data.coop/tange/tangetools/src/branch/master/iothrottle
虽然没有地方可以写出一个很好的答案并给出一个例子,但
cgroups
可以为您做到这一点;systemd-run
当您在资源有限的范围内运行某些东西时,它是您的朋友。该文档有些过时,但设置交通管制
tc
可能是一种选择。https://lartc.org/howto/
trickle
将限制用户模式端的速率。大多数情况下非常有效