在Linux中监视文件访问

在Linux中监视文件访问

有没有办法收集有关磁盘上正在访问的块的统计信息?

我有一个场景,其中一项任务是内存和 I/O 密集型的,我需要找到一个很好的平衡点,即我可以为该进程分配多少可用 RAM,以及应该为系统留下多少用于为正在使用的块设备构建 I/O 缓存。

我怀疑当前发生的大多数 I/O 正在访问相当小的文件子集(或大文件的一部分),并且可以通过增加可用于 I/O 缓冲的 RAM 来优化性能。

理想情况下,我可以创建类似“热图”的东西来显示文件的哪些部分被访问得最多。

当前设置基于 AWS/EC2 m1.large 实例上的 CentOS 5。磁盘设置要么是 RAID0 设置 (LVM) 中的临时块设备,要么是单个 (500GB) EBS

更新:最初,这个问题是在谈论磁盘块,这很容易让人误解,因为我实际上感兴趣的是被访问的逻辑块,而不在乎它们在物理设备上的位置。我对此进行了更改,以明确表示这是我感兴趣的文件的一部分。对于造成的混淆,我深表歉意。

答案1

我不确定你是否完全理解现代缓冲区缓存的工作原理——你想限制你的进程使用的RAM量,你大概说对了一半(因此缓冲区缓存有“足够”的可用内存,但你的想法是错误的。

您所要求的对于调整缓冲区缓存来说并不是很有用——如果您有一个连续的磁盘(或一个显示为一个磁盘并表现为一个磁盘的阵列)并且正在考虑优化磁盘布局,那么它可能很有用,但这涉及到深度文件系统魔法。
您可以阅读 McKusick 关于文件系统设计的论文(或者花 42 分钟观看这个精彩的视频) 来了解文件系统如何尝试为您优化的基本概念 - 文件系统非常擅长正确获取磁盘布局。


在缓冲区缓存优化方面,您需要查看缓存命中数与缓存未命中数(以及导致未命中的具体原因)。磁盘上的物理位置并不重要 - 重要的是您必须命中磁盘多少次才能获得所需的内容,以及您的缓存是否足够大以至于不会不断搅动(本质上会抵消缓存效率)。

调整比其他任何事情都更需要反复试验——一个非常低效的经验法则是将最大文件/数据块大小的 2 倍留给缓冲区缓存,但你几乎总是最好从应用程序或缓存开始,然后进行调整以达到峰值性能。

答案2

如果您谈论的是服务器级系统,则还有其他变量需要考虑。我明白您的要求,但在现代系统中,这些东西已被多级缓存和智能 RAID 控制器的优化所抽象。

对于写入偏向活动,大部分随机写入工作负载应写入电池或闪存支持的非易失性缓存(以便快速确认写入),然后合并并按顺序刷新到磁盘。如果您不采用这样的做法,那么您的性能就会受到影响。

对于读取活动,操作系统的缓存工作做得还不错。拥有额外的控制器缓存会有所帮助。除此之外,您还可以使用一些技巧来帮助控制虚拟内存子系统。(请参阅:虚拟内存触摸器

另请参阅:清除/刷新缓存

但同样,我们需要您的设置的详细信息来帮助了解如何提供帮助。

答案3

我将投票给 DSTAT (http://dag.wieers.com/home-made/dstat/)。查看一些开关,如 top-io、top-latency、top-mem 等。它不会为你制作热图或显示正在访问磁盘的哪些部分,但它可能会帮助你指明正确的方向

答案4

使用iotop。这正是您所需要的。

相关内容