• 八、性能测试之磁盘分析


    一、磁盘简介

    在这里插入图片描述

    • 磁盘,是系统中容量最大的存储设备,相对cpu核内存来说速度比较慢

    • 1、存储数据之前,要先进行格式化
      • linux:ext4
      • windows:FAT32、NTFS
      • 磁盘就像一个笔记本,格式化,就像对每一页纸画书写格子,没有格子,写的字可能就不整齐
    • 2、读写数据时,数据与磁盘间有个磁盘缓存(内存的一部分)
      • 就像写字前,先打个草稿,然后再正式写一份
    • 3、磁盘:持久化的存储设备
      • 机械磁盘:HDD,由盘片、磁头组成,数据存在盘片的唤醒磁道上,读写时,磁头移动,定位到数据的磁道,进行数据读写
      • 固态磁盘:SSD,由固态电子元器件组成,不需要磁头寻址,所以,不管理连续IO,还是随机IO,都比机械盘快
    • 4、磁盘读写操作流

    在这里插入图片描述 我们做性能测试的主要关注第二层(操作系统层)

    • 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 展示当前目录所在位置每个文件的大小
    在这里插入图片描述

    • 4、vmstat 1 监控磁盘io(bi,bo)

    在这里插入图片描述

    • 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 一个伪设备,只产生字符流,不会有IO
      • of=$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

    在这里插入图片描述

    • 结论:
    • 磁盘的读写速度,几百MB/s 内存 几GB/s 内存速度比磁盘快很多

    • 操作时,cache增大, bo有明显数据,

    • 数据时,buff增大, bi有明显数据

  • 相关阅读:
    ArcGIS 10.7软件安装包下载及安装教程!
    后端常用的Linux命令大全
    JDK8升级JDK11最全实践干货来了
    极客时间Kafka - 04 Kafka生产者和消费者拦截器
    c++对类的的详解(2)
    螺杆支撑座是如何维持精度和稳定性的?
    【c#】线程Monitor.Wait和Monitor.Pulse使用
    修改el-form-item中label样式
    【论文知识点笔记】具有定量特征融合的粒子群优化模糊 CNN 用于超声图像质量识别
    【科学文献计量】知识单元的频次统计与分布(简单阅览和完整频次统计)
  • 原文地址:https://blog.csdn.net/qq_36792120/article/details/132669784