当前位置: 首页 > 科技观察

LinuxIO和磁盘IO的检测

时间:2023-03-12 03:55:24 科技观察

IO分类文件读写方式的各种差异导致了各种I/O分类。最常见的是缓冲和非缓冲I/O。根据是否使用标准库的缓存接口,自己写的缓存等:1.BufferedI/O是指使用标准库缓存来加速文件访问,标准库内部通过系统访问文件调度。2.Non-bufferedI/O是指直接通过系统调用访问文件,不经过标准库缓存。直接与间接I/O。取决于是否使用内核的缓存。使用内核缓存的是间接io。打开系统调用O_DIRECT参数:1、直接I/O是指跳过操作系统的pagecache,直接与文件系统交互访问文件。2.间接I/O正好相反。读写文件时,必须先通过系统的页缓存,然后由内核或额外的系统调用真正写入磁盘。同步阻塞和非阻塞I/O。根据应用程序是否阻塞自己的操作,文件I/O可以分为阻塞I/O和非阻塞I/O:1.阻塞I/O是指应用程序执行I/O操作后,如果有没有反应,就会阻塞当前线程,自然无法执行其他任务。2、非阻塞I/O是指应用程序执行一次I/O操作后,不会阻塞当前线程,而是立即返回。设置O_NONBLOCK标志意味着以非阻塞方式访问,可以继续执行其他任务,然后通过轮询或事件通知的方式获取调用的结果。严格来说就是替换阻塞点的位置(select、poll、epoll等)。主要用于标准输出和网络。同步与异步I/O。根据是否等待响应结果,文件I/O可分为同步I/O和异步I/O:1.同步I/O是指应用程序执行I/O操作后,必须等到整个I/O完成后才能得到I/O响应。2、异步I/O是指应用程序执行I/O操作后,不需要等待完成和完成后的响应,而是继续执行。本次I/O完成后,响应会以事件通知的形式告诉应用程序。Linux上的文件系统I/O进程将数据读写到文件系统中,需要很多层的组件协同工作。他们具体是如何合作的?一起来看看吧。在应用层,当一个进程进行文件读写操作时,可以使用sys_open、sys_read、sys_write等系统调用。在内核中,每个进程都需要为打开的文件维护一定的数据结构。在内核中,整个系统打开的文件也需要维护一定的数据结构。GenericBlockLayerGenericBlockLayer是一个内核组件,它处理来自系统中所有块设备的请求。将数据从磁盘映射到内存。页框只有在CPU访问数据时才会映射到内核中的线性地址,数据访问结束时才会解除映射。通过一些额外的手段,如DMA等,实现了一种“零拷贝”模式,将磁盘数据直接存储在用户态的地址空间中,而不是先拷贝到内核地址空间中。因为内核用于I/O数据传输的buffer所在的叶帧映射到进程的用户态线性地址。管理逻辑卷,例如LVM和RAID(软件RAID)使用的逻辑卷。公共块层是Linux磁盘I/O的核心。向上,它为文件系统和应用程序提供了访问块设备的标准接口;向下,将各种异构的磁盘设备抽象为统一的块设备,并发送I/O请求重排序、请求合并等,提高磁盘访问效率。I/O调度层事实上,Linux内核支持四种I/O调度算法,分别是NOOP、CFQ、DeadLine和Anticipatory。这里我也分别介绍一下。第一种NOOP,也称为电梯算法。它是最简单的I/O调度算法。它实际上是一个先进先出队列,只做一些基本的请求合并,常用于SSD盘。第二种CFQ(CompletelyFairScheduler),又称完全公平调度器,是现在很多发行版默认的I/O调度器。它为每个进程维护一个I/O调度队列,并根据时间片来平均分配每个进程的I/O请求。与进程CPU调度类似,CFQ也支持进程I/O的优先级调度,因此适用于运行大量进程的系统,如桌面环境和多媒体应用。第三种DeadLine期限调度算法。使用四个队列。其中两个排序队列分别包含读写请求,请求按照起始扇区排序。其他两个截止队列包含相同的读取和写入请求,但根据它们的截止时间进行排队。可以提高机械盘的吞吐量,保证到达deadline的请求优先处理。该算法在全局吞吐量和延迟之间做了一个权衡,牺牲一定的全局吞吐量来避免饿死请求的可能性。当系统中有大量的顺序I/O请求时,这种算法可能会导致I/O请求不能很好地排序,从而造成频繁的seek。第四种预期算法。借鉴了“截止时间调度算法”的基本机制:两个截止时间队列和两个排序队列。I/O调度程序在读取和写入请求之间以交互方式扫描排序队列,但更喜欢读取请求。除非其中一个请求超时,否则扫描基本上是连续的。为每个读IO设置一个7ms左右的等待时间窗口。如果OS在这7ms内收到来自相邻位置的读取IO请求,则可以立即满足。为了满足随机IO和顺序IO混合的场景,该算法适用于写较多的环境,不适用于MySQL等随机读较多的数据库环境。磁盘IO检测在磁盘测试中最关心的指标是:iops(每秒执行的IO数),bw(带宽,每秒吞吐量),lat(每次IO操作的延迟)当每个IO操作块为小的,比如512bytes/4k/8k等,测试主要是iops。当每次IO操作的block较大时,如256k/512k/1M等,测试主要是bw使用fio工具进行磁盘io检测1.FIO简介FIO是一款用于磁盘性能测试的工具。可以测试IOPS、吞吐量和IO延迟等关键性能指标。并且它支持多种IO引擎。2、FIO下载下载地址:http://brick.kernel.dk/snaps/打开上面的网址,选择你需要的版本下载。例如:wgethttp://brick.kernel.dk/snaps/fio-3.5.tar.gz3。解压并安装#tar-xzvf./fio-3.5.tar.gz....省略输出#cdfio-3.5#make&&makeinstall....省略输出#whichfio/usr/local/bin/fio4。指令filename=/dev/sdb1测试文件名,一般选择待测磁盘的数据目录。direct=1测试过程绕过机器自带的buffer。使测试结果更加真实。rw=randwritetestrandomwriteI/Orw=randrwtestrandomwriteandreadI/Obs=16k单个ioblockfilesize为16kbsrange=512-2048同上,这次指定datablocksize=5g的大小范围测试文件大小5g,每次测试4kio。numjobs=30这次的测试线程是30.runtime=1000测试时间是1000秒。如果不写入,则每次将5g文件分成4k,直至写入。ioengine=psyncio引擎使用pync模式rwmixwrite=30混合读写模式下,写入占30%group_reporting关于展示结果,汇总各进程信息lockmem=1g只使用1g内存进行测试。zero_buffers初始化系统缓冲区为0。nrfiles=8每个进程生成的文件数5.测试示例混合测试:fio-filename=/tmp/test-direct=1-iodepth1-thread-rw=randrw-rwmixread=70-ioengine=psync-bs=512b-size=200m-numjobs=10-runtime=60-group_reporting-name=mytest顺序读取:fio-filename=/dev/test-direct=1-iodepth1-thread-rw=read-ioengine=psync-bs=16k-size=2G-numjobs=10-runtime=60-group_reporting-name=mytest随机写入:fio-filename=/dev/test-direct=1-iodepth1-thread-rw=randwrite-ioengine=psync-bs=16k-size=2G-numjobs=10-runtime=60-group_reporting-name=mytest顺序写入:fio-filename=/dev/test-direct=1-iodepth1-thread-rw=write-ioengine=psync-bs=16k-size=2G-numjobs=10-runtime=60-group_reporting-name=mytest6。IO读写测试参考脚本https://github.com/sunsharing-note/fio_test.git可以通过以下二维码关注。转载本文请联系运维开发故事号。