创build未刷新的文件输出缓冲区

我正在尝试清除在Linux上运行的几种程序中使用不同语言的未刷新文件I / O缓冲区时出现的问题。 冲洗缓冲区的解决scheme是很容易的,但这个无刷新缓冲区的问题发生得非常随机。 我不想就可能导致的原因寻求帮助,而是关心如何创造(复制)和诊断这种情况。

这导致了一个由两部分组成的问题:

  1. 人为地和容易地构build一个例子,在给定的时间内,可以有已知的输出缓冲区不被刷新的情况是否可行? 我的search是空的。 一个微不足道的基准就是在尝试从另一个进程写入大量数据的同时,在一个进程中锤击硬盘(例如交换)。 虽然这个“有效”,但它使系统实际上无法使用:我不能戳,看看发生了什么事。

  2. Linux内部是否有可以识别给定进程已经清除文件输出缓冲区的命令? 这是可以在命令行运行的东西,还是有必要直接查询内核? 我一直在看fsyncsyncioctlflushbdflush等等。 但是,缺乏创build未刷新缓冲区的方法,目前还不清楚这些可能会显示什么。

为了复制他人,C中的#1例子将是非常好的,但问题是真正的语言不可知论 – 只要知道创build这种情况的方法将有助于我正在工作的其他语言。


更新1:我对任何混淆道歉。 正如有几个人指出的,缓冲区可以在内核空间或用户空间中。 这有助于查明问题:我们正在创build大的脏内核缓冲区。 这个区别和答案完全解决了#1:现在似乎很清楚如何在用户空间或内核空间中重新创build未刷新的缓冲区。 但是,识别哪个进程ID具有脏内核缓冲区还不清楚。

Solutions Collecting From Web of "创build未刷新的文件输出缓冲区"

如果您对内核缓冲的数据感兴趣,则可以通过/proc/sys/vm/dirty_*调整VM回写。 具体来说, dirty_expire_centisecs是百分之一秒的时间,在这个时间脏数据有资格回写。 增加这个值会给你一个更大的时间来做你的调查。 您还可以增加dirty_ratiodirty_background_ratio (这是系统内存的百分比,分别定义同步和异步写回开始点)。

实际上,创建脏页面很简单 – 只需write(2)文件write(2)文件并退出而不同步,或者在文件的MAP_SHARED映射中将一些页面弄脏。

一个简单的程序,将有一个未刷新的缓冲区将是:

 main() { printf("moo"); pause(); } 

Stdio默认情况下只有在连接到终端时才刷新换行符上的stdout。

通过控制接收端非常容易导致无刷缓冲区。 * nix系统的美妙之处在于,一切都看起来像一个文件,所以你可以使用特殊的文件来做你想做的事情。 最简单的选择是一个管道。 如果你只是想控制标准输出,这是简单的选项: unflushed_program | slow_consumer unflushed_program | slow_consumer 。 否则,您可以使用命名管道:

 mkfifo pipe_file unflushed_program --output pipe_file slow_consumer --input pipe_file 

slow_consumer最有可能是您设计的缓慢读取数据的程序,或者只读取X字节并停止。