对于某个流程,我为资源335544320
设置了1610612736
的软限制值和RLIMIT_AS
的硬限制值。即使在设置此值后,进程的地址空间也会上升到最大178MB
。但我能够看到/proc/process_number/limits
中软和硬限制的值正确设置为上述值。
我想知道RLIMIT_AS
是否在我的操作系统中正常运行,并且还想知道如何测试RLIMIT_AS
功能。
CentOS 5.5(64位)是我正在使用的操作系统。
有些人请帮我解决这个问题。谢谢!
答案 0 :(得分:4)
所有setrlimit()
限制都是上限。允许进程使用尽可能多的资源,只要它保持在软限制之下。来自setrlimit()
manual page:
软限制是指的值 内核强制执行相应的 资源。硬限制充当了 软限制的上限:a 无特权的过程可能只会设置它 软限制到范围内的值 从0到硬限制,和 (不可逆转地)降低其硬限制。一个 特权进程(在Linux下:一个 具有CAP_SYS_RESOURCE功能) 可以对任一个进行任意更改 限制值。
实际上,这意味着硬限制是软限制和自身的上限。内核仅在进程操作期间强制执行软限制 - 仅当进程尝试更改资源限制时才会检查硬限制。
在您的情况下,您为地址空间指定了320MB的上限,并且您的流程使用了大约180MB的上限 - 完全在其资源限制范围内。如果您希望您的流程增长,则需要在其代码中 。
BTW,资源限制旨在保护系统 - 而不是调整单个进程的行为。如果一个过程遇到其中一个限制,那么无论你的故障处理有多好,它都能够恢复,这通常是值得怀疑的。如果您想通过以下方式调整流程的内存使用量:为了提高性能而分配更多缓冲区,您应该执行以下一项或两项操作:
询问用户是否有合适的值。在我看来,这应该始终是可能的。用户(或系统管理员)应该始终能够控制这些事情,从而覆盖应用程序中的任何和所有猜测。
检查可用内存量,并尝试猜测分配的数量。
作为旁注,您可以(并且应该)在编译时处理32位与64位。运行时检查这样的事情很容易失败并浪费CPU周期。但请记住,CPU“位数”与可用内存没有任何直接关系:
32位系统确实对进程可以使用的内存施加了限制(通常在1-3 GB范围内)。这并不意味着这么多内存实际可用。
64位系统相对较新,通常拥有更多物理内存。这并不意味着特定系统实际上拥有它或您的流程应该使用它。例如,许多人已经构建了具有1GB RAM的64位主文件服务器,以降低成本。而且我知道很多人如果一个随机过程迫使他们的DBMS交换只是因为它只考虑自己而会烦恼。