【发布时间】:2020-09-21 13:05:24
【问题描述】:
我正在从用户模式应用程序将一个大文件写入磁盘。与此同时,我正在编写一个或多个较小的文件。大文件不会很快被读回,但小文件可能会。我有足够的 RAM 用于应用程序 + 较小的文件,但对于大文件来说不够用。我可以告诉操作系统在将大文件的一部分写入磁盘后不要将它们保留在缓存中,以便为较小的文件提供更多缓存吗?我仍然希望对大文件的写入足够快。
【问题讨论】:
我正在从用户模式应用程序将一个大文件写入磁盘。与此同时,我正在编写一个或多个较小的文件。大文件不会很快被读回,但小文件可能会。我有足够的 RAM 用于应用程序 + 较小的文件,但对于大文件来说不够用。我可以告诉操作系统在将大文件的一部分写入磁盘后不要将它们保留在缓存中,以便为较小的文件提供更多缓存吗?我仍然希望对大文件的写入足够快。
【问题讨论】:
我可以告诉操作系统不要将部分大文件保存在缓存中吗?
是的,您可能想要使用一些系统调用,例如 posix_fadvise(2) 或 madvise(2)。在奇怪的情况下,您可能会使用readahead(2) 或userfaultfd(2) 或Linux 特定的标志mmap(2)。或者非常巧妙地处理SIGSEGV(参见signal(7)、signal-safety(7) 和eventfd(2) 和signalfd(2))你需要编写你的C 程序来做到这一点。
但我不确定这是否值得您的开发努力。在许多情况下,最近的Linux 内核的行为足够好。
很多人都想阅读GC handbook。这与您的担忧有关
考虑研究现有open-source软件如GCC、Qt、RefPerSys、PostGreSQL、GNU Bash等的源代码...
我猜/etc/fstab 文件中的mount(2) 选项(请参阅fstab(5)...)实际上更重要。或者更改或调整您的文件系统(例如ext4(5)、xfs(5)..)。或者read(2)-ing 大块(1Mbytes)。
大多数应用程序不受磁盘限制,对于那些受磁盘限制的应用程序,租用更多磁盘空间比添加和调试额外代码更便宜。
PS。不要忘记您的开发人员成本。它们通常比 RAM 模块(或更快的 SSD 磁盘)的价格高很多。
【讨论】: