在Linux中以编程方式限制文件系统使用

时间:2009-12-20 16:23:30

标签: linux linux-kernel filesystems system-calls

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

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

3 个答案:

答案 0 :(得分:1)

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

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

同样,在决定谁负责某个IO时,你可以做一些非常棘手的事情:

  • 如果二进制文件是需求加载的,谁拥有IO呢?
  • 内存的映射部分(加载需求的可执行文件或其他内容)可能会被踢出内存,因为某人 else 使用了太多ram,从而导致内核选择驱逐那些页面,这些地方对其他用户的配额造成不公平的负担,然后将其重新打包回来
  • IO操作可以组合,可能来自不同的用户
  • 写操作可能会迟早导致IO,具体取决于内核如何安排它;稍后的调度可能意味着从长远来看需要完成更少的IO,因为另一个写入在过渡期间对同一个块进行了处理;写入缓存中已经很脏的块并不会使它变得更脏。

如果你理解了所有这些以及更多的警告,并且仍然想要,我想这样做就像IO调度程序一样。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

经过长时间的思考和探索,我决定使用提出的“提取方法”。我正在考虑创建一个新的系统调用,它初始化和管理一个全局变量,如hdd_ bandwith _limit。此变量将用于Read()Write()系统调用'修改后的实现(而不是¨count¨variable)。然后我将决定分配这个资源,这是真正的问题。可能我会找出有多少用户在某个时刻使用该系统并平均分配该资源。将是一个类似Round-Robin的发行版。但是,我仍然对这个分配问题的建议持开放态度。它会是SJF还是FCFS还是Round-Robin?同步是另一个问题。我怎么知道用户的工作是短期还是长期?或者他是否完成了手术?