输入(input)和输出(output),就是对磁盘的读(read)和写(write)。
I/O模式可以划分为本地IO模型(内存、磁盘)和网络IO模型。
I/O关联到用户空间和内核空间的转换,也称为用户缓冲区和内核缓冲区。
用户态的应用程序不能直接操作内核空间,需要将数据从内核空间拷贝到用户空间才能使用。
在linux中一切皆文件,文件系统是管理磁盘上的全部文件,文件管理组织方式多种多样,所以文件系统存在多样化。
文件系统是管理数据,而存储数据的物理设备有硬盘、U盘、SD卡、网络存储设备等。
不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理。
例子:
查询系统用了哪些文件系统:df -h -T
两个核心概念:
虚拟文件系统VFS(Virtual File System)就是调用读写位于不同物理介质上的不同文件系统,为各类文件系统提供统一的接口进行交互。
在应用程序和具体的文件系统之间引入一个抽象层,开发者不用心底层的存储介质和文件系统类型就可以使用。
平时调用write的时候,数据是从应用写入到了C标准库的IO Buffer(存在用户态)
在关闭流之前flush下文件,通过flush将数据主动写入到内核的Page Cache中,如果应用挂了,数据不安全(存在内核态)
然后将内核中的Page Cache的数据写入到磁盘的缓存中,即使系统挂了,数据也是安全的,需要调用fsync(存在持久化介质)
(1)写入到Page / Buffer Cache中
# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test1 bs=1M count=1024
(2)直接写入到磁盘的缓存区
# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test2 bs=1M count=1024 oflag=direct
(3)写入到磁盘的缓存区在同步到磁盘
# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test3 bs=1M count=1024 oflag=sync
(4)结果
(1)概念介绍
(2)磁盘如何读取数据
IOPS(Input/Output Operations per Second)
吞吐量/带宽(Throughput)
容量(Capacity) 查看。df -h
1B(byte 字节)=8bit
1KB(Kilobyte 千字节)=1024B
1MB(Megabyte 兆字节 简称“兆”)=1024KB
1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB(Terabyte 万亿字节 太字节)=1024GB,
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB
(1)什么是fio
# 安装fio
yum install fio -y
参数 | 说明 |
---|---|
filename | 待测试的文件或块设备 如果是文件,则是测试文件系统的性能,例:-filename = /work/fstest/fio.img 如果是块设备,则是测试裸设备的性能,例:-filename = /dev/vda1(注意容易损坏磁盘) |
ioengine | IO引擎fio支持多种引擎如:cpuio、mmap、sync、psync、filecreate、libaio等 常用libaio是linux异步读写IO(Linuxnative asynchronous I/O) |
iodepth | 表示使用AIO时,同事发出I/O数的上限为128 |
direct | 是否采用直接I/O,(directIO)方式进行读写 如果采用直接I/O,则取值-direct = 1,否则取值-direct = 0 一般是用直接I/O写测试,测试结果更加真实 |
rw | 读写模式 read:顺序读测试,使用方式 -rw = read write:顺序写测试,使用方式 -rw = wrie randread:随机读测试,使用方式 -rw = randread randwrite:随机写测试,使用方式 -rw = randwrite randrw:随机读写,-rw = randrw,默认比率为5:5 |
numjobs | 测试进程的并发数,比如-numjobs = 16 |
bs | 单次IO的大小,比如 -bs = 4k |
size | 测试文件的大小,比如 -size = 1G |
sync | 设置同步模式,同步 -sync = 1,异步 -sync = 0 |
runtime | 设置测试运行时间,单位秒,比如:-runtime = 100 |
group_reporting | 结果把多线程汇总输出 |
(2)测试命令
# 随机读
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -runtime=10 -filename=iotest1 -name=iotest1
# 随机写
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -runtime=10 -filename=iotest2 -name=iotest2
# 顺序读
fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=4k -size=1G -runtime=10 -filename=iotest3 -name=iotest3
# 顺序写
fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=4k -size=1G -runtime=10 -filename=iotest4 -name=iotest4
# 随机读写
fio -direct=1 -iodepth=128 -rw=randrw -ioengine=libaio -bs=4k -size=1G -runtime=10 -filename=iotest5 -name=iotest5
(1)什么是固态硬盘SSD
(2)固态硬盘的组成结构
(3)磁盘的擦除数据
(1)为啥要磁盘分区?
(2)硬盘分区类型(不同类型的磁盘支持分区的数量有限制)
设备 | 介绍 | 设备在Linux中的中文名 |
---|---|---|
IDE硬盘Hard Disk | Integrated Drive Electronics 电子集成驱动器/dev/hd 是IDE 接口硬盘分区,一般用于普通桌面和服务器 |
/dev/hd[字母] [数字] |
SCSI光盘Solid Disk | Small Computer System Interface 小型计算机系统接口/dev/sd 是SCSI 接口硬盘分区,一般用于服务器 |
/dev/sd[字母] [数字] |
virtio 虚拟磁盘Virtual Disk | /dev/vd 虚拟磁盘分区,一般用于在虚拟机上扩展存储空间 |
/dev/vd[字母] [数字] |
df 检查文件系统的磁盘空间占用情况 ( 全称: disk free)
df -h -T
以磁盘分区为单位查看文件系统,获取硬盘被占用了多少空间,目前还剩下多少空间等信息
通常加 -h 选项为根据大小适当显示
字段 | 说明 |
---|---|
Filesystem | 文件系统 |
Size | 分区大小 |
Used | 已使用容量 |
Avail | 还可以使用的容量 |
Use% | 已用百分比 |
Mounted on | 挂载点 |
(1)磁盘阵列
(2)RAID方案