【问题标题】:Limiting the File System Usage Programmatically in Linux在 Linux 中以编程方式限制文件系统的使用
【发布时间】:2010-12-28 12:28:44
【问题描述】:

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

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

【问题讨论】:

  • “紧急”不会让你更快得到答案——可能正好相反。
  • 我发现了一篇关于一些 Linux 管理的非常有趣的文章 - blogs.rdoproject.org/7761/…。还有一些关于 I/O 限制的信息。

标签: linux linux-kernel filesystems system-calls


【解决方案1】:

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

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

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

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

如果您了解所有这些以及更多注意事项,并且仍然想要了解,我想将其作为 IO 调度程序是可行的。

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

【讨论】:

  • 感谢您的回答,但我想这不是我需要的。我不需要管理所有 i/o 操作 - 只需读写硬盘驱动器。一个程序可能需要一个输入,而用户通过键盘输入它——我不限制这一点。解决方案可能是修改 Read() 和 Write() 系统调用,它们负责 hdd 操作。
  • 读/写并不是导致 IO 进入硬盘的唯一方法,也不一定(两者都可以使用缓存)。我假设您想限制 IO 请求实际到达设备的速率;这需要在比读/写调用更低的级别上完成。
  • 应用程序可以通过使用mmap 来读取和写入文件来轻松解决这个问题(限制read/write 带宽)。
【解决方案2】:

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

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

【讨论】:

  • 好主意,谢谢,但我对这个主意的适用性有疑问。这是因为应该有大量的系统调用对文件系统进行操作。如果我尝试修改所有这些...这可能意味着重塑整个内核...但也许我错了,我会搜索一下,谢谢...
  • 系统调用很少——句号。您必须担心的两个主要问题是 read() 和 write()。不要将系统调用与 Linux 支持的数千种 API 混淆。
  • 尼尔:你是对的。我的意思是像一些内核 rootkit 那样做,即拦截库调用。谢谢。
【解决方案3】:

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

【讨论】:

  • 您不需要实现系统调用来管理单个变量 - 只需实现 sysctl 可调(通过/proc/sys/kernel/bandwidth_limit 从用户空间获取和设置)。添加这些的界面非常简单。
猜你喜欢
  • 2017-05-28
  • 2011-10-12
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多