系统相关
首页 > 系统相关> > Linux 磁盘管理-基础知识-磁盘设备与IO

Linux 磁盘管理-基础知识-磁盘设备与IO

作者:互联网

作者:锦城牛仔
链接:https://www.zhihu.com/question/381335036/answer/1095187687
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

块设备

Linux中,块(block)设备是相对于字符设备而言的,不像字符设备只能以连续字符流的方式访问,块设备可以提供随机访问,最小的粒度是块。

硬盘HDD——传统的块设备

硬盘中的磁道和扇区(来源《深入理解计算机系统》)

硬盘内部包括多个磁盘,每个磁盘两个盘面都可用于数据存储,每个盘面上的同心圆环称为磁道,每个磁道上均匀间隔着多个扇区,通常情况下每个扇区512字节。多个盘面上半径相同的磁道组成一个柱面

柱面示意图(来源《深入理解计算机系统》)

之所以有柱面的概念,是因为硬盘中,虽然有多组磁头,但是由于受同一个机械臂控制,这些磁头都是同时移动的,所以同一柱面上的数据不需要移动磁头就可以同时访问。

多磁头受同一传动臂控制(来源《深入理解计算机系统》)

硬盘上的访问时间包括:

寻道和旋转示意图(来源《深入理解计算机系统》)

固态硬盘SSD——硬盘的代替品

固态硬盘是作为传统硬盘的代替品出现的,相比硬盘主要优势:

固态硬盘的存储结构从小到大分别是:

页=>块=>Plane=>LUN=>闪存

固态硬盘存储单元内部结构,来源网络

固态硬盘虽然有那么多优点,但是也有一个缺陷或者说是硬件约束,那就是不能覆盖写问题。SSD可以随机读取页,但是不能像硬盘那样直接覆盖写,SSD只能在空白页上进行写操作。如果没有空白页了,必须擦除整个block的所有页才能写入数据。这就引发了写入放大的问题,比如本来只写1页数据,如果没有空白页了,引发垃圾回收,要先擦除整个block,如果这个block上有5页数据有效,就需要将这5页数据迁移到其他空白页,真实的写入页数就增加了5。

SSD为了克服自身缺陷,进行了一系列的操作:

详情可见,参考文献4、参考文献5。

 

云存储设备

云存储是基于云主机提供的存储设备,根据应用场景的不同,一般分为:

从上到下存储性能越来越强,参考阿里云数据。

 

Linux块I/O原理

Linux使用虚拟文件系统屏蔽不同I/O设备的差别,Linux内核通过映射层、通用块层、I/O调度层屏蔽不同块设备的差别。

linux块I/O系统结构图,来源(深入理解Linux内核)

Linux内核的I/O操作逻辑结构:

I/O操作的结构体示意图,来源《深入理解Linux内核》

 

iostat命令——查看I/O统计情况

tps(transfer per second,transfer is an I/O request to device),意思是每秒发起的I/O请求数,包括读和写。测试读或写时,tps约等于fio统计的iops。

#>iostat -dt 1

Linux 4.4.0-93-generic (xjser-dev) 	03/21/2020 	_x86_64_	(4 CPU)

03/21/2020 04:26:19 PM
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda              13.11       513.00       118.35 40830854445 9419986180
vdb               3.24        22.97        90.45 1828620029 7199419100

03/21/2020 04:26:20 PM
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.00         0.00         0.00          0          0
vdb               0.00         0.00         0.00          0          0

03/21/2020 04:26:21 PM
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               2.00         0.00        28.00          0         28
vdb               0.00         0.00         0.00          0          0
#>iostat -xdt 1

Linux 4.4.0-93-generic (xjser-dev) 	03/21/2020 	_x86_64_	(4 CPU)

03/21/2020 04:31:45 PM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.02     2.87    6.80    6.31   513.00   118.35    96.32     0.00    0.27    3.94    4.86   1.07   1.41
vdb               0.00     3.47    0.87    2.38    22.97    90.46    69.91     0.04   11.92    1.31   15.79   0.61   0.20

03/21/2020 04:31:46 PM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     0.00    0.00 2616.00     0.00 10464.00     8.00   127.90   48.85    0.00   48.85   0.38 100.00

03/21/2020 04:31:47 PM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     0.00    0.00 2625.00     0.00 10500.00     8.00   127.90   48.69    0.00   48.69   0.38 100.00

重点解释一下几个比较有用的数据项

 

iostat中不要关注的数据项,由于I/O并行化以及SSD的普及,这两个数据项可以不看了。想了解原因请看参考文献1。

 

fio命令——I/O性能测试利器

一般用于线上业务的服务器,都需要在使用前测试磁盘的性能。推荐fio进行性能测试,fio命令参数说明如下(详细方法请看参考文献2)

 

blktrace——深入分析I/O性能

如果需要深入分析I/O性能,推荐使用blktrace命令。该命令可以将I/O请求到达块设备处理层后的所有步骤进行统计分析。

 

 

 

 

参考文献:

1. http://bean-li.github.io/dive-into-iostat/

2. https://help.aliyun.com/document_detail/147897.html?spm=a2c4g.11186623.6.776.5d9811be92UHuQ#title-fsk-zok-rpg

3. http://linuxperf.com/?p=161

4. http://www.jinbuguo.com/storage/ssd_intro.html

5. http://www.ssdfans.com/?p=131

6. https://help.aliyun.com/documen

标签:kB,0.00,await,IO,Linux,磁盘,fio,硬盘
来源: https://blog.csdn.net/xyz/article/details/117379733