aka*_*ner 15 configuration kernel
我对操作系统内部工作的了解不多,那么为什么我们对 Linux 中的最大打开文件数和运行进程数有限制?
如果有人能帮助我理解,我将不胜感激。
nan*_*rad 17
这主要是历史原因。在较旧的 Linux 大型机上,许多用户会连接并使用大型机的资源。当然,限制是必要的,因为文件句柄和进程等操作是内置在内核中的,所以限制在那里。它还有助于限制像叉子炸弹这样的攻击。此处显示了使用进程限制来防御表单炸弹。
它还通过不允许失控的分叉和文件打开来帮助控制复杂的服务和守护进程,类似于分叉炸弹试图做的事情。
还需要注意的还有可用的 RAM 和 CPU 数量,以及 32 位计数器只能引用这么多的事实(32 位计数器只能计数 4294967296 个条目),但这样的限制还很远高于通常由程序员和系统管理员设置的那些。无论如何,早在您拥有 4294967296 个进程之前,您的机器可能已经重新启动,或者按计划重新启动,或者由于其他资源匮乏而开始锁定。
除非您运行具有 584 TiB 内存的Titan(您不会,因为 Linux 不能作为超级计算机上的一个实例运行),否则您可能不会很快达到此进程限制。即便如此,假设没有共享内存,平均进程也只有大约 146KB 的内存。
无论是在生活中还是在 Linux 中,大多数事物都存在限制。有时限制很高,不值得担心,有时又太低,被懒惰的程序员随意设置,或者被硬件限制设置。
当程序员做出诸如地址等字段中允许的最大字符数之类的决定时,就会出现任意限制。设置一些任意限制比根据需要动态分配内存要容易得多。您不想将所有可用内存分配给一个简单的输入字段,但也不希望输入覆盖其他可能很重要的内存。对于打开的文件和进程,可能存在任意限制,也可能受到可用内存的限制。如果是后者,那么当您接近限制时,不好的事情就会开始发生,系统可能会挂起,因此在此之前设置一个限制通常是好的。有时,可能会在启动时根据内存或磁盘空间确定任意限制,并且通常相当智能,
然后是硬件设置的限制,例如整数或字符的大小。如果您使用的是 32 位系统,则存在由整数的最大大小设置的限制(如果无符号则为 4,294,967,295,如果有符号则为一半)。
对于进程,/proc/sys/kernel/pid_max 是允许的最大 pid,因此这是可以在任何时刻运行的进程数的硬限制。但是,内存限制通常会在此之前发挥作用。
对于整机打开文件的上限,/proc/sys/fs/file-max为硬限制;这是基于机器中的内存量,因此会有所不同。内核将其设置为:
n = (mempages * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = max_t(unsigned long, n, NR_FILE);
Run Code Online (Sandbox Code Playgroud)
每 1 MB 的 RAM 大约为 100。
每个进程的限制是不同的。ulimit 将定义这些。
| 归档时间: |
|
| 查看次数: |
5903 次 |
| 最近记录: |