有没有办法收集有关磁盘上正在访问的块的统计信息?
我有一个场景,其中一项任务是内存和 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
答案3
我将投票给 DSTAT (http://dag.wieers.com/home-made/dstat/)。查看一些开关,如 top-io、top-latency、top-mem 等。它不会为你制作热图或显示正在访问磁盘的哪些部分,但它可能会帮助你指明正确的方向
答案4
使用iotop。这正是您所需要的。