ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-12-08 03:02:29  阅读:212  来源: 互联网

标签:file-io c-3 linux language-agnostic


我正在尝试解决在Linux上运行的几种程序中使用不同语言的未刷新文件I / O缓冲区引起的问题.刷新缓冲区的解决方案很容易,但是未刷新缓冲区的问题相当随机地发生.我对寻找可能造成这种情况的方式感兴趣,而不是寻求帮助,而是对如何创建(再现)并诊断这种情况感兴趣.

这导致一个分为两部分的问题:

>人为且容易地构造实例,在给定的时间段内,人们可以拥有已知的输出缓冲区是不可行的,这是否可行?我的搜索显示为空.一个简单的基准是在尝试从另一个进程写入大量数据的同时,在一个进程中锤击硬盘驱动器(例如,交换).尽管这种“有效”,但实际上使该系统无法使用:我无法四处查看情况.
> Linux中是否有命令可以识别给定进程未清除文件输出缓冲区的命令?这是可以在命令行上运行的东西,还是必须直接查询内核?我一直在看fsync,sync,ioctl,flush,bdflush等.但是,由于缺少创建未刷新缓冲区的方法,因此尚不清楚这些缓冲区可能揭示什么.

为了让其他人重现,最好使用C语言中的#1示例,但是问题实际上是与语言无关的-仅知道一种创建这种情况的方法将对我正在使用的其他语言有所帮助.

更新1:对于任何混乱,我深表歉意.正如一些人指出的那样,缓冲区可以位于内核空间或用户空间中.这有助于找出问题所在:我们正在创建较大的脏内核缓冲区.这种区别和答案完全解决了第一点:现在看来,如何在用户空间或内核空间中重新创建未刷新的缓冲区似乎很清楚.但是,尚不清楚识别哪个进程ID的内核缓冲区脏了.

解决方法:

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

实际上创建脏页面很容易-只需将(2)写入文件并退出而不进行同步,或者在文件的MAP_SHARED映射中脏掉某些页面.

标签:file-io,c-3,linux,language-agnostic
来源: https://codeday.me/bug/20191208/2088347.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有