2012-03-04 166 views

回答

39

听起来像是想要sync命令或sync()函数。

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

+6

'sync'与100%无关。我正在谈论长寿命的多GB读取缓存,而不是少量的“同步”处理的短暂未写入数据(无论如何,它会每隔10秒钟写入磁盘)。 – taw 2012-03-04 02:41:06

+7

你在说磁盘缓存吗?试试'echo 3 | sudo tee/proc/sys/vm/drop_caches' – 2012-03-04 02:43:23

+0

我接受你的评论,但那是不可能的。 – taw 2012-03-04 03:16:25

1

卸载和重新安装测试中的磁盘将重置所有高速缓存和缓冲区。

+2

并非总是如此。例如:'mount/dev/sda1/mnt',现在看看那个打开'/ dev/sda'的分区(请注意丢失'1'),然后修改'/ mnt'下的文件。你可以看到这不会反映在'/ dev/sda'中,因为它使用了不同的缓存。 'umount/mnt'在这种情况下不起作用,因为它不会影响'/ dev/sda',即使它是物理上相同的驱动器。 – Tino 2013-08-16 10:23:18

23

你可以这样说:

# 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的看到,这三种不同的系统调用

此外,可能需要使用hdparm的关闭硬盘缓存,不知道你做了什么基准测试。

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

+1

+1'blockdev'正是我所期待的。 – Tino 2013-08-16 10:41:36

+3

'blockdev --flushbufs/dev/sda'适用于我的USB驱动器,但对SATA SSD驱动器无效。 'echo 3 | sudo tee/proc/sys/vm/drop_caches'适用于两个驱动器。 – 2014-08-16 01:02:34

+0

最后一条命令将磁盘从内核中移除。您肯定无法在以后(或以任何方式使用磁盘)对磁盘进行基准测试,并且如果正在使用该磁盘,则很危险。没有理由将其与其他命令一起使用。以下是何时使用此命令及其功能的示例:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/removing_devices.html – ndemou 2017-05-30 14:50:24

17

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

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

写这将导致内核从内存降干净高速缓存,目录项和inode,从而引起该内存成为自由。

要释放页缓存:

echo 1 > /proc/sys/vm/drop_caches

要免费目录项和inode:

echo 2 > /proc/sys/vm/drop_caches

要免费页缓存,目录项和inode:

echo 3 > /proc/sys/vm/drop_caches

由于这是一个非破坏性操作,并且脏对象不可释放,所以用户应该先运行“sync”,以确保释放所有缓存的对象。

3

短足够好的答案:(复制粘贴型)

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_cachefrom the kernel docs这将导致内核缓存清理

blockdev --flushbufs /dev/sda下降:从该名男子页:调用区块设备控制程序[于]刷新缓冲区。

hdparm -F /dev/sda:从该名男子页:冲洗的驱动器写入高速缓存缓冲区(较老的驱动器可能无法实现这一点)

虽然blockdev和hdparm的命令看起来根据an answer above相似,它们发出不同的ioctl来装置。

龙可能是更好的办法:

(我会假设你已经格式化的磁盘,但如果你想直接写入到磁盘可以适应这些命令)这一次

运行前一日基准:

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

运行这个每次要清空缓存:

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 

说明:

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

现金

我基于现有的答案最好的部分写了这个答案。