linux查看磁盘io的几种方法,第1张

linux查看磁盘io的几种方法

怎样才能快速的定位到并发高是由于磁盘io开销大呢可以通过三种方式:

 第一种:用 top 命令 中的cpu 信息观察

 Top可以看到的cpu信息有:

 Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie

 Cpu(s): 03% us, 10% sy, 00% ni, 987% id, 00% wa, 00% hi, 00% si

 具体的解释如下:

 Tasks: 29 total 进程总数

 1 running 正在运行的进程数

 28 sleeping 睡眠的进程数

 0 stopped 停止的进程数

 0 zombie 僵尸进程数

 Cpu(s):

 03% us 用户空间占用CPU百分比

 10% sy 内核空间占用CPU百分比

 00% ni 用户进程空间内改变过优先级的进程占用CPU百分比

 987% id 空闲CPU百分比

 00% wa 等待输入输出的CPU时间百分比

 00% hi

 00% si

 00% wa 的百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多。

 第二种:用vmstat

 vmstat 命令报告关于线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。

 输入命令:

 vmstat 2 5

 如果发现等待的进程和处在非中断睡眠状态的进程数非常多,并且发送到块设备的块数和从块设备接收到的块数非常大,那就说明磁盘io比较多。

 vmstat参数解释:

 Procs

 r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数。此数由 linux 计算得出,但 linux 并不耗尽交换空间

 Memory

 swpd: 虚拟内存使用情况,单位:KB

 free: 空闲的内存,单位KB

 buff: 被用来做为缓存的内存数,单位:KB

 Swap

 si: 从磁盘交换到内存的交换页数量,单位:KB/秒

 so: 从内存交换到磁盘的交换页数量,单位:KB/秒

 IO

 bi: 发送到块设备的块数,单位:块/秒

 bo: 从块设备接收到的块数,单位:块/秒

 System

 in: 每秒的中断数,包括时钟中断

 cs: 每秒的环境(上下文)切换次数

 CPU

 按 CPU 的总使用百分比来显示

 us: CPU 使用时间

 sy: CPU 系统使用时间

 id: 闲置时间

 准测

 更多vmstat使用信息

 第二种:用iostat

 安装:

 Iostat 是 sysstat 工具集的一个工具,需要安装。

 Centos的安装方式是:

 yum install sysstat

 Ubuntu的安装方式是:

 aptitude install sysstat

 使用:

 iostat -dx 显示磁盘扩展信息

 root@fileapp:~# iostat -dx

 r/s 和 w/s 分别是每秒的读操作和写操作,而rKB/s 和wKB/s 列以每秒千字节为单位显示了读和写的数据量

 如果这两对数据值都很高的话说明磁盘io操作是很频繁。

+++++++++++++++++++++++++++++++++++++

linux wa%过高,iostat查看io状况

1, 安装  iostat  

 yum install sysstat

之后就可以使用 iostat 命令了,

2,入门使用

 iostat -d -k 2

参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。

tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。kB_read/s:每秒从设备(drive expressed)读取的数据量;

kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;

kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

指定监控的设备名称为sda,该命令的输出结果和上面命令完全相同。

iostat -d sda 2

默认监控所有的硬盘设备,现在指定只监控sda。 

3, -x 参数

iostat还有一个比较常用的选项 -x ,该选项将用于显示和io相关的扩展数据。

iostat -d -x -k 1 10

输出信息的含义

4, 常见用法

iostat -d -k 1 10        #查看TPS和吞吐量信息(磁盘读写速度单位为KB)

iostat -d -m 2            #查看TPS和吞吐量信息(磁盘读写速度单位为MB)

iostat -d -x -k 1 10      #查看设备使用率(%util)、响应时间(await) iostat -c 1 10 #查看cpu状态

5, 实例分析

iostat -d -k 1 | grep vda

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn

sda10            6072        1895        7153  395637647 1493241908

sda10          29902      426667      12941      4352        132

sda10          48384      458990      411717      4544      4076

sda10          21800      336000      10000      3360        100

sda10          54600      878400      12400      8784        124

sda10          82700    1323200      13600      13232        136

上面看到,磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB。

iostat -d -x -k 1

Device:    rrqm/s wrqm/s  r/s  w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz  await  svctm  %util

sda          156  2831  784 3150  4365    316    2182    158    119    003    080  261  1029

sda          198  2475 41980  693 1346535  25347  673267  12673    3215    200    470  200  8525

sda          306  4184 44490 5408 1420408 204898  710204  102449    3257    210    421  185  9224

可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。

可以看到磁盘的平均响应时间<5ms,磁盘使用率>90。磁盘响应正常,但是已经很繁忙了。

await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了

svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,

如果await的值远高于svctm的值,则表示I/O队列等待太长,  系统上运行的应用程序将变慢。

%util: 在统计时间内所有处理IO时间,除以总共统计时间

所以该参数暗示了设备的繁忙程度

。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

也可以使用下面的命令,同时显示cpu和磁盘的使用情况

等待时间超过5ms, 磁盘io有问题

1查看系统负载

(1)uptime

这个命令可以快速查看机器的负载情况。

在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。

命令的输出,load average表示1分钟、5分钟、15分钟的平均负载情况。

通过这三个数据,可以了解服务器负载是在趋于紧张还是趋于缓解。

如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。

反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

(2)W

Show who is logged on and what they are doing

可查询登录当前系统的用户信息,以及这些用户目前正在做什么操作

其中的load average后面的三个数字则显示了系统最近1分钟、5分钟、15分钟的系统平均负载情况

注意:

  load average这个输出值,这三个值的大小一般不能大于系统逻辑CPU的个数。

  如果输出中系统有4个逻辑CPU,如果load average的三个值长期大于4时,说明CPU很繁忙,负载很高,可能会影响系统性能,

  但是偶尔大于4时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲

2dmesg | tail

该命令会输出系统日志的最后10行。

这些日志可以帮助排查性能问题

3vmstat

vmstat Virtual Meomory Statistics(虚拟内存统计),用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况。

后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义

(1)监控进程procs:

r:等待在CPU资源的进程数。

    这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和(出现了CPU瓶颈)。

b:在等待io的进程数 。

(2)监控内存memoy:

swpd:现时可用的交换内存(单位KB)

free:系统可用内存数(以千字节为单位)

buff: 缓冲去中的内存数(单位:KB)。

cache:被用来做为高速缓存的内存数(单位:KB)。

(3)监控swap交换页面

si: 从磁盘交换到内存的交换页数量,单位:KB/秒。

so: 从内存交换到磁盘的交换页数量,单位:KB/秒。

  如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。

(4)监控 io块设备

bi: 发送到块设备的块数,单位:块/秒。

bo: 从块设备接收到的块数,单位:块/秒。

(5)监控system系统

in: 每秒的中断数,包括时钟中断。

cs: 每秒的环境(上下文)转换次数。

(6)监控cpu中央处理器:

us:用户进程使用的时间 。以百分比表示。

sy:系统进程使用的时间。 以百分比表示。

id:中央处理器的空闲时间 。以百分比表示。

    us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。

这些CPU时间,可以让我们很快了解CPU是否出于繁忙状态。

注:

  如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

  如果用户时间和系统时间相加非常大,CPU出于忙于执行指令。  

  如果有大量CPU时间消耗在用户态,也就是用户应用程序消耗了CPU时间。这不一定是性能问题,需要结合r队列,一起分析。

4mpstat -P ALL 1

该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。

MultiProcessor Statistics的缩写,是实时系统监控工具

其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

格式:mpstat [-P {|ALL}] [internal [count]]

-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值

internal 相邻的两次采样的间隔时间

count 采样的次数,count只能和delay一起使用

  all : 指所有CPU

  %usr : 显示在用户级别(例如应用程序)执行时CPU利用率的百分比

  %nice :显示在拥有nice优先级的用户级别执行时CPU利用率的百分比

  %sys : 现实在系统级别(例如内核)执行时CPU利用率的百分比

  %iowait : 显示在系统有未完成的磁盘I/O请求期间CPU空闲时间的百分比

  %irq : 显示CPU服务硬件中断所花费时间的百分比

  %soft : 显示CPU服务软件中断所花费时间的百分比

  %steal : 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比

  %guest : 显示运行虚拟处理器时CPU花费时间的百分比

  %idle : 显示CPU空闲和系统没有未完成的磁盘I/O请求情况下的时间百分比

系统有两个CPU。如果使用参数 -P 然后紧跟CPU编号得到指定CPU的利用率。

( Ubuntu安装: apt-get install sysstat)

5pidstat 1

pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态

6iostat -xz 1

iostat命令主要用于查看机器磁盘IO情况

r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。

await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。

avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。

%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

注:如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能

7free -m

free命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。

最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。

注:

  第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。

  如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。

8sar -n DEV 1

sar命令在这里可以查看网络设备的吞吐率。

在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。

9sar -n TCP,ETCP 1

sar命令在这里用于查看TCP连接状态,其中包括:

active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;

passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;

retrans/s:每秒TCP重传数量;

TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

10top

top命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统CPU使用情况(vmstat)等。

因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

但是,top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。

磁盘结构与数据存储方式, 数据是如何存储的,又通过怎样的方式被访问?

机械硬盘主要由磁盘盘片、磁头、主轴与传动轴等组成;数据就存放在磁盘盘片中

现代硬盘寻道都是采用CHS( Cylinder Head Sector )的方式,硬盘读取数据时,读写磁头沿径向移动,移到要读取的扇区所在磁道的上方,这段时间称为 寻道时间(seek time) 因读写磁头的起始位置与目标位置之间的距离不同,寻道时间也不同 。磁头到达指定磁道后,然后通过盘片的旋转,使得要读取的扇区转到读写磁头的下方,这段时间称为 旋转延迟时间(rotational latencytime) 。然后再读写数据,读写数据也需要时间,这段时间称为 传输时间(transfer time)

固态硬盘主要由主控芯片、闪存颗粒与缓存组成;数据就存放在闪存芯片中

通过主控芯片进行寻址, 因为是电信号方式, 没有任何物理结构, 所以寻址速度非常快且与数据存储位置无关

如何查看系统IO状态

查看磁盘空间

调用 open , fwrite 时到底发生了什么

在一个IO过程中,以下5个API/系统调用是必不可少的

Create 函数用来打开一个文件,如果该文件不存在,那么需要在磁盘上创建该文件

Open 函数用于打开一个指定的文件。如果在 Open 函数中指定 O_CREATE 标记,那么 Open 函数同样可以实现 Create 函数的功能

Clos e函数用于释放文件句柄

Write 和 Read 函数用于实现文件的读写过程

O_SYNC (先写缓存, 但是需要实际落盘之后才返回, 如果接下来有读请求, 可以从内存读 ), write-through

O_DSYNC (D=data, 类似O_SYNC, 但是只同步数据, 不同步元数据)

O_DIRECT (直接写盘, 不经过缓存)

O_ASYNC (异步IO, 使用信号机制实现, 不推荐, 直接用aio_xxx)

O_NOATIME (读取的时候不更新文件 atime(access time))

sync() 全局缓存写回磁盘

fsync() 特定fd的sync()

fdatasync() 只刷数据, 不同步元数据

mount noatime(全局不记录atime), re方式(只读), sync(同步方式)

一个IO的传奇一生 这里有一篇非常好的资料,讲述了整个IO过程;

下面简单记录下自己的理解的一次常见的Linux IO过程, 想了解更详细及相关源码,非常推荐阅读上面的原文

Linux IO体系结构

[站外上传中(image-38a7b-1644137945193)]

Superblock 超级描述了整个文件系统的信息。为了保证可靠性,可以在每个块组中对superblock进行备份。为了避免superblock冗余过多,可以采用稀疏存储的方式,即在若干个块组中对superblock进行保存,而不需要在所有的块组中都进行备份

GDT 组描述符表 组描述符表对整个组内的数据布局进行了描述。例如,数据块位图的起始地址是多少?inode位图的起始地址是多少?inode表的起始地址是多少?块组中还有多少空闲块资源等。组描述符表在superblock的后面

数据块位图 数据块位图描述了块组内数据块的使用情况。如果该数据块已经被某个文件使用,那么位图中的对应位会被置1,否则该位为0

Inode位图 Inode位图描述了块组内inode资源使用情况。如果一个inode资源已经使用,那么对应位会被置1

Inode表 (即inode资源)和数据块。这两块占据了块组内的绝大部分空间,特别是数据块资源

一个文件是由inode进行描述的。一个文件占用的数据块block是通过inode管理起来的 。在inode结构中保存了直接块指针、一级间接块指针、二级间接块指针和三级间接块指针。对于一个小文件,直接可以采用直接块指针实现对文件块的访问;对于一个大文件,需要采用间接块指针实现对文件块的访问

最简单的调度器。它本质上就是一个链表实现的 fifo 队列,并对请求进行简单的 合并 处理。

调度器本身并没有提供任何可以配置的参数

读写请求被分成了两个队列, 一个用访问地址作为索引,一个用进入时间作为索引,并且采用两种方式将这些request管理起来;

在请求处理的过程中,deadline算法会优先处理那些访问地址临近的请求,这样可以最大程度的减少磁盘抖动的可能性。

只有在有些request即将被饿死的时候,或者没有办法进行磁盘顺序化操作的时候,deadline才会放弃地址优先策略,转而处理那些即将被饿死的request

deadline算法可调整参数

read_expire : 读请求的超时时间设置(ms)。当一个读请求入队deadline的时候,其过期时间将被设置为当前时间+read_expire,并放倒fifo_list中进行排序

write_expire :写请求的超时时间设置(ms)

fifo_batch :在顺序(sort_list)请求进行处理的时候,deadline将以batch为单位进行处理。每一个batch处理的请求个数为这个参数所限制的个数。在一个batch处理的过程中,不会产生是否超时的检查,也就不会产生额外的磁盘寻道时间。这个参数可以用来平衡顺序处理和饥饿时间的矛盾,当饥饿时间需要尽可能的符合预期的时候,我们可以调小这个值,以便尽可能多的检查是否有饥饿产生并及时处理。增大这个值当然也会增大吞吐量,但是会导致处理饥饿请求的延时变长

writes_starved :这个值是在上述deadline出队处理第一步时做检查用的。用来判断当读队列不为空时,写队列的饥饿程度是否足够高,以时deadline放弃读请求的处理而处理写请求。当检查存在有写请求的时候,deadline并不会立即对写请求进行处理,而是给相关数据结构中的starved进行累计,如果这是第一次检查到有写请求进行处理,那么这个计数就为1。如果此时writes_starved值为2,则我们认为此时饥饿程度还不足够高,所以继续处理读请求。只有当starved >= writes_starved的时候,deadline才回去处理写请求。可以认为这个值是用来平衡deadline对读写请求处理优先级状态的,这个值越大,则写请求越被滞后处理,越小,写请求就越可以获得趋近于读请求的优先级

front_merges :当一个新请求进入队列的时候,如果其请求的扇区距离当前扇区很近,那么它就是可以被合并处理的。而这个合并可能有两种情况,一个是向当前位置后合并,另一种是向前合并。在某些场景下,向前合并是不必要的,那么我们就可以通过这个参数关闭向前合并。默认deadline支持向前合并,设置为0关闭

在调度一个request时,首先需要选择一个一个合适的cfq_group。Cfq调度器会为每个cfq_group分配一个时间片,当这个时间片耗尽之后,会选择下一个cfq_group。每个cfq_group都会分配一个vdisktime,并且通过该值采用红黑树对cfq_group进行排序。在调度的过程中,每次都会选择一个vdisktime最小的cfq_group进行处理。

一个cfq_group管理了7棵service tree,每棵service tree管理了需要调度处理的对象cfq_queue。因此,一旦cfq_group被选定之后,需要选择一棵service tree进行处理。这7棵service tree被分成了三大类,分别为RT、BE和IDLE。这三大类service tree的调度是按照优先级展开的

通过优先级可以很容易的选定一类Service tree。当一类service tree被选定之后,采用service time的方式选定一个合适的cfq_queue。每个Service tree是一棵红黑树,这些红黑树是按照service time进行检索的,每个cfq_queue都会维护自己的service time。分析到这里,我们知道,cfq算法通过每个cfq_group的vdisktime值来选定一个cfq_group进行服务,在处理cfq_group的过程通过优先级选择一个最需要服务的service tree。通过该Service tree得到最需要服务的cfq_queue。该过程在 cfq_select_queue 函数中实现

一个cfq_queue被选定之后,后面的过程和deadline算法有点类似。在选择request的时候需要考虑每个request的延迟等待时间,选择那种等待时间最长的request进行处理。但是,考虑到磁盘抖动的问题,cfq在处理的时候也会进行顺序批量处理,即将那些在磁盘上连续的request批量处理掉

cfq调度算法的参数

back_seek_max :磁头可以向后寻址的最大范围,默认值为16M

back_seek_penalty :向后寻址的惩罚系数。这个值是跟向前寻址进行比较的

fifo_expire_async :设置异步请求的超时时间。同步请求和异步请求是区分不同队列处理的,cfq在调度的时候一般情况都会优先处理同步请求,之后再处理异步请求,除非异步请求符合上述合并处理的条件限制范围内。当本进程的队列被调度时,cfq会优先检查是否有异步请求超时,就是超过fifo_expire_async参数的限制。如果有,则优先发送一个超时的请求,其余请求仍然按照优先级以及扇区编号大小来处理

fifo_expire_sync :这个参数跟上面的类似,区别是用来设置同步请求的超时时间

slice_idle :参数设置了一个等待时间。这让cfq在切换cfq_queue或service tree的时候等待一段时间,目的是提高机械硬盘的吞吐量。一般情况下,来自同一个cfq_queue或者service tree的IO请求的寻址局部性更好,所以这样可以减少磁盘的寻址次数。这个值在机械硬盘上默认为非零。当然在固态硬盘或者硬RAID设备上设置这个值为非零会降低存储的效率,因为固态硬盘没有磁头寻址这个概念,所以在这样的设备上应该设置为0,关闭此功能

group_idle :这个参数也跟上一个参数类似,区别是当cfq要切换cfq_group的时候会等待一段时间。在cgroup的场景下,如果我们沿用slice_idle的方式,那么空转等待可能会在cgroup组内每个进程的cfq_queue切换时发生。这样会如果这个进程一直有请求要处理的话,那么直到这个cgroup的配额被耗尽,同组中的其它进程也可能无法被调度到。这样会导致同组中的其它进程饿死而产生IO性能瓶颈。在这种情况下,我们可以将slice_idle = 0而group_idle = 8。这样空转等待就是以cgroup为单位进行的,而不是以cfq_queue的进程为单位进行,以防止上述问题产生

low_latency :这个是用来开启或关闭cfq的低延时(low latency)模式的开关。当这个开关打开时,cfq将会根据target_latency的参数设置来对每一个进程的分片时间(slice time)进行重新计算。这将有利于对吞吐量的公平(默认是对时间片分配的公平)。关闭这个参数(设置为0)将忽略target_latency的值。这将使系统中的进程完全按照时间片方式进行IO资源分配。这个开关默认是打开的

target_latency :当low_latency的值为开启状态时,cfq将根据这个值重新计算每个进程分配的IO时间片长度

quantum :这个参数用来设置每次从cfq_queue中处理多少个IO请求。在一个队列处理事件周期中,超过这个数字的IO请求将不会被处理。这个参数只对同步的请求有效

slice_sync :当一个cfq_queue队列被调度处理时,它可以被分配的处理总时间是通过这个值来作为一个计算参数指定的。公式为: time_slice = slice_sync + (slice_sync/5 (4 - prio)) 这个参数对同步请求有效

slice_async :这个值跟上一个类似,区别是对异步请求有效

slice_async_rq :这个参数用来限制在一个slice的时间范围内,一个队列最多可以处理的异步请求个数。请求被处理的最大个数还跟相关进程被设置的io优先级有关

通常在Linux上使用的IO接口是同步方式的,进程调用 write / read 之后会阻塞陷入到内核态,直到本次IO过程完成之后,才能继续执行,下面介绍的异步IO则没有这种限制,但是当前Linux异步IO尚未成熟

目前Linux aio还处于较不成熟的阶段,只能在 O_DIRECT 方式下才能使用(glibc_aio),也就是无法使用默认的Page Cache机制

正常情况下,使用aio族接口的简要方式如下:

io_uring 是 2019 年 5 月发布的 Linux 51 加入的一个重大特性 —— Linux 下的全新的异步 I/O 支持,希望能彻底解决长期以来 Linux AIO 的各种不足

io_uring 实现异步 I/O 的方式其实是一个生产者-消费者模型:

逻辑卷管理

RAID0

RAID1

RAID5(纠错)

条带化

Linux系统性能调整:IO过程

Linux的IO调度

一个IO的传奇一生

理解inode

Linux 文件系统是怎么工作的?

Linux中Buffer cache性能问题一探究竟

Asynchronous I/O and event notification on linux

AIO 的新归宿:io_uring

Linux 文件 I/O 进化史(四):io_uring —— 全新的异步 I/O

top命令的其他参数代表的含义详见top命令详解

sar 命令是分析系统瓶颈的神器,可以用来查看 CPU 、内存、磁盘、网络等性能。

sar 命令查看当前磁盘性能的命令为:

测试环境还费这劲,重装个新系统就是了,花不了多少时间。

2620开始,Linux内核才支持对IO的统计,所以就算找其他工具,也不太容易达到你的要求。可以试试把/proc/sys/vm/block_dump设为1,让内核把对Block的读写dump到日志中,之后再从dmesg命令的输出中想办法去查找读写最多的进程。别忘了最后再把block_dump设成0,这对系统性能影响很大。

另外有个不太准确的办法,ps命令可以显示进程的状态,ps -eo pid,state,其中状态D是“Uninterruptible sleep (usually IO)”,占用IO多的进程,应该IO等待也多,所以写个小脚本,每秒打出状态为D的进程,占用IO多的进程肯定在里面。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » linux查看磁盘io的几种方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情