【发布时间】:2018-09-05 19:37:12
【问题描述】:
首先,一些鼓舞人心的背景信息:我有一个基于 C++ 的服务器进程,它在基于嵌入式 ARM/Linux 的计算机上运行。它工作得很好,但作为其操作的一部分,它创建了一个相当大的固定大小的数组(例如几十到几百兆字节)的临时/非持久状态信息,它当前保存在堆上,它访问和/或不时更新该数据。
我正在研究我可以把事情扩大到多远,我遇到的一个问题是最终(当我通过使服务器的配置越来越大来对服务器进行压力测试时),这个数据结构变得足够大导致内存不足的问题,然后OOM杀手出现,随之而来的是普遍的不满。请注意,Linux 的这种嵌入式配置没有启用交换,我无法(轻松)启用交换分区。
我对如何改善这个问题的一个想法是在计算机的本地闪存分区上分配这个大数组,而不是直接在 RAM 中,然后使用 mmap() 让它在服务器进程中看起来就像它仍然在内存。这将大大减少 RAM 的使用,我希望 Linux 的文件系统缓存能够掩盖大部分由此产生的性能成本。
我唯一真正关心的是文件管理——特别是,我想避免任何机会用“孤立”后备存储文件(即进程不再存在的旧文件,但该文件仍然存在,因为它的创建过程崩溃或由于其他错误忘记在退出时删除它)。我还希望能够在同一台计算机上同时运行服务器的多个实例,而不会相互干扰。
我的问题是,Linux 是否有任何内置工具来处理这种用例?我特别想像某种方式来标记文件(或 mmap() 句柄或类似的),以便当创建进程的文件退出或崩溃时,操作系统会自动删除文件(类似于 Linux 已经自动删除的方式)当进程退出或崩溃时,恢复进程分配的所有 RAM)。
或者,如果 Linux 没有任何内置的 auto-temp-file-cleanup 功能,是否存在人们使用的“最佳实践”来确保大型临时文件不会最终填满驱动器无意间变得执着?
请注意,AFAICT 只是将文件放在 /tmp 中对我没有帮助,因为 /tmp 使用的是 RAM 磁盘,因此与简单地分配进程内堆存储相比,不会给我任何 RAM 使用优势。
【问题讨论】:
-
如果你有文件存储,你可以使用交换文件而不是交换分区。
标签: c++ linux mmap temporary-files file-management