gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:10:56 25 4
gpt4 key购买 nike

我正在尝试解决在 Linux 上运行的几个不同语言的程序中未刷新的文件 I/O 缓冲区出现的问题。刷新缓冲区的解决方案很简单,但是未刷新缓冲区的问题是随机发生的。我对如何创建(重现)和诊断这种情况感兴趣,而不是就可能导致它的原因寻求帮助。

这引出了一个由两部分组成的问题:

  1. 是否可以人为地轻松构建实例,在这些实例中,在给定的时间段内,可以拥有已知未刷新的输出缓冲区?我的搜索结果是空的。一个简单的基准是在一个进程中敲击硬盘驱动器(例如交换),同时尝试从另一个进程写入大量数据。虽然这“有效”,但它使系统实际上无法使用:我无法四处看看发生了什么。

  2. Linux 中是否有命令可以识别给定进程具有未刷新的文件输出缓冲区?这是可以在命令行运行的东西,还是需要直接查询内核?我一直在看fsync, sync, ioctl, flush, bdflush,和别的。但是,由于缺乏创建未刷新缓冲区的方法,因此不清楚这些可能会揭示什么。

为了为其他人重现,C 语言中#1 的示例会非常好,但这个问题确实与语言无关——只知道创建这种情况的方法会对我正在使用的其他语言有所帮助。


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

最佳答案

如果您对内核缓冲数据感兴趣,那么您可以通过 /proc/sys/vm/dirty_* 中的 sysctls 调整 VM 写回。特别是,dirty_expire_centisecs 是脏数据有资格进行写回的时间,以百分之一秒为单位。增加此值将为您提供更大的时间窗口来进行调查。您还可以增加 dirty_ratiodirty_background_ratio(它们是系统内存的百分比,分别定义同步和异步写回的开始点)。

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

关于创建未刷新的文件输出缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com