我需要做更多可预测的基准测试。如何清除Linux上的磁盘I/O缓存
回答
卸载和重新安装测试中的磁盘将重置所有高速缓存和缓冲区。
并非总是如此。例如:'mount/dev/sda1/mnt',现在看看那个打开'/ dev/sda'的分区(请注意丢失'1'),然后修改'/ mnt'下的文件。你可以看到这不会反映在'/ dev/sda'中,因为它使用了不同的缓存。 'umount/mnt'在这种情况下不起作用,因为它不会影响'/ dev/sda',即使它是物理上相同的驱动器。 – Tino 2013-08-16 10:23:18
你可以这样说:
# 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'blockdev'正是我所期待的。 – Tino 2013-08-16 10:41:36
'blockdev --flushbufs/dev/sda'适用于我的USB驱动器,但对SATA SSD驱动器无效。 'echo 3 | sudo tee/proc/sys/vm/drop_caches'适用于两个驱动器。 – 2014-08-16 01:02:34
最后一条命令将磁盘从内核中移除。您肯定无法在以后(或以任何方式使用磁盘)对磁盘进行基准测试,并且如果正在使用该磁盘,则很危险。没有理由将其与其他命令一起使用。以下是何时使用此命令及其功能的示例: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
磁盘缓存清除: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”,以确保释放所有缓存的对象。
短足够好的答案:(复制粘贴型)
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
:from 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。
现金
我基于现有的答案最好的部分写了这个答案。
- 1. 以编程方式清除Linux中安装的(SSD)磁盘上的缓存
- 2. 清除缓存后图像不会从磁盘上删除AFNetworking
- 3. 如何在React Native中清除图片的磁盘缓存
- 4. Linux磁盘清理
- 5. 如何清除保存从磁盘
- 6. 什么时候在iOS上清除磁盘缓存?
- 7. Linux的清除缓存
- 8. Symfony 3,linux:如何清除缓存?
- 9. PHP中磁盘缓存清除/大小限制的模式?
- 10. Cassandra磁盘io
- 11. 清除MKMapView的磁贴缓存?
- 12. 为什么不RemoveAllCacheResponses完全清除磁盘缓存?
- 13. 如何在C#中清空/刷新Windows READ磁盘缓存?
- 14. OpenSeaDragon清除磁贴高速缓存
- 15. Linux内核中磁盘文件的I/O缓冲区缓存
- 16. 清除MySQL磁盘空间
- 17. Linux上C++应用程序的磁盘IO分析器
- 18. 如何强制Windows清除所有磁盘读取缓存数据?
- 19. 如何清除MacOS上的CoreBluetooth缓存?
- 20. 如何清除mac上的phantomjs缓存?
- 21. 浏览器缓存或磁盘缓存?
- 22. 在磁盘上缓存位图Android
- 23. 如何在Linux上显示当前的磁盘IO队列长度?
- 24. SQLite的磁盘IO错误
- 25. Readyboost v磁盘缓存
- 26. 缓存磁盘操作
- 27. 毕加索磁盘缓存
- 28. NSMutableDictionary和缓存到磁盘
- 29. UIWebview缓存到磁盘
- 30. 缓存AlamofireImage响应磁盘
'同步'是不是在做? – imm 2012-03-04 02:36:06
'sync'正在冲洗,而不是清洗。 – Tino 2013-08-16 10:24:38