【操作系统】操作系统IO和虚拟文件系统VFS1

简介: 【操作系统】操作系统IO和虚拟文件系统VFS

1.什么是操作系统的IO

输入(input)和输出(output),就是对磁盘的读(read)和写(write)。


I/O模式可以划分为本地IO模型(内存、磁盘)和网络IO模型。


I/O关联到用户空间和内核空间的转换,也称为用户缓冲区和内核缓冲区。


用户态的应用程序不能直接操作内核空间,需要将数据从内核空间拷贝到用户空间才能使用。


read和write操作,都只能在内核空间里执行

磁盘IO和网络IO请求都是先放在内核空间,然后加载到内存的数据

2.什么是文件系统

在linux中一切皆文件,文件系统是管理磁盘上的全部文件,文件管理组织方式多种多样,所以文件系统存在多样化。


文件系统是管理数据,而存储数据的物理设备有硬盘、U盘、SD卡、网络存储设备等。


不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理。


例子:


Windows有FAT12、FAT16、FAT32、NTFS、exFAT等文件系统。

Linux有Ext2、Ext3、Ext4、tmpfs、NFS等文件系统。

查询系统用了哪些文件系统:df -h -T

11d29460d5be435e8429add25fc37245.jpg



两个核心概念:


索引节点(index node)

简称inode,记录文件的元信息,比如文件大小、访问权限、修改日期、数据存储位置等。

索引节点也需要持久化存储,占用磁盘空间。

目录项(directory entry)

简称为dentry,记录目录结构,比如文件的名字、索引节点指和其他目录的关联关系等,树状结构居多。

存储在内存中,也叫目录项缓存。

3.什么是虚拟文件系统VFS

虚拟文件系统VFS(Virtual File System)就是调用读写位于不同物理介质上的不同文件系统,为各类文件系统提供统一的接口进行交互。

在应用程序和具体的文件系统之间引入一个抽象层,开发者不用心底层的存储介质和文件系统类型就可以使用。

b3c7561f7b544a569764500503647266.png



平时调用write的时候,数据是从应用写入到了C标准库的IO Buffer(存在用户态)


在关闭流之前flush下文件,通过flush将数据主动写入到内核的Page Cache中,如果应用挂了,数据不安全(存在内核态)


然后将内核中的Page Cache的数据写入到磁盘的缓存中,即使系统挂了,数据也是安全的,需要调用fsync(存在持久化介质)


4.写入磁盘数据不同参数案例

(1)写入到Page / Buffer Cache中


# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test1 bs=1M count=1024

c65a67d4abd646e9871ad3f6429f88e3.jpg

48a94fc7224c43fb8cdea3dc5ff69568.jpg



(2)直接写入到磁盘的缓存区

# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test2 bs=1M count=1024 oflag=direct


879c0449eccf4bc8836e8ddf33267874.jpg

ae9026a3dc044d7aa34cb79499372aed.jpg


(3)写入到磁盘的缓存区在同步到磁盘

# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test3 bs=1M count=1024 oflag=sync

15baafd1405d4f599e353f2b65180797.jpg

3519f453b1414ae2be7d23c3b08b07cc.jpg


(4)结果


没有oflag的时候,文件复制速度是 oflag=direct 的多倍

答案:默认是buffered I/O,数据写到缓存层便返回,所以速度最快

oflag=direct的速度又比 oflag=sync 快了点

答案:数据写到磁盘缓存便返回,所以速度比上面的buffered I/O方式要慢

oflag=sync 的速度最慢

答案:写入的数据全部落盘才返回,所以速度比上面的仅写到磁盘缓存要慢

物理磁盘也会带有缓存 disk cache,用于提供I/O速度, 一般磁盘中带有电容,断电也能把缓存数据刷写到磁盘中

5.机械硬盘HDD简介

1c9820ea0b14417ebb55eb72886a0bae.jpg


(1)概念介绍


盘面号(磁头号)

硬盘的每一个盘片都有两个盘面(Side),即上下盘面,一般每个盘面都会利用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。

每一个这样的有效盘面都有一个盘面号,按顺序从上至下从“0”开始依次编号。在硬盘系统中,盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头

磁道

磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。

柱面

所有盘面上的同一磁道构成一个圆柱,通常称作为柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。

扇区

即磁盘块、物理块。

现代系统中,一般是512B大小,即512字节。

将物理相邻的若干个扇区称为了一个簇。操作系统读写磁盘的基本单位是扇区,而文件系统的基本单位是簇(Cluster)。

簇一般有这几类大小 4K,8K,16K,32K,64K等。

(2)磁盘如何读取数据


磁臂摆动+盘片转动(耗时大所以导致慢,随机在硬盘上找一个数据,需要8-14ms),定位到目标扇区读取数据。

磁臂在一定范围内摆动,来找到目标扇区,靠磁头把某个扇区的数据传输到总线上

磁臂摆动范围有限,触达不到比较远的扇区,靠转轴来带动盘片,比如磁盘转速有7200转/分,1秒就是120圈

常规1秒可以做100次随机IO,所以高并发业务单靠磁盘上扛不住的,基本都是要结合缓存

想要优化,不用随机IO,采用顺序IO,节省了大量的物理耗时,比如Kafka、RocketMQ

6.磁盘读写常见指标

IOPS(Input/Output Operations per Second)


指每秒能处理的I/O个数,表示块存储处理读写(输出/输入)的能力,单位为次,有顺序IOPS和随机IOPS

比如100次/秒,那iops就是100次/秒,例如数据库类应用等典型场景重点提升这个指标,下面是阿里云盘性能

高效云盘:2120 IOPS

ESSD云盘:2280 IOPS

SSD云盘:3000 IOPS

参考:https://help.aliyun.com/document_detail/25382.html

吞吐量/带宽(Throughput)


是指单位时间内可以成功传输的数据数量,单位为MB/s

比如 一个硬盘的读写 IO 是 1MB,硬盘的 IOPS 是 100,那么硬盘总的吞吐率就是 100MB/s

带宽 = IOPS * IO大小

如果需要部署大量顺序读写的应用,例如Hadoop离线计算型业务等典型场景,需要关注吞吐量

容量(Capacity) 查看。df -h


是指存储空间大小,单位为TiB、GiB、MiB或者KiB,块存储容量按照二进制单位计算

1B(byte 字节)=8bit
1KB(Kilobyte 千字节)=1024B
1MB(Megabyte 兆字节 简称“兆”)=1024KB
1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB(Terabyte 万亿字节 太字节)=1024GB,
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB

7.Linux磁盘IOPS性能测试

(1)什么是fio


全称flexible I/O tester(灵活的I/O测试工具)是一个I/O工具

可以根据用户指定的I/O类型,利用多线程/进程的I/O来对硬件进行压力测试和验证


         

image.png

(2)测试命令


# 随机读  
fio -direct=1 -iodepth=128 -rw=randread  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest1 -name=iotest1


8330c0bff4c64dc5a86233e61f6d152b.jpg

# 随机写
fio -direct=1 -iodepth=128 -rw=randwrite  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest2 -name=iotest2


d2ac8f3b34f745598647f6a8ce702a8b.jpg

# 顺序读
fio -direct=1 -iodepth=128 -rw=read  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest3 -name=iotest3

8f30c3fc43ba48b791ea2c2943dc267a.jpg


# 顺序写
fio -direct=1 -iodepth=128 -rw=write  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest4 -name=iotest4

53e2fee26d8c4ce4b7a836825db9dc0c.jpg

# 随机读写
fio -direct=1 -iodepth=128 -rw=randrw  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest5 -name=iotest5

3aa4bfecddff4a6f8b5413320cc17401.jpg


8.固态硬盘SSD简介

(1)什么是固态硬盘SSD


固态电子元器件组成,没有盘片、磁臂等机械部件,不需要磁道寻址,靠电容存储数据。

某块区域存在数据,机械硬盘写入可以直接覆盖,而固态硬盘需要先擦出,再写入。

block块擦的越多寿命就越短,业务数据高频更新,则不太建议使用固态硬盘

最小读写单位是页,通常大小是4KB、8KB

性能高,IOPS可以达到几万以上,价格比机械硬盘贵,寿命短。

(2)固态硬盘的组成结构


SSD多个裸片组成

裸片多个平面组

平面plane(多个block组成)

块block(通常64个page组成一个block)

页 page 4k


10524b610c204237bfce23b52e1f538f.jpg

(3)磁盘的擦除数据


SSD里面最小读写单位是page,但是最小擦除单位是block。

一个块上的某些页的数据被标记删除,不能直接擦除这些页,除非整个块上的页都被标记删除。

块还有其它有效数据,当有新数据只能写入白色区域,并不能利用红色区域,时间越长,不能被使用的碎片越多。

解决方式为标记整理机制程序,有效页数据复制到一个空白的块里,然后把整个块完全擦除。

**擦除数据 类似JVM的GC ,标记整理 Mark Compact **

先对对象进行一个标记,看看哪些对象是垃圾

整理会在清除的过程中,把可用的对象向前移动,让内存更为紧凑,避免内存碎片的产生

整理之后发现内存更紧凑,连续的空间更多,就不会造成内存碎片的问题


096d5807678248d989252eb458ba6f42.jpg

9.操作系统的磁盘分区

(1)为啥要磁盘分区?


方便管理、提升系统的效率和做好存储空间隔离分配

将系统中的程序数据按不同的使用分为几类,将不同类型的数据分别存放在不同的磁盘分区中

在每个分区上存放的都是相似的数据或程序,这样管理和维护就容易多

分区可以提升系统的效率,系统读写磁盘时,磁头移动的距离缩短了,即搜寻的范围小了

如果不运用分区,每次在硬盘上寻找信息时可能要寻找整个硬盘,所以速度会很慢

允许在一个磁盘上有多个文件系统,每个分区可以分配不同的文件系统

从而使操作系统可以识别每个分区的文件系统,从而实现文件的存储和管理

创建硬盘分区后,还不能立即使用,还需要创建文件系统,即格式化

格式化后常见的磁盘格式有:FAT(FAT16)、FAT32、NTFS、ext2、ext3等

(2)硬盘分区类型(不同类型的磁盘支持分区的数量有限制)


主分区:直接在硬盘上划分,一个硬盘可以有1到3个主分区和1个扩展分区。

扩展分区:是一个概念实际在磁盘中看不到,也无法直接使用扩展分区,在扩展分区中建立逻辑分区。

f7a8c8f80dbd4b109b84ab407b736a3a.jpg


容量

硬盘的容量 = 主分区的容量+扩展分区的容量

扩展分区的容量 = 各个逻辑分区的容量之和

多个硬盘多个分区查看命令:lsblk

Linux系统下的硬盘分区设备名称

image.png

fdisk 管理磁盘分区

36b3e11547db47ddaf775cb2172f412e.jpg


df 检查文件系统的磁盘空间占用情况 ( 全称: disk free)

df -h -T 以磁盘分区为单位查看文件系统,获取硬盘被占用了多少空间,目前还剩下多少空间等信息

通常加 -h 选项为根据大小适当显示

432415369f694701a1fee2e29da5074a.jpg


字段 说明
Filesystem 文件系统
Size 分区大小
Used 已使用容量
Avail 还可以使用的容量
Use% 已用百分比
Mounted on 挂载点


10.磁盘冗余阵列

(1)磁盘阵列


独立磁盘冗余阵列RAID(Redundant Array of Independent Disks)

一种提供高可用性和数据容错性的数据存储技术。把几块硬盘组成一个阵列,并将它们的数据分布在不同的磁盘上。

在硬盘发生故障时保护数据,还可以提高I/O性能,使系统能够更快的完成任务。

简单来说:是把相同的数据存储在多个硬盘的不同的地方,存储冗余数据增加了容错。

根据性能、容量、可靠性、有多个级别,如 RAID0、RAID1、RAID5、RAID10

(2)RAID方案

RAID0磁盘阵列

至少需要两块硬盘,磁盘越多,读写速度快,一个磁盘吞吐 * 磁盘数量 * 0.8,没有冗余。

磁盘利用率100%,安全性低。

优点是读写性能比一般的硬盘要好,缺点是没有数据冗余,一块硬盘出现故障可能导致数据损坏。

51c393e8ea0d4ad0a448e34904a5c2af.jpg


RAID1镜像阵列

全部数据都分别复制到多块盘上,当其中一块盘出现故障时另外一块盘的数据可以被立即使用,从而保证数据的安全性。

每次写数据时都会同时写入镜像盘,读写性能较低,只能用两块硬盘,一块磁盘冗余,磁盘的利用率只有50%。

优点是数据冗余性高,缺点是读写性能比一般的硬盘差。

适合服务器、数据库存储等领域。


07f935e5eb5b471395983a7fcc1fc824.jpg

RAID5条带阵列

至少需要三块硬盘,一块磁盘冗余,是最通行的配置方式,是将多块硬盘按特定顺序组合起来。

在每块硬盘上都会存储1份数据和1份校验信息,1块硬盘出现故障时,根据另外2块硬盘的校验信息可以恢复数据

这种存储方式只允许有一块硬盘出现故障,出现故障时需要尽快更换

综合了RAID-0和RAID-1的优点和缺点,是RAID0和RAID1的折中方案

适合需要安全和成本兼顾的领域,性能要求稍高,比如金融数据库存储


b8d04743c3d944c897a03a22a75099f2.jpg

相关文章
|
2月前
|
存储 算法 安全
操作系统之文件系统的奥秘
【9月更文挑战第19天】本文将深入探索操作系统中不可或缺的组件——文件系统,揭示其工作原理与实现细节。我们将通过浅显的语言和生动的比喻,一步步解析文件系统如何组织数据、管理存储空间,并确保数据的完整性和安全性。文章不仅适合初学者构建基础概念,也能帮助有经验的开发者更深入地理解文件系统的高级特性。
|
7天前
|
存储 安全 大数据
深入浅出操作系统:文件系统的秘密
【10月更文挑战第35天】本文将揭示文件系统背后的奥秘,从其基本概念到复杂的实现机制。我们将一起探索文件系统的结构和原理,并了解它如何影响我们的日常计算体验。通过简单的例子和比喻,文章旨在使读者对文件系统有一个清晰而深刻的理解,就像甘地所言:“你必须成为你希望在世界上看到的改变。”让我们一起成为理解操作系统的先行者。
|
1月前
|
存储 Java API
【文件IO】文件系统操作
【文件IO】文件系统操作
40 1
|
2月前
|
存储 缓存 文件存储
探索操作系统中的文件系统管理
【9月更文挑战第25天】在数字世界的海洋中,操作系统是指引我们航行的灯塔。它不仅管理着硬件资源,还维护着软件的秩序。本文将深入探讨操作系统中一个至关重要的部分——文件系统管理。我们将从基础概念出发,逐步深入到文件系统的设计与实现,最后通过代码示例来直观展示文件系统的操作。让我们一起揭开文件系统管理的神秘面纱,理解其背后的逻辑与奥秘。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
45 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
53 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
3月前
|
存储 算法 Unix
OS—文件系统
OS—文件系统
52 0
|
4月前
|
算法 UED
深入理解操作系统:虚拟内存管理机制
【7月更文挑战第4天】在数字时代的浪潮中,操作系统的虚拟内存管理机制如同一座精巧的时间桥梁,连接着有限的物理资源与无限的程序需求。本文将揭开这座桥梁的秘密,从虚拟内存的基本概念出发,逐步深入到页面置换算法的世界,探讨它们如何影响系统性能和用户体验。通过对比分析不同的页面置换策略,我们旨在为读者提供一种全新的视角,以理解和评估现代操作系统中这一至关重要的功能。
56 1
|
5月前
|
存储 缓存
操作系统的虚拟内存管理机制
在现代计算机系统中,虚拟内存是一种至关重要的内存管理技术。它允许操作系统使用硬盘空间来扩展物理内存容量,从而支持更多并发运行的程序。本文将深入探讨虚拟内存的概念、实现方式以及其在操作系统中的作用和重要性。