【问题标题】:RLIMIT_AS is not working upon setting its soft limit to a certain valueRLIMIT_AS 无法将其软限制设置为某个值
【发布时间】:2011-03-05 07:47:21
【问题描述】:

对于一个进程,我为资源RLIMIT_AS设置了软限制值335544320和硬限制值1610612736。即使设置了这个值,进程的地址空间也会上升到最大值178MB。但我能够看到/proc/process_number/limits 中的软限制和硬限制的值正确设置为上述值。

我想知道RLIMIT_AS 是否在我的操作系统中运行,并且还想知道如何测试RLIMIT_AS 功能。

CentOS 5.5(64 位)是我使用的操作系统。

请在这方面帮助我。谢谢!

【问题讨论】:

  • 错误... 335544320 = 320MB。你的过程比这要低很多。究竟是什么问题?
  • 我想知道为什么进程没有达到我设置的值 (320MB) 而不是将自身限制为 178MB。我需要在 64 位系统中增加进程的大小。当 RAM 可用时,我希望进程增长到更大的大小。
  • @Rajath:分配多少内存取决于进程,只要它不超过您的限制。如果您希望它具有更大的缓冲区或其他东西,那将取决于您正在运行的确切内容。
  • 请有人告诉我操作系统如何使用这个软硬限制值。我的意思是在我的情况下,进程是否在进程启动时分配了 320MB,或者操作系统在进程需要内存时分配。
  • @Rajath:软限制是实际的资源限制,硬限制是非特权进程可以设置其软限制的最大值。但它们都是限制。就是这样。 在这些限制内的增长/收缩/任何东西都取决于您的过程。

标签: c unix memory process setrlimit


【解决方案1】:

所有setrlimit() 限制都是上限。只要进程保持在软限制之下,它就可以根据需要使用尽可能多的资源。来自setrlimit() manual page

软限制是 内核强制执行相应的 资源。硬限制充当 软限制的上限:一个 非特权进程只能设置其 对范围内的值的软限制 从 0 到硬限制,以及 (不可逆地)降低其硬限制。一种 特权进程(Linux下:一个 具有 CAP_SYS_RESOURCE 功能) 可以任意更改任何一个 极限值。

实际上,这意味着硬限制是软限制及其自身的上限。内核仅在进程运行期间强制执行软限制 - 仅当进程尝试更改资源限制时才会检查硬限制。

在您的情况下,您为地址空间指定了 320MB 的上限,而您的进程使用了​​其中的大约 180MB - 完全在其资源限制范围内。如果您希望您的流程增长,您需要在其代码中进行

顺便说一句,资源限制旨在保护系统 - 而不是调整单个进程的行为。如果一个进程遇到这些限制之一,无论您的故障处理有多好,它是否能够恢复通常都是值得怀疑的。

如果您想通过例如调整进程的内存使用情况分配更多缓冲区以提高性能,您应该执行以下一项或两项操作:

  • 向用户询问适当的值。在我看来,这是一件应该永远是可能的事情。用户(或系统管理员)应该始终能够控制这些事情,从而覆盖您的应用程序中的所有猜测。

  • 检查有多少内存可用,并尝试猜测要分配的好数量。

作为旁注,您可以(并且应该)在编译时处理 32 位和 64 位。像这样的运行时检查很容易失败并浪费 CPU 周期。但是请记住,CPU“位数”与可用内存没有任何直接关系:

  • 32 位系统确实对进程可以使用的内存施加了限制(通常在 1-3 GB 范围内)。这并不意味着有这么多内存实际可用

  • 64 位系统相对较新,通常拥有更多的物理内存。这并不意味着特定系统实际上拥有它或您的进程应该使用它。例如,许多人已经构建了具有 1GB RAM 的 64 位家庭文件服务器以降低成本。而且我知道有很多人会因为随机进程强迫他们的 DBMS 交换只是因为它只考虑自己而感到恼火。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多