如何清除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。