在编写高带宽数据流时,如何最好地管理Linux的缓冲行为?

Jer*_*ner 8 c c++ linux streaming caching

我的问题是:我有一个在Linux下运行的C/C++应用程序,这个应用程序接收一个恒定速率的高带宽(约27MB /秒)数据流,它需要流式传输到一个或多个文件.它运行的计算机是运行Linux的四核2GHz Xeon.文件系统是ext4,磁盘是固态E-SATA驱动器,为此目的应该足够快.

问题是Linux过于聪明的缓冲行为.具体来说,不是立即将数据写入磁盘,或者在我调用write()之后不久,Linux会将"写入"数据存储在RAM中,然后在稍后的某个时间(我怀疑当2GB的RAM开始变满时)它会突然尝试同时向磁盘写出几百兆的缓存数据.问题是这个缓存刷新很大,并且在很长一段时间内阻止了数据采集代码,导致一些当前的输入数据丢失.

我的问题是:有没有合理的方法来"调整"Linux的缓存行为,因此要么根本不缓存传出数据,要么它必须缓存,它一次只缓存一个较小的数量,从而平滑驱动器的带宽使用情况和提高代码的性能?

我知道O_DIRECT,并将使用我必须的,但它确实对程序施加了一些行为限制(例如缓冲区必须对齐并且是磁盘扇区大小的倍数等),我宁愿避免,如果我能够.

Has*_*kun 7

您可以使用posix_fadvise()带有POSIX_FADV_DONTNEED建议(可能与调用相结合fdatasync())使系统刷新数据并从缓存中逐出.

有关实际示例,请参阅此文章.