1

我被分配为 Linux 内核编写一个系统调用,它奇怪地确定(并减少)用户每分钟的最大传输量(用于文件操作)。这个系统调用将被调用lim_fs_usage,并将获取所有用户在一分钟内可以访问的最大字节数的参数。简而言之,我将确定 Linux 中所有文件系统操作的带宽。该项目还要求选择适当的方法在用户之间分配此受限资源(文件访问),但我认为这不会是一个大问题。

我进行了长时间的搜索和扫描,但找不到以编程方式管理文件系统访问的方法。我想过将(mmap())硬盘驱动器映射到内存并管理内存操作,但这变得毫无用处。我还试图找到一个用于虚拟文件系统的 API 来监控和限制它,但我找不到。任何想法,请...非常感谢任何帮助。先感谢您...

4

3 回答 3

1

我想知道您是否可以将其作为 IO 调度程序实现。

在 Linux 下做 IO 带宽限制的主要困难在于,当它到达设备附近的任何地方时,内核可能早就忘记了是谁造成的。

同样,在确定谁对给定的 IO 负责时,您可能会遇到一些非常棘手的问题:

  • 如果二进制文件是按需加载的,那么谁拥有执行此操作的 IO?
  • 内存的映射部分(按需加载的可执行文件或其他)可能会因为其他人使用过多的 ram而被踢出内存,从而导致内核选择驱逐这些页面,这对其他用户的配额造成了不公平的负担然后将其翻页
  • IO操作可以组合,可能来自不同的用户
  • 写操作迟早会引起 IO,这取决于内核如何调度它;较晚的计划可能意味着从长远来看需要完成的 IO 更少,因为在此期间对同一块进行了另一次写入;写入缓存中已经脏的块不会使其更脏。

如果您了解所有这些和更多警告,并且仍然想要,我想将其作为 IO 调度程序来做是要走的路。

IO 调度器在 Linux (2.6) 下是可插入的,并且可以动态更改 - 内核等待设备上的所有 IO(IO 调度器可按块设备切换)结束,然后切换到新的。

于 2009-12-20T22:40:44.683 回答
0

既然很紧急,我会在不做任何可行性研究的情况下给你一个想法——插入一个钩子来监视处理文件系统访问的系统调用怎么样?您最终可能会编写专门的内核模块来处理各种文件系统(ext3、ext4 等),但作为概念验证,您可以从一个开始。不要忘记root在内存、进程空间和磁盘中为自己的操作保留了块。

管理内存操作听起来与您尝试做的事情无关(但也许我在这里弄错了)。

于 2009-12-20T16:48:17.803 回答
0

经过长时间的思考和探索,我决定使用提出的“挂钩”方法。我正在考虑创建一个新的系统调用来初始化和管理像 hdd_bandwith_limit 这样的全局变量。该变量将用于Read()Write()系统调用的修改实现(而不是“count”变量)。然后我将决定这个资源的分配,这是真正的问题。大概我会找出某个时刻有多少用户在使用系统,然后平均分配这个资源。将是一个类似循环的分布。但是,我仍然愿意接受有关此分配问题的建议。它会是 SJF 还是 FCFS 还是循环法?同步是另一个问题。我如何知道用户的工作是短的还是长的?或者他是否完成了手术?

于 2009-12-21T13:56:36.157 回答