我们有一个数据捕获系统连接到一个非常快速的10TB raid 0 jbod。
我们收到大约1.25 GB / s的4个MiB数据缓冲区,这些缓冲区被写入一个顺序文件,该文件用fopen打开,10 GiB是fallocate,并用fwrite写入。每10个GiB我们fflush然后fallocate再获得10 GiB。最后,在使用fclose完成捕获后,它已关闭。
问题是当捕获正在进行时,我们可以看到/ proc / meminfo MemFree掉线,并且缓存射击 - 即fflush似乎什么都不做。这一过程一直持续到我们在系统中有大约200 MiB MemFree,现在数据速率变得非常小,导致我们的捕获失败。
当我们打电话给fflush时,我们希望尖峰会落在10 GiB附近,但它似乎没有做任何事情。在我们调用fclose之前,文件不会被刷新。
出现这种行为的原因是什么?使用setvbuf(hFile,NULL,_IONBF,0)似乎也没有任何效果。
答案 0 :(得分:2)
当您看到空闲内存丢失时,您的操作系统会写入其缓冲区缓存(基本上是所有可用内存)。此外,stdio的fwrite()
正在自行缓冲。因此,存在一些资源争用。当您的操作系统达到可用内存的上限时,此资源争用会导致写入速度变慢和内存利用率过高。瓶颈会导致您错过数据捕获。
由于您正在管理自己的缓冲区,因此可以将write()
与O_DIRECT
一起使用以避免所有这些缓冲。