如何在Linux上清除磁盘I/O缓存

taw*_*taw 51 linux io caching disk

我需要做更多可预测的基准测试.

Chr*_*ett 54

听起来你想要sync命令或sync()函数.

如果您想要磁盘缓存刷新: echo 3 | sudo tee /proc/sys/vm/drop_caches

  • `sync`是100%无关的.我说的是长寿命的多GB读取缓存,而不是"sync"处理的少量短期未写入数据(并且每隔10秒左右就会被写入磁盘). (11认同)
  • 实际上,即使你告诉操作系统删除缓存,硬盘驱动器也没有:)强制这种情况发生的唯一方法是关闭机器,发现这很难(在磁盘缓存上) (7认同)
  • 请考虑调换答案中的 2 句话。当我来到这个页面时,“drop_caaches”部分就是我想要的。 (3认同)

soc*_*air 37

你可以这样做:

# 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
Run Code Online (Sandbox Code Playgroud)

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

此外,可能需要使用hdparm关闭HDD缓存,不确定您的基准测试是什么.

无论如何,您无法阻止HDD缓存最近64/32/16 MB的最近使用的数据.为了杀死那个缓存,只需写入一些零(和刷新)+从HDD读取一些不相关的地方.这是必需的,因为高速缓存可以分为读取部分和写入部分.之后你可以对硬盘进行基准测试

  • `blockdev --flushbufs/dev/sda`适用于我的USB驱动器,但对SATA SSD驱动器没有影响.`echo 3 | sudo tee/proc/sys/vm/drop_caches`适用于两个驱动器. (3认同)
  • 最后一个命令从内核中删除磁盘.您肯定无法在磁盘之后(或以任何方式使用磁盘)对磁盘进行基准测试,如果磁盘正在使用中则很危险.没有理由将它与其他命令一起包含在内.以下是何时使用此命令及其作用的示例:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/removing_devices.html (3认同)
  • +1`blockdev`正是我想要的. (2认同)

Pio*_*icz 21

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

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

写入此内容将导致内核从内存中删除干净的缓存,dentries和inode,从而导致内存空闲.

要释放pagecache:

echo 1 > /proc/sys/vm/drop_caches

要释放dentries和inode:

echo 2 > /proc/sys/vm/drop_caches

要释放pagecache,dentries和inode:

echo 3 > /proc/sys/vm/drop_caches

由于这是非破坏性操作,并且脏对象不可用,因此用户应首先运行"sync"以确保释放所有缓存的对象.


nde*_*mou 9

简短的回答:(复制粘贴友好)

DISK=/dev/sdX # <===ADJUST THIS===
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

blockdev --flushbufs /dev/sda:从手册页:调用块设备ioctls [to]刷新缓冲区.

hdparm -F /dev/sda:从手册页:刷新驱动器上的写缓存缓冲区(较旧的驱动器可能无法实现此操作)

虽然blockdev和hdparm命令看起来类似于上面的答案,但它们向设备发出不同的ioctl.

很可能更好的方式:

(我假设您已经格式化了磁盘但是如果要直接写入磁盘,则可以调整这些命令)

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

MOUNT=/mnt/test # <===ADJUST THIS===
# create a file with psuedo-random data. We will read it
# to fill the read cache of the HDD with garbage
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16
Run Code Online (Sandbox Code Playgroud)

每次要清空缓存时都运行此命令:

DISK=/dev/sdX # <===ADJUST THIS===
MOUNT=/mnt/test # <===AND THIS===
# create a file with psuedo-random data to fill the write cache
# of the disk with garbage. Delete it afterwards it's not useful anymore
dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16
rm $MOUNT/temp-hddwrite.tmp
# see short good enough answer above
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
# read the file with pseudo-random data to fill any read-cache
# the disk may have with garbage
dd if=$MOUNT/temp-hddread.tmp of=/dev/null
Run Code Online (Sandbox Code Playgroud)

完成后运行此命令.

MOUNT=/mnt/test # <===ADJUST THIS===
# delete the temporary file with pseudo-random data
rm $MOUNT/temp-hddread.tmp
Run Code Online (Sandbox Code Playgroud)

说明:

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

积分

我根据现有答案的最佳部分写了这个答案.