一、磁盘简介
我们做性能测试的主要关注第二层(操作系统层)
- linux中,一切皆文件
- 磁盘文件系统:ext4、xfs、nfs
- 内存文件系统:基于内存的文件系统、/proc /sys
- 网络文件系统,用来访问其他计算机数据的文件系统,nfs、smb
-
5、磁盘组成
- 扇区sector:磁盘组成的最小单元(512b),磁盘磁道中的一个弧段
- 块block:操作系统与磁盘数据交换的最小单位,块=2的n次方 * 扇区 (可以读取更多的数据,命中率更高,减少再次读磁盘的次数,提升性能)
- linux:类似Ext4文件系统,就是磁盘分块
- windows:类似NTFS文件系统,也是块,只是被叫做“簇”
- 页page:操作系统与内存数据交换的最小单位(多个块组成一个页,一页的大小一般是4k)
- 缓冲区:buffer内存与磁盘速度不匹配,在数据与磁盘进行IO时,数据先进入缓冲区
- 页缓存:linux内存中对磁盘部分数据的副本,加快程序读取磁盘的速度和进程间数据共享
-
6、磁盘分区
- 磁盘分为基本分区(primary partion)和扩展分区(extension partion)
- 基本分区:不能再分区
- 扩展分区:必须进行二次分区才能使用,再次分区就是逻辑分区
- linux中IDE设备分区为
hd
开头
- hd=hard disk 表示硬盘是IDE(或ATA)并行接口
- hd表示是固态硬盘,sda:第一个(hda1:第一个分区,hda2:第二个分区…),hdb:第二个,hdc:第三个…
- linux中SCSI设备分区符为
sd
头
- sd=serial ATA Disk 表示硬盘是scsi,SATA串行接口,u盘也是scsi,所以u盘也是sda
- sd是机械硬盘,sda:第一个(sda1:第一个分区,sda2:第二个分区…),sdb:第二个,sdc:第三个…
- vmware中把磁盘做成scsi设备,所以硬盘名称是sda
fdisk -l
查看系统分区详细信息
- 里面的命令不建议乱用,可能会造成分区,然后磁盘被格式化问题
-
7、磁盘阵列RAID(独立磁盘构成具有冗余能力的阵列)
- 可以提升磁盘的性能。一般用在数据库或者需要大量存储的企业(比如音频视频这种)。一般中小微企业一般做不到(硬件没有这么多,技术也实现不了),基本操作就是把单个硬盘加大,或者是多加几个盘。
- 由多块独立的磁盘组合成一个容量巨大的磁盘组,利用磁盘提供数据所产生的加成效果提升整个磁盘系统的效能。利用这个技术,把数据切割成多段,分别存在不同磁盘上(面试时候一般问0和5)
- RAID0:数据分片存在2块磁盘,读写速度提升2倍,主要用于SWAP/TMP,但是数据不冗余,数据恢复难(比如插入30个字段,会把30个字段进行分片,分成2片存到2块磁盘,速度会快一些。但是数据存入出错了就很难恢复)-> 2份数据分为2半
- RAID1:相同数据冗余存入2块磁盘,写速度不变,读速度提升2倍,数据冗余1分,主要用于数据备份,但磁盘利用率低 -> 2份数据存入2块磁盘
- RAID5:数据分片和校验码混合存储3份,读写速度提升2倍,主要在要求高速时用,可以用于数据还原。数据没有冗余,但是有校验,数据恢复时比较容易。(成本比较高)
- RAID10:2块磁盘1组先做RAID1,多组RAID1,在做RAID0。读写速度N倍 n为组数
-
8、虚拟文件系统
- 虚拟文件系统(Virtual File System,简称VFS)是linux内核的子系统之一,它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()、read()、write()这样的系统调用操作文件,而无需考虑具体的文件系统和实际的存储介质。
- 通过VFS系统,linux提供了通用的系统调用,可以跨越不同文件系统和介质之间的执行,极大简化了用户访问不同文件系统的过程。(跨平台)另一方面,新的文件系统,新类型的存储介质。可以无需编译的情况下,动态加载到linux中
-
9、文件IO
- 文件操作:先open、再read()\write()、最后close关闭文件
- 读写的不同,IO不同:
- 是否利用标准库缓存:缓存io和非缓存io
- 是否利用页缓存:直接io和非直接io
- 直接io:跳过操作系统的页缓存,直接与文件系统交互来访问文件
- 非直接io:文件读写时,先给页缓存,再由内核调用,写入磁盘
- 是否阻塞自身运行:阻塞io和非阻塞io
- 阻塞io:如果没有获得响应,就阻塞当前进程
- 非阻塞io:不阻塞当前线程
- 是否等待响应结果:同步io和异步io
- 同步io:要一直等待整个io完成,才能获得io响应
- 异步io:不等待io完成,可以执行另外的
-
10、查看数据存储常用命令
-
1、iostat -dx 2 10
每隔2s收集一次数据,共收集10次
- rrqm/s:每秒进行merge的读操作数目,即delta(rmerge)/s
- wrqm/s:每秒进行merge的写操作数目,即delta(wmerge)/s
- r/s:每秒完成的读IO设备次数 即delta(rio)/s
- w/s:每秒完成的写Io设备次数
- resc/s:每秒写扇区数
- rkB/s:每秒读k字节数
- wkB/s:每秒写k字节数
- avgrq-sz:平均每次设备IO操作的数据大小(扇区)delta(rsect+wsect)/delta(rio+wio)
- avgqu-sz:平均IO队列长度,delta(aveq)/s/1000
- await:平均每次设备IO操作的等待时间(毫秒)delta(ruse+wuse)/delta(rio+wio)
- svctm:平均每次设备IO操作的服务时间(毫秒)delta(use)/delta(rio+wio)
- r_await:读请求等待时间
- w_await:写请求等待时间
- %util:一秒钟有百分之多少的时间用于IO操作,或一秒钟有多少IO队列是非空
-
2、df -h
查看磁盘大小
dh -h /dev/shm
-
3、du -sh
查看当前目录所在位置的文件大小
- du -h
展示当前目录所在位置每个文件的大小
-
11、磁盘性能指标
- 使用率:指磁盘处理IO的时间百分比
- 饱和度:磁盘处理IO的繁忙程度
- IOPS:input/output per second 每秒的IO请求
- 吞吐量:每秒的IO请求大小
- 响应时间:指IO请求从发出到收到响应的时间间隔
二、磁盘实战
-
1、清理缓存:echo 3 > /proc/sys/vm/drop_caches
-
做下面3个测试之前都需要清空缓存
-
执行上面那句以后,如图所示,可以看到缓存被清了,free变大了
-
echo 1 > /proc/sys/vm/drop_caches 释放页缓存
-
echo 2 > /proc/sys/vm/drop_caches 释放目录项
-
echo 3 > /proc/sys/vm/drop_caches 释放页缓存,目录项、节点
-
执行完后,buff会为0,cache会减少,free增大
-
2、测试磁盘写能力:dd if=/dev/zero of=$PWD/outfile bs=20MB count=100
if
输入文件(input file),of
输出文件(output file)/dev/zero
一个伪设备,只产生字符流,不会有IOof=$PWD/outfile
输出到当前目录下的outfile文件中bs=20MB count=100
块文件20MB,执行100次
- 2.1、
time dd if=/dev/zero of=$PWD/outfile bs=20MB count=100
- 带有时间统计
- 监控
- 使用
vmstat 1
:buff 有明显的数据,cache有数据变化,但是不明显, bi有明显的数据 - 使用
iostat -dx 1
rKB/s有明显的数据,await有,但是不是很大
-
3、测试磁盘读能力:dd if=/dev/sda of=/dev/null bs=20MB count=100
if
输入文件(input file),of
输出文件(output file)
/dev/sda
磁盘第一个物理分区,读取这个磁盘文件,会有IO/dev/null
一个伪设置,回收站,是个无底洞,可以无限放数据bs=20MB count=100
块文件20MB,执行100次
- 3.1、
time dd if=/dev/sda of=/dev/null bs=20MB count=100
带有时间统计
- 监控
- 3、
vmstat 1
buff 有明显的数据,cache有数据变化,但是不明显, bi有明显的数据 - 4、
iostat -dx 1
rKB/s有明显的数据,await有,但是不是很大
-
4、测试内存能力:dd if=/dev/zero of=/dev/null bs=10MB count=1000