C RLIMIT_AS在将其软限制设置为特定值时不起作用

C RLIMIT_AS在将其软限制设置为特定值时不起作用,c,unix,memory,process,setrlimit,C,Unix,Memory,Process,Setrlimit,对于一个进程,我为资源RLIMIT\u设置了335544320的软限制值和1610612736的硬限制值。即使设置了此值,进程的地址空间也会增加到最大178MB。但我能够看到/proc/process\u number/limits中的软限制和硬限制值正确设置为上述值 我想知道RLIMIT_AS是否在我的操作系统中工作,还想知道如何测试RLIMIT_AS功能 CentOS 5.5(64位)是我正在使用的操作系统 有些人在这方面请帮助我。谢谢大家! 所有限制都是上限。一个进程可以使用它所需要的尽可

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

我想知道
RLIMIT_AS
是否在我的操作系统中工作,还想知道如何测试
RLIMIT_AS
功能

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

有些人在这方面请帮助我。谢谢大家!

所有限制都是上限。一个进程可以使用它所需要的尽可能多的资源,只要它保持在软限制之下。从:

软限制是指 内核对相应的 资源。硬限制起到了保护作用 软限制的上限:一个 非特权进程只能设置其 对范围内的值进行软限制 从0到硬限制,以及 (不可逆转地)降低其硬极限。A. 特权进程(Linux下:一个) 具有CAP_系统_资源能力) 可以对其中一个进行任意更改 极限值

实际上,这意味着硬极限是软极限和软极限本身的上限。内核仅在进程运行期间强制执行软限制—硬限制仅在进程尝试更改资源限制时才进行检查

在您的例子中,您为地址空间指定了320MB的上限,并且您的进程使用了其中大约180MB的地址空间,这在其资源限制内。如果希望流程增长,则需要在其代码中实现

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

如果要通过分配更多缓冲区以提高性能等方式调整进程的内存使用率,则应执行以下一项或两项操作:

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

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

作为旁注,您可以(而且应该)在编译时处理32位对64位的问题。类似的运行时检查容易出现故障并浪费CPU周期。但是,请记住,CPU“位”与可用内存没有任何直接关系:

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

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


呃。。。335544320=320MB。你的流程比那要低很多。到底是什么问题?我想知道为什么进程没有提升到我设置的值(320MB),而不是将自身限制为178MB。我需要增加64位系统中进程的大小。我希望一个进程在RAM可用的情况下能够扩展到更大的大小。@Rajath:只要不超过您的限制,分配多少内存取决于进程。如果你想让它有更大的缓冲区或其他东西,那将完全取决于你正在运行什么。有人能告诉我操作系统是如何使用这个软限制值和硬限制值的吗。我的意思是,在我的例子中,进程启动时是分配320MB,还是操作系统在进程需要内存时分配。@Rajath:软限制是实际的资源限制,硬限制是非特权进程可以设置其软限制的最大值。但它们都是限制。就这样。这取决于你的成长/收缩/在这些限制范围内的任何事情。