mik*_*erv 16 linux filesystems memory shared-memory tmpfs
我最近对各种基于 Linux 内核内存的文件系统很好奇。
Note:就我而言,与更好地理解标题中提出的问题相比,以下问题或多或少应该被视为可选问题。我在下面问他们,因为我相信回答他们可以更好地帮助我理解差异,但由于我的理解是有限的,因此其他人可能更了解。我准备接受任何可以丰富我对标题中提到的三个文件系统之间差异的理解的答案。
最终,我想我想挂载一个可用的文件系统,hugepages,尽管一些轻量的研究(以及更轻量的修补)让我相信 arewritable hugepage mount不是一种选择。我错了吗?这里的机制是什么?
还有关于 hugepages:
uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux
tail -n8 /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8223772 kB
DirectMap2M: 16924672 kB
DirectMap1G: 2097152 kB
Run Code Online (Sandbox Code Playgroud)
(这里是/proc/meminfo和/proc/cpuinfo的全文版本)
以上是怎么回事?难道我已经分配hugepages?有之间的差异DirectMap内存页面和hugepages?
更新在@Gilles 的推动下,我在上面又添加了 4 行,似乎必须有所不同,尽管我DirectMap在tail昨天拉之前从未听说过......也许DMI还是什么?
只是多一点...
hugepages努力失败,并假设任何图像文件的硬盘备份,挂载循环的风险tmpfs?是swapped什么?我的文件系统是最坏的情况吗?我知道tmpfs是挂载的文件系统缓存 - 我挂载的循环文件会被压出内存吗?我是否可以采取缓解措施来避免这种情况?
最后 - 到底是什么shm,?它是如何从不同或者包括两种hugepages或tmpfs?
eyo*_*100 13
tmpfs 和 shm 之间没有区别。tmpfs 是 shm 的新名称。shm 代表共享内存。
请参阅:Linux tmpfs。
今天甚至使用 tmpfs 的主要原因是我的 gentoo 框上的 /etc/fstab 中的这个注释。BTW Chromium 不会在缺少该行的情况下构建:
# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
# POSIX shared memory (shm_open, shm_unlink).
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0
Run Code Online (Sandbox Code Playgroud)
引用:
tmpfs 有以下用途:
1) 总是有一个内核内部安装,您根本看不到
。这用于共享匿名映射和 SYSV 共享
内存。此挂载不依赖于 CONFIG_TMPFS。如果未设置 CONFIG_TMPFS,则不会构建 tmpfs 的用户可见部分。但内部
机制始终存在。2) glibc 2.2 及更高版本期望 tmpfs 安装在 /dev/shm 以用于
POSIX 共享内存(shm_open、shm_unlink)。将以
下行添加到 /etc/fstab 应该解决这个问题:tmpfs /dev/shm tmpfs 默认值 0 0
如有必要,请记住创建您打算安装 tmpfs 的目录。
是该安装不需要SYSV共享存储器。内部
安装用于此目的。(2.3内核版本
需要挂载tmpfs的前身(shm fs)才能使用SYSV
共享内存)3) 有些人(包括我)发现挂载它非常方便,
例如 /tmp 和 /var/tmp 并且有一个大的交换分区。现在
循环挂载 tmpfs 文件确实可以工作,因此大多数
发行版提供的mkinitrd应该可以通过 tmpfs /tmp 成功。4) 可能还有更多我不知道的 :-)
tmpfs 具有三个用于调整大小的安装选项:
大小: 为此 tmpfs 实例分配的字节数限制。默认值为没有交换的物理 RAM 的一半。如果您的 tmpfs 实例过大,机器将死锁,因为 OOM 处理程序将无法释放该内存。
nr_blocks:与size相同,但以PAGE_CACHE_SIZE的块为单位。
nr_inodes:此实例的最大 inode 数。默认值是物理 RAM 页数的一半,或(在具有 highmem 的机器上)lowmem RAM 页数,以较低者为准。
来自透明的 Hugepage 内核文档:
如果与hugetlbfs 的保留方法相比,透明大页支持通过允许所有未使用的内存用作缓存或其他可移动(甚至不可移动实体),最大限度地提高了空闲内存的实用性。它不需要保留来防止用户空间注意到大页面分配失败。它允许在大页面上使用分页和所有其他高级 VM 功能。应用程序无需修改即可利用它。
但是,可以进一步优化应用程序以利用此功能,例如,它们之前已经过优化,以避免对每个 malloc(4k) 进行大量 mmap 系统调用。到目前为止,优化用户空间并不是强制性的,即使对于处理大量内存的大页面不知道的应用程序,khugepaged 已经可以处理长期页面分配。
做一些计算后的新评论:
HugePage 大小:2MB 使用的
HugePages:无/关闭,由全 0 证明,但根据上面的 2Mb 启用。
DirectMap4k:8.03Gb
DirectMap2M:16.5Gb
DirectMap1G:2Gb
使用上面关于 THS 优化的段落,看起来您的 8Gb 内存正在被使用 4k 的 mallocs 操作的应用程序使用,使用 2M 的 mallocs 的应用程序已请求使用 16.5Gb。使用 2M 的 malloc 的应用程序通过将 2M 部分卸载到内核来模仿 HugePage 支持。这是首选方法,因为一旦内核释放了 malloc,内存就会释放给系统,而使用大页面挂载 tmpfs 不会导致完全清理,直到系统重新启动。最后,最简单的一个,你有 2 个程序打开/运行,请求 1Gb 的 malloc
对于那些不知道 malloc 是 C 中代表内存分配的标准结构的读者。这些计算证明了 DirectMapping 和 THS 之间的 OP 相关性可能是正确的。另请注意,安装 HUGEPAGE ONLY fs 只会导致增量为 2MB,而让系统使用 THS 管理内存主要发生在 4k 块中,这意味着在内存管理方面,每个 malloc 调用都会为系统节省 2044k(2048 - 4 ) 供其他一些进程使用。