Linux /etc/security/limits.conf 解释

myf*_*wik 9 security linux limits

任何人都可以解释(或知道来源)提供有关limits.conf 中项目的详细信息吗?手册页没有提供太多细节。

例如它说:

rtprio 
maximum realtime priority allowed for non-privileged processes (Linux 2.6.12 and higher) 

priority 
the priority to run user process with (negative values boost process priority) 
Run Code Online (Sandbox Code Playgroud)

这些有什么不同?他们可以采取什么价值观?他们默认是什么?

有些项目是显而易见的,但我在哪里可以找到更好的解释(默认值、范围、它们的实际含义等):

data 
maximum data size (KB) 

fsize 
maximum filesize (KB) 

memlock 
maximum locked-in-memory address space (KB) 

cpu 
maximum CPU time (minutes) 

nice 
maximum nice priority allowed to raise to (Linux 2.6.12 and higher) values: [-20,19] 
Run Code Online (Sandbox Code Playgroud)

超过 CPU 时会发生什么?进程被杀死?只有一个进程或整个用户被禁止使用 CPU?这是一个会话还是每分钟的最长时间?

我试图找到答案,但我能找到的只是一个几乎没有提供任何细节的手册页。

Mat*_*Ife 18

rtprio 
maximum realtime priority allowed for non-privileged processes (Linux 2.6.12 and higher) 

priority 
the priority to run user process with (negative values boost process priority) 
Run Code Online (Sandbox Code Playgroud)

为什么这些不同?

linux 上有不同类别的进程调度程序。默认的 (CFQ) 基本上为每个想要运行的进程提供等量的时间片,并将可运行的任务排队,这样每个人平均等待轮到他们的时间是等量的。此规则存在一些例外情况,但这是基本思想。

另一类调度程序是实时调度程序。实时有点不同,而是将可运行的任务排队到一个公平的排队方案中,实时进程将在进程需要时立即获得 CPU 时间,这会从 CPU 中驱逐正在运行的进程,以便为“实时”腾出空间' 过程。

他们可以采取什么价值观?

'priority' 所做的是改变进程的好度,以便在登录时您的主进程以某种好度开始,您产生的任何子进程也以相同的好度开始。

这具有使其更有可能被调度以支持其他竞争进程的效果,并且可以使用户体验对于较低的 niceness 值更具响应性/交互性,并且如果提高 niceness 则响应性/交互性较低。

例如,普通登录用户的优先级低于可服务的守护进程可能很重要,或者 root 的登录优先级高于其他一切。

至于实时,争用由 'rtprio' 字段处理。如果您有两个实时任务都想要运行,那么 'rtprio' 值用于确定首先选择哪个进程作为优先级。更高的 rtprio 会产生更高优先级的任务。

在limits.conf 中进行设置允许将实时任务设置在特定的优先级范围内,而无需root 设置该值。这对未设置为使用实时调度程序运行的任务没有影响。

'nice' 值应该与 'rtprio' 相同,但用于标准 CFQ 调度。不过我从来没有尝试过。它设置当 PAM 将这些限制设置为那个好的 vaule 时产生的初始进程,然后普通用户可以进入那个好的级别或更高的级别,而无需 root 来设置它们。如果您不明确 renice,则意味着从该登录名的 shell 产生的所有进程(例如)将继承最初创建的父进程的 limits.conf 中设置的 nice 值。

什么是默认值?

“默认”限制——从技术上讲,除非明确设置,否则它们都被设置为 pid 1,资源限制从父进程继承,如果没有在任何地方定义或覆盖限制,则继承init是默认值。

其他值

data 
maximum data size (KB) 
Run Code Online (Sandbox Code Playgroud)

当一个进程被初始化时,它会在进程被复制到内存中时分配一些称为“数据段”的内存,这是全局变量的空间,也许是从堆分配的一些其他初始化数据和内存。限制控制进程可以占用的最大分配量。

您不太可能达到此限制,因为 malloc() 很少过度使用数据段来存储数据。

fsize 
maximum filesize (KB) 
Run Code Online (Sandbox Code Playgroud)

这实际上只是设置文件可以写入的最大大小,就像该用户一样。

memlock 
maximum locked-in-memory address space (KB) 
Run Code Online (Sandbox Code Playgroud)

应用程序获得的几乎所有内存都是“可驱逐的”。那是可以换掉的。内存锁定内存永远不可交换并保持常驻。该值受到严格控制,因为人们可能会滥用它来使系统内存不足并导致交换。它通常对安全应用程序很有用(它们从不希望它们的页面被交换——并且从交换分区变得可读)。

cpu 
maximum CPU time (minutes) 
Run Code Online (Sandbox Code Playgroud)

这表示进程可以在 CPU 上消耗的总时间。超过此值的进程将被杀死。请注意,这与自流程启动以来经过的时间量不同。IE 如果进程的 cpu 利用率为 100%,则 1 分钟的 cputime 限制将需要消耗 1 分钟,但如果进程使用 50% 的利用率,则消耗 2 分钟。

超过 cpu 会发生什么?

该进程收到SIGXCPU终止该进程的终止信号。这可以被父进程捕获并在那里处理。

只有一个进程或整个用户被限制使用 CPU?

几乎所有引用的限制都是在每个进程的基础上处理的。包括 CPU 时间。我认为唯一不是该用户的登录总数和进程总数。

其他一些有限制的陷阱是:

  • 最大进程数包括轻量级线程数。
  • RSS 限制没有任何作用,并且已经有很多年了,设置它毫无意义。