创建一个缓存文件,当libc(所有文件系统)或ext4中的分区快满时自动删除?
Posted
技术标签:
【中文标题】创建一个缓存文件,当libc(所有文件系统)或ext4中的分区快满时自动删除?【英文标题】:Create a cache file which is automatically deleted when partition is nearly full in libc (all file systems) or ext4? 【发布时间】:2017-07-23 20:19:10 【问题描述】:在编写需要在磁盘上缓存数据的软件时,libc中是否有方法,或者特定于某个文件系统(例如ext4)的方法,可以创建文件并将其标记为适合删除如果分区快满了,自动(由内核)?
内存页也有类似的东西:madvise(…, MADV_FREE)
。
一些系统通过编写一个监视分区填充度的守护程序来实现这一点,并且一旦超过某个填充级别,它就会手动删除某些预先确定的路径。如果可能的话,我想避免这种情况,因为它的可扩展性不是很好:每个应用程序都必须在创建新的缓存路径时通知守护进程,这可能很频繁。如果这是在内核中,则可以在每个 inode 上保存一个标志,指示它是否是缓存文件。
为此设置一个标准化的守护进程也是可以接受的。目前,不同的主要系统集成商似乎都在发明自己的产品。
【问题讨论】:
我不认为这存在。但是,是什么让您认为内核解决方案比用户空间守护程序具有更好的扩展性?当然,它可能会稍微快一些,但我不明白为什么它会缩放不同。如果您担心文件系统已满时发现为时已晚,请查看fanotify。 @Phillip:我认为在大多数系统上,fanotify
会产生比仅仅每 1 秒或其他时间轮询更多的 CPU 负载。除非你有很多独立的文件系统,它们大多是空闲的。我想您可以使用fanotify
,而无需真正遍历整个事件缓冲区。就像在不活动期间睡觉的一种方式。但我猜想在活动期间,即使您不查看数据,强制内核写入 fanotify 缓冲区也会产生非零开销。
我已经扩展了问题中“可扩展”的含义。
【参考方案1】:
您可以使用 crontab 作业,并查找特定的文件扩展名并将其删除。您甚至可以根据时间过滤并保留最近 n 分钟内创建的文件。 如果您对此感到满意,请告诉我,我将在此处添加更多详细信息。
【讨论】:
这是一个相当糟糕的解决方案,它需要定期轮询文件系统以查看它是否已满。这是在内核级别由文件系统变满触发的功能。以上是关于创建一个缓存文件,当libc(所有文件系统)或ext4中的分区快满时自动删除?的主要内容,如果未能解决你的问题,请参考以下文章