Redhat 7.1 内核进程堆栈大小从 8K 到 16KB

Redhat 7.1 kernel process stack size from 8K to 16KB

阅读 Redhat 7.1 的发行说明,我读到:

Process Stack Size Increased from 8KB to 16KB
Since Red Hat Enterprise Linux 7.1, the kernel process stack size has been increased from 8KB to 16KB to help large processes that use stack space.

我知道内核进程堆栈是常驻内存,并且在创建进程时进行分配并且内存需要是连续的,在 x86_64 页面大小为 4096 字节的情况下,内核将需要找到4 页,其中 2 页用于进程堆栈。

当内核内存碎片化时,此功能会成为问题吗? 使用一个进程内核堆栈大小,当内存碎片化时,是否更容易在创建进程时出现问题?

是的。

当内存碎片化时,查找堆栈 space 可能是个问题。

内核经常需要分配一组物理上连续的页面。这在分配缓冲区(驱动程序需要进行数据传输,例如 DMA)或创建进程堆栈时可能是必需的。

通常,为了满足此类要求,内核会尝试通过分配物理上连续的页面来避免碎片,另外释放的页面 merged/grouped 到更大的物理上连续的页面组(如果可用)。这是由内存管理子系统和伙伴分配器处理的。现在,当程序开始执行时创建堆栈(RHEL7 中的 8k16k)。

如果内核无法获取或分配一组请求的物理连续页面(假定 4k 页面大小,8k 堆栈为 2 个或 16k 堆栈为 4 个),那么这可能会导致 page allocation failures, order:2。 (即 2^2=4 页 * 4K)。顺序取决于您请求的物理连续页面的大小。我们可以观察到 /proc/buddyinfo 文件在发生页面分配失败的时候,它可能显示出物理内存被碎片化的迹象。