linux – 如何估计文件系统中的搜索速度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 如何估计文件系统中的搜索速度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3753字,纯文字阅读大概需要6分钟。
内容图文
![linux – 如何估计文件系统中的搜索速度](/upload/InfoBanner/zyjiaocheng/956/c6a046dadd8b43608f12e3ec3f5022a6.jpg)
假设使用ext4文件系统,1TB SSD上有一个大文件(以500MB /秒的速度读写).此文件的大小接近1TB.如何估计fseek()到文件中间的速度.它需要几秒或几毫秒?谢谢.
解决方法:
为了估计fseek的延迟,我们应该将其分为两部分:软件工作和硬件寻道时间延迟.软件工作是ext4文件系统的实现(FS,在Linux中这是内核的VFS子系统),它将为硬件块存储设备生成几个“随机”请求(I / O操作).硬件将使用一些时间来处理每个随机请求.
经典的UNIX文件系统(UFS / FFS)和linux文件系统,在它们之后设计,使用超级块来描述磁盘上的fs,将文件存储为inode(在已知位置存在inode数组),并以固定大小的块存储文件数据(在Linux中高达4KB).要从文件名OS中查找inode必须读取超级块,找到路径中的每个目录,从目录中读取数据以查找该文件具有的inode编号(ls -i将显示当前dir的inode).然后,使用来自超级块OS的数据可以计算inode存储的位置并读取inode.
Inode包含文件数据块列表,通常是树状结构,请检查https://en.wikipedia.org/wiki/Inode_pointer_structure或http://e2fsprogs.sourceforge.net/ext2intro.html
文件的第一部分,几十KB存储在块中,直接列在inode中(直接块; ext2 / 3/4中的12).对于较大的文件,inode具有指向具有文件块列表的一个块的指针(间接寻址的块).如果file较大,则使用inode中的下一个指针来描述“双间接块”.它指向枚举其他块的块,每个块包含指向具有实际数据的块的指针.有时需要三重间接块指针.这些树相当有效,在每个级别都有~512度(4KB块,每个指针8个字节).因此,要从文件中间访问数据,ext2 / 3/4可能会生成多达4-5个低级I / O请求(超级块缓存在RAM中,inode也可能被缓存).这些请求不会在地址中产生,因此它们几乎是随机寻找块设备.
linux FS(ext4,XFS)的现代变体对巨大的文件存储进行了优化,称为extent(https://en.wikipedia.org/wiki/Extent_(file_systems)).范围允许FS将文件放置描述为块列表,而不是文件片段/指针对的数组(start_block,number_of_consequent_blocks).每个片段可能来自MB的一部分,最大为128 MB. 4个第一个扩展区存储在inode中,更多扩展区再次存储为树状结构.因此,对于扩展区,您可能需要2-4个随机I / O操作来访问文件的中间部分.
HDD对随机请求的访问时间较慢,因为它们应该物理地将标题移动到正确的圆形轨道(并且正好在轨道上定位标题;这需要一些旋转部分,如1/8或1/16要完成)然后等待最多1个旋转(旋转)的磁盘(盘片)以获得所需的磁道部分. HDD的典型旋转速度为5400和7200 rpm(revolutions per minute,90 rps和120 rps)或高速企业HDD – 10000 rpm和15 rpm(160 rps和250 rps).因此,从磁盘随机位置获取数据所需的平均时间约为0.7-1转,对于典型的7200转/分钟(120rps),它约为1/120秒= 8毫秒(毫秒)= 0.008秒.需要8ms来获取每个随机请求的数据,并且在您的情况下有多达4-5个随机请求,因此对于HDD,您可能期望在文件中搜索最多接近40毫秒的时间. (首先寻求将花费更多,下一次搜索可能会更便宜,因为块指针树的某些部分被OS缓存;寻找几个下一个块非常便宜,因为linux可以在第一次搜索被请求后读取它们).
SSD没有旋转或移动部件,SSD上的任何请求都以相同的方式处理. SSD控制器使用自己的转换表将请求的块ID解析为内部nand芯片块id,然后读取实际数据.从NAND读取数据将检查纠错码,有时需要几次内部重读才能正确读取块.在更便宜的NAND类型中读取速度更慢 – 每个单元中存储3位数据的TLC – 8个级别; MLC速度更快 – 具有4个级别的2位数据;在不存在的SLC SSD中速度非常快,只有1位且只有2个级别.在磨损的SSD中或在固件中有错误(错误的电池电荷退化模型)的SSD中读取速度也较慢.
SSD中这种随机访问的速度非常高,它们通常被宣称为SSD规格,如50000 – 100000 IOPS(I/O operations per second,通常为4KB).可以针对更深的队列声明高IOPS计数,因此SSD(具有QD1)的实际平均随机读取延迟为每个请求200-300 microseconds(0.2-0.3ms;在2014;部分延迟是SATA / SCSI仿真缓慢; NVMe SSD可能因为他们使用更简单的软件堆栈更快.根据我们的4-5个请求,我们可以估计SSD上的fseek为几毫秒,例如最多1到1.5毫秒或有时更长.
你可以使用strace -T ./your_fseek_program来检查fseek所需的时间.它将报告执行每个系统调用所需的时间.但要获得真正的延迟,您不仅要检查寻道时间,还要检查下一次读取系统调用的时间.在每次运行此测试之前,您可能希望使用echo 3>刷新内核缓存.来自root(https://unix.stackexchange.com/questions/17936/setting-proc-sys-vm-drop-caches-to-clear-cache)的/ proc / sys / vm / drop_caches命令.
您也可以尝试一些I / O基准测试,如iozone,iometer或fio来估算搜索延迟.
内容总结
以上是互联网集市为您收集整理的linux – 如何估计文件系统中的搜索速度全部内容,希望文章能够帮你解决linux – 如何估计文件系统中的搜索速度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。