到目前为止,我的理解是有
>应用程序缓冲区(包括libc分配的fread / fwrite缓冲区)
>读取和写入操作的VFS缓冲区
> mmaped页面(与VFS缓冲区相同?)
>特定于文件系统的缓冲区(与VFS缓冲区相同?文件系统至少提供一些策略,例如XFS对写缓存更积极)
>在转换为SCSI / ATA命令并传递给…之前,磁盘驱动程序可能有一些缓冲区.
>磁盘控制器可以具有易失性,电池备份或无缓存.刷新易失性缓存的机制是什么?障碍如何影响?
>磁盘本身可以有一些缓存,与控制器具有相同的刷新问题.
显然这是一个相当混乱的帐户,但希望它显示我正在寻找的那种信息.我发现Linux内部文档相当稀疏;也许有一本好书涵盖了这一切?讨论缓冲区复制与传输的位置也很不错.
解决方法
在给出具有单一目的的问题的情况下,您可以使用的另一种方法是将可疑活动跟踪到内核中,并了解它所触及的各个部分,而不是仅仅尝试理解它.幸运的是,有一个名为ftrace甚至SystemTap(stap)的命令可以让你开始冒险.许多内核开发人员希望更多人提出有关其内核的重要问题,这些工具将帮助他们完成. Linux Weekly News最近发表了几篇关于ftrace的文章:Tracing: no shortage of options(2008年7月),A Look at ftrace(2009年3月),使用ftrace调试内核 – Part 1(2009年12月)和Part 2(2009年12月),Secrets of the Ftrace function(2010年1月),最后是好老documentation that ships with the kernel(2008).
通过使用跟踪实用程序,您可以了解内核如何进行缓冲以及内核,硬件(控制器,芯片组,cpu,磁盘技术),文件系统,IO调度程序所特有的许多其他功能.在这方面,每个分布都不同.如果您有复杂的存储设备(群集FS,带有企业阵列的SAN,SSD),那么请准备好让您亲自了解他们的怪癖.关于集群文件系统的一个警告:它们经常涉及一个用户空间组件,它可能导致我们大多数人归因于内核的大量意外延迟,但要复杂得多.
到目前为止,迄今为止我能找到的最好的文字是由Neil Brown在2009年撰写的题为“Linux kernel design patterns”的文章.尼尔打了你提出的很多话题,还有更多.
我确切知道的一件事是,这种情况在不断变化,特别是在调度领域.只是试着了解你特定角落里发生了什么,并计算你没有必要编码给其中一个组件的祝福.