代码之家  ›  专栏  ›  技术社区  ›  Jeremy Friesner

mmap()的Linux非持久性备份存储

  •  0
  • Jeremy Friesner  · 技术社区  · 7 年前

    首先,有一点激励性的背景信息:我有一个基于C++的服务器进程,它运行在一个嵌入式ARM/Linux的计算机上。它工作得很好,但作为其操作的一部分,它创建了一个相当大的固定大小的临时/非持久状态信息数组(例如,几十到几百兆字节),它当前将这些信息保存在堆中,并不时访问和/或更新这些数据。

    我正在调查我能将事情扩展到什么程度,我遇到的一个问题是,最终(当我通过使服务器的配置越来越大来对其进行压力测试时),这个数据结构变得足够大,导致内存不足问题,然后OOM杀手出现,然后普遍的不愉快随之而来。请注意,Linux的这种嵌入式配置没有启用交换,我不能(轻松地)启用交换分区。

    我唯一真正关心的是文件管理——特别是,我希望避免用“孤立”备份存储文件(即进程不再存在的旧文件,但文件仍然存在,因为其创建进程崩溃或由于其他错误而忘记在退出时删除它)填充闪存驱动器的任何机会。我还希望能够在同一台计算机上同时运行服务器的多个实例,而不使这些实例相互干扰。

    我的问题是,Linux是否有任何内置的it工具来处理这种用例?我特别想用某种方法来标记一个文件(或一个mmap()句柄或类似的),这样当创建进程的文件退出或崩溃时,操作系统会自动删除该文件(类似于Linux在进程退出或崩溃时自动恢复进程分配的所有RAM的方式)。

    或者,如果Linux没有任何内置的自动临时文件清理功能,是否有一个“最佳实践”,人们使用它来确保大型临时文件不会由于无意中变得持久而填满驱动器?

    请注意,AFAICT简单地将文件放在/tmp中对我没有帮助,因为/tmp使用的是RAM磁盘,因此与简单地分配进程内堆存储相比,它没有给我任何RAM使用优势。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Nemo    7 年前

    是的,我一直都这样。。。

    open unlink 它,使用 ftruncate posix_fallocate 要使其尺寸合适,请使用 mmap 具有 MAP_SHARED 把它映射到你的地址空间。那你就可以了 close 如果需要的话,可以立即使用描述符;内存映射本身将保留文件。

    为了提高速度,您可能需要帮助Linux管理其页面缓存。你可以用 posix_madvise 具有 POSIX_MADV_WILLNEED POSIX_MADV_DONTNEED 建议内核释放页面。

    您可能会发现last没有按您所希望的方式工作,特别是对于脏页。你可以用 sync_file_range 显式控制磁盘刷新。(尽管在这种情况下,您需要保持文件描述符处于打开状态。)

    同步\u文件\u范围 .

        2
  •  2
  •   nos    7 年前

    是的,您创建/打开了文件。那你呢 remove() 按文件名删除文件。

    我相信这个行为是由posix强制执行的,所以它可以在任何类似unix的系统上工作。即使在硬重启时,空间也会被回收。

        3
  •  1
  •   Dark Falcon    7 年前

    我相信这是特定于文件系统的,但是大多数Linux文件系统允许删除打开的文件。在关闭文件的最后一个句柄之前,该文件仍将存在。我建议您打开文件,然后立即删除它,当您的进程因任何原因退出时,它将自动被清除。

    欲知更多详情,请参阅以下帖子: What happens to an open file handle on Linux if the pointed file gets moved, delete

    推荐文章