fwrite 消耗所有 MemFree,fflush 不工作?
fwrite consuming all MemFree, fflush not working?
我们有一个连接到非常快的 10TB raid 0 jbod 的数据捕获系统。
我们收到大约 1.25 GB/s 的 4 MiB 数据缓冲区,这些缓冲区被写入一个用 fopen 打开的顺序文件,分配 10 GiB,然后用 fwrite 写入。每 10 GiB 我们 fflush 然后 fallocate 得到另外 10 GiB。最后在使用 fclose 捕获完成后关闭它。
问题是,当捕获正在进行时,我们可以看到 /proc/meminfo MemFree 下降,而 Cached 上升 - 即 fflush 似乎什么都不做。这一直持续到我们在系统中有大约 200 MiB MemFree,现在数据速率变得非常尖锐,这导致我们的捕获失败。
我们希望在我们调用 fflush 时尖峰会落在 10 GiB 左右,但它似乎什么也没做。在我们调用 fclose 之前,文件不会被刷新。
这种行为有什么原因吗?使用 setvbuf(hFile, NULL, _IONBF, 0) 似乎也没有任何效果。
当您看到可用内存下降时,那是您 OS 写入其缓冲区缓存(本质上,所有可用内存)。此外,stdio 的 fwrite()
正在自行缓冲。因此,存在一些资源争用。当您的 OS 达到可用内存的上限时,这种资源争用会导致写入速度变慢和内存利用率高。瓶颈导致您错过数据捕获。
由于您正在管理自己的缓冲区,因此可以使用 write()
和 O_DIRECT
来避免所有这些缓冲。
我们有一个连接到非常快的 10TB raid 0 jbod 的数据捕获系统。
我们收到大约 1.25 GB/s 的 4 MiB 数据缓冲区,这些缓冲区被写入一个用 fopen 打开的顺序文件,分配 10 GiB,然后用 fwrite 写入。每 10 GiB 我们 fflush 然后 fallocate 得到另外 10 GiB。最后在使用 fclose 捕获完成后关闭它。
问题是,当捕获正在进行时,我们可以看到 /proc/meminfo MemFree 下降,而 Cached 上升 - 即 fflush 似乎什么都不做。这一直持续到我们在系统中有大约 200 MiB MemFree,现在数据速率变得非常尖锐,这导致我们的捕获失败。
我们希望在我们调用 fflush 时尖峰会落在 10 GiB 左右,但它似乎什么也没做。在我们调用 fclose 之前,文件不会被刷新。
这种行为有什么原因吗?使用 setvbuf(hFile, NULL, _IONBF, 0) 似乎也没有任何效果。
当您看到可用内存下降时,那是您 OS 写入其缓冲区缓存(本质上,所有可用内存)。此外,stdio 的 fwrite()
正在自行缓冲。因此,存在一些资源争用。当您的 OS 达到可用内存的上限时,这种资源争用会导致写入速度变慢和内存利用率高。瓶颈导致您错过数据捕获。
由于您正在管理自己的缓冲区,因此可以使用 write()
和 O_DIRECT
来避免所有这些缓冲。