如何清除Linux上的磁盘I / Ocaching

我需要做更多可预测的基准testing。

听起来就像你想要的同步命令,或sync()函数。

如果你想磁盘caching刷新: echo 3 | sudo tee /proc/sys/vm/drop_caches echo 3 | sudo tee /proc/sys/vm/drop_caches

你可以这样做:

 # sync # (move data, modified through FS -> HDD cache) + flush HDD cache # echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt) # blockdev --flushbufs /dev/sda # hdparm -F /dev/sda # NEXT COMMAND IS NOT FOR BENCHMARKING: # should be run before unplug, flushes everything possible guaranteed. # echo 1 > /sys/block/sdX/device/delete 

您可以使用strace来查看这些是三个不同的系统调用

此外,可能需要使用hdparmclosures硬盘caching,不知道你做了哪些基准testing。

无论如何,你不能阻止硬盘caching最近使用的64/32/16 MB的数据。 为了杀死caching,只需写入一些零(和刷新)+从硬盘读取一些无关的地方。 这是必需的,因为caching可以分为读部分和写部分。 之后,你可以testing硬盘。

磁盘caching清除: echo 3 | sudo tee /proc/sys/vm/drop_caches echo 3 | sudo tee /proc/sys/vm/drop_caches

命令文档: https : //www.kernel.org/doc/Documentation/sysctl/vm.txt

写入这将导致内核从内存中删除干净的caching,dentries和inode,导致内存变得空闲。

释放页面caching:

echo 1 > /proc/sys/vm/drop_caches

释放dentries和inode:

echo 2 > /proc/sys/vm/drop_caches

要释放页面caching,dentries和inode:

echo 3 > /proc/sys/vm/drop_caches

由于这是一个非破坏性的操作,脏对象不可用,用户应该首先运行“同步”,以确保所有caching的对象被释放。

短小够好回答:(复制粘贴友善)

 DISK=/dev/sdX # <===ADJUST THIS=== sync echo 3 > /proc/sys/vm/drop_caches blockdev --flushbufs $DISK hdparm -F $DISK 

说明:

sync :从手册页: 刷新文件系统缓冲区。 强制更改块到磁盘,更新超级块。

echo 3 > /proc/sys/vm/drop_cache : 从内核文档, 这将导致内核删除干净的caching

blockdev --flushbufs /dev/sda :从手册页: 调用块设备ioctls [to] flush buffers。

hdparm -F /dev/sda :从手册页: 刷新驱动器上的写入caching缓冲区(旧的驱动器可能不会实现这一点)

尽pipe根据上面的答案, blockdev和hdparm命令看起来相似,但是它们向设备发出不同的ioctl。

长可能更好的方法:

(我假设你已经格式化了磁盘,但是如果你想直接写入磁盘,你可以修改这些命令)

在第一个基准testing之前只运行一次:

 MOUNT=/mnt/test # <===ADJUST THIS=== dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16 

每次你想清空caching时运行这个:

 DISK=/dev/sdX # <===ADJUST THIS=== MOUNT=/mnt/test # <===AND THIS=== dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16 rm $MOUNT/temp-hddwrite.tmp sync echo 3 > /proc/sys/vm/drop_caches blockdev --flushbufs $DISK hdparm -F $DISK dd if=$MOUNT/temp-hddread.tmp of=/dev/null 

完成后运行。

 MOUNT=/mnt/test # <===ADJUST THIS=== rm $MOUNT/temp-hddread.tmp 

说明:

硬盘可能有H / Wcaching,不会被上述命令清除。 我正在写和读取伪随机数据跳跃,以填补垃圾。 有多less数据取决于硬盘caching的大小。 我正在使用/ dev / urandom,因为它很快,我们不关心真正的随机性。 我从一开始就创build了/mnt/test/temp-hddread.tmp,每次我想要读取足够多的随机数据时就使用它。 我每次创build和删除/mnt/test/temp-hddwrite.tmp都要写足够的随机数据。

积分

我已经写了这个答案根据现有答案的最好的部分。

卸下并重新安装待testing的磁盘将重置所有caching和caching。