当前位置:首页 » 操作系统 » linuxio查看

linuxio查看

发布时间: 2023-03-16 05:33:38

‘壹’ linux服务器硬件情况的查看

1、首先是对于CPU的说明
服务器CPU性能参数主要信息可以通过查看 /proc/cpuinfo 获得。具体查看指令及效果如下:

显示这台服务器上有2个物理CPU

显示这台服务器的物理核数为16个

显示运行模式为64位

显示为Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz

命令:

显示此服务器的线程数为64

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

1.命令格式:

top [参数]

2.命令功能:

显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

3.命令参数:

-b 批处理

-c 显示完整的治命令

-I 忽略失效过程

-s 保密模式

-S 累积模式

-i<时间> 设置间隔时间

-u<用户名> 指定用户名

-p<进程号> 指定进程

-n<次数> 循环显示的次数

4.使用实例:

实例1:通过 Top 命令显示进程信息

命令:

统计信息区:

前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。

第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:

10:38:58 — 当前系统时间

up 39 days, 19:47 — 系统已经运行了39天19小时47分钟(在这期间系统没有重启过的吆!)

1 users — 当前有1个用户登录系统

load average: 0.00, 0.00, 0.00 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程),具体信息说明如下:

系统现在共有769个进程,其中处于运行中的有1个,463个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

第三行,cpu状态信息,具体属性说明如下:

0.0%us — 用户空间占用CPU的百分比。

0.0% sy — 内核空间占用CPU的百分比。

0.0% ni — 改变过优先级的进程占用CPU的百分比

100.0% id — 空闲CPU百分比

0.0% wa — IO等待占用CPU的百分比

0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比

0.0% si — 软中断(Software Interrupts)占用CPU的百分比

备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!

第四行,内存状态,具体信息如下:

65600012k total — 物理内存总量

1785256k used — 使用中的内存总量

62385920k free — 空闲内存总量

1428836k buffers — 缓存的内存量

第五行,swap交换分区信息,具体信息说明如下:

2097148k total — 交换区总量

918340k used — 使用的交换区总量

1178808k free — 空闲交换区总量

备注:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第六行,空行。

第七行以下:各进程(任务)的状态监控,项目列信息说明如下:

PID — 进程id

USER — 进程所有者

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

TIME+ — 进程使用的CPU时间总计,单位1/100秒

COMMAND — 进程名称(命令名/命令行)

或者通过 free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

命令:

显示我当前的服务器的物理内存是62G,其中交换内存是2个G,一共剩余是60G的

三、查看Linux内核当前的系统版本号

命令:

显示的当前的服务器Linux内核是Ubuntu系统,版本号是18.04.6

‘贰’ 如何找出Linux系统高IO的思路总结

前言

I/O Wait是一个需要使用高级的工具来debug问题原因,当然也有许多基本工具的高级用法。I/O wait的问题难以定位的原因是:因为我们有很多工具可以告诉你I/O 受限了,但是并没有告诉你具体是哪个进程引起的。

1. 如何确认,是否是I/O问题导致系统缓慢

确认是否是I/O导致的系统缓慢我们可以使用多个命令,但是,最简单的是unix的命令 top

# top

top - 14:31:20 up 35 min, 4 users, load average: 2.25, 1.74, 1.68

Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie

Cpu(s): 2.3%us, 1.7%sy, 0.0%ni, 0.0%id, 96.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 245440k total, 241004k used, 4436k free, 496k buffers

Swap: 409596k total, 5436k used, 404160k free, 182812k cached

从CPU这行,可以发现CPU的io wait;这里是96.0%。越高就代表CPU用于io wait的资源越多。

2. 找出哪个磁盘正在被写入

上边的top命令从一个整体上说明了I/O wait,但是并没有说明是哪块磁盘影响的,想知道是哪块磁盘引发的问题,可以使用另外一个命令 iostat 命令

$ iostat -x 2 5

avg-cpu: %user %nice %system %iowait %steal %idle

  3.66 0.00 47.64 48.69 0.00 0.00

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

sda 44.50 39.27 117.28 29.32 11220.94 13126.70 332.17 65.77 462.79 9.80 2274.71 7.60 111.41

dm-0 0.00 0.00 83.25 9.95 10515.18 4295.29 317.84 57.01 648.54 16.73 5935.79 11.48 107.02

dm-1 0.00 0.00 57.07 40.84 228.27 163.35 8.00 93.84 979.61 13.94 2329.08 10.93 107.02

iostat 会每2秒更新一次,一共打印5次信息, -x 的选项是打印出扩展信息

第一个iostat 报告会打印出系统最后一次启动后的统计信息,这也就是说,在多数情况下,第一个打印出来的信息应该被忽略,剩下的报告,都是基于上一次间隔的时间。举例子来说,这个命令会打印5次,第二次的报告是从第一次报告出来一个后的统计信息,第三次是基于第二次 ,依次类推

所以,一定记住:第一个忽略!

在上面的例子中,sda的%utilized 是111.41%,这个很好的说明了有进程正在写入到sda磁盘中。

除了%utilized 外,我们可以从iostat得到更加丰富的资源信息,例如每毫秒读写请求(rrqm/s & wrqm/s)),每秒读写的((r/s & w/s)。在上边的例子中,我们的项目看起来正在读写非常多的信息。这个对我们查找相应的进程非常有用。

3. 找出导致高IO的进程

# iotop

Total DISK READ: 8.00 M/s | Total DISK WRITE: 20.36 M/s

  TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND

15758 be/4 root 7.99 M/s 8.01 M/s 0.00 % 61.97 % bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

最简单的方法就是用iotop找出哪个进程用了最多的存储资源,从上面可以看到是bonnie++。

iotop很好用,但是不是默认安装的。

如果没有iotop,下面的方式也可以让你有种方法缩小范围,尽快找到是哪个进程。

ps 命令对内存和CPU有一个统计,但是他没有对磁盘I/O的统计,虽然他没有显示磁盘I/O,但是它显示进行的状态,我们可以用来知道一个进程是否正在等待I/O

主要的进程状态有:

PROCESS STATE CODES

D uninterruptible sleep (usually IO)

R running or runnable (on run queue)

S interruptible sleep (waiting for an event to complete)

T stopped, either by a job control signal or because it is being traced.

W paging (not valid since the 2.6.xx kernel)

X dead (should never be seen)

Z defunct ("zombie") process, terminated but not reaped by its parent.

等待I/O的进程的状态一般是“uninterruptible sleep”,或者“D”,我们可以很容易的查找到正在等待I/O的进程

# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done

D 248 [jbd2/dm-0-8]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 22 [kswapd0]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 22 [kswapd0]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 22 [kswapd0]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

上边的例子会循环的输出状态是D的进程,每5秒一次,一共10次

从输出我们可以知道 bonnie++ 的pid是16528 ,在waiting,bonnie++看起来就是我们想找到的进程,但是,只是从它的状态,我们没有办法证明就是bonnie++引起的I/O等待。

为了证明,我们可以可以查看/proc,每个进程目录下都有一个叫io的文件,里边保存这和iotop类似的信息。

# cat /proc/16528/io

rchar: 48752567

wchar: 549961789

syscr: 5967

syscw: 67138

read_bytes: 49020928

write_bytes: 549961728

cancelled_write_bytes: 0

read_bytes和write_bytes是这个进程从磁盘读写的字节,在这个例子中,bonnie++进程读取了46M的数据并且写入了524MB的数据到磁盘上。

4. 找出哪个文件正在被大量写入

lsof 命令可以展示一个进程打开的所有文件。从这个列表中,我们可以找到哪个文件被写入。

# lsof -p 16528

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

bonnie++ 16528 root cwd DIR 252,0 4096 130597 /tmp

<truncated>

bonnie++ 16528 root 8u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 9u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 10u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 11u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 12u REG 252,0 501219328 131869 <strong>/tmp/Bonnie.16528</strong>

# df /tmp

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/mapper/workstation-root 7667140 2628608 4653920 37% /

# pvdisplay

  --- Physical volume ---

  PV Name /dev/sda5

  VG Name workstation

  PV Size 7.76 GiB / not usable 2.00 MiB

  Allocatable yes

  PE Size 4.00 MiB

  Total PE 1986

  Free PE 8

  Allocated PE 1978

  PV UUID CLbABb-GcLB-l5z3-TCj3-IOK3-SQ2p-RDPW5S

使用pvdisplay可以看到,pv设备就是/dev/sda5,正是我们前面找到的sda。

参考文档:http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

‘叁’ linux查看网络io使用率

sar -n DEV

不带其他参数 看当天的网络IO 缺省取样时间为1秒,间隔为10分钟
加 -f /var/log/sa/saxx可察看某日的历史,xx为当月或上月的日期(day of the month)前提是改文件存在

察看即时IO用sar -n DEV 1 999 表示取样间隔为1秒,取样999次

具体字段的含义我就不醉赘述了

‘肆’ linux怎样查看那个进程占用网络io

查看linux进程占用端口步骤如下:

  1. lsof -i 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具。以root用户来执行lsof -i命令,如下图


    ‘伍’ Linux 磁盘IO

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

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

    现代硬盘寻道都是采用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 5.1 加入的一个重大特性 —— 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

    ‘陆’ linux系统如何查看网络IO

    首先 、用top命令查看

    top - 16:15:05 up 6 days, 6:25, 2 users, load average: 1.45, 1.77, 2.14

    Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie

    Cpu(s): 0.2% us, 0.2% sy, 0.0% ni, 86.9% id, 12.6% wa, 0.0% hi, 0.0% si

    Mem: 4037872k total, 4003648k used, 34224k free, 5512k buffers

    Swap: 7164948k total, 629192k used, 6535756k free, 3511184k cached

    查看12.6% wa

    IO等待所占用的CPU时间的百分比,高过30%时IO压力高

    其次、 用iostat -x 1 10

    avg-cpu: %user %nice %sys %iowait %idle

    0.00 0.00 0.25 33.46 66.29

    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 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    sdb 0.00 1122 17.00 9.00 192.00 9216.00 96.00 4608.00 123.79 137.23 1033.43 13.17 100.10

    sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    查看%util 100.10 %idle 66.29

    如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

    idle小于70% IO压力就较大了,一般读取速度有较多的wait.

    同时可以结合vmstat 查看查看b参数(等待资源的进程数)

    vmstat -1

    如果你想对硬盘做一个IO负荷的压力测试可以用如下命令

    time dd if=/dev/zero bs=1M count=2048 of=direct_2G

    此命令为在当前目录下新建一个2G的文件

    我们在新建文件夹的同时来测试IO的负荷情况。

    ‘柒’ Linux如何查看与测试磁盘IO性能

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

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

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

    ‘捌’ 在linux系统中如何查看cpu和io

    在 Linux 系统中,可以使用以下命令查看 CPU 信息:

    • top: 显示系统进程的实时状态

    • htop: 与 top 类似,但提供了更多的信息和更好的可视化

    • mpstat: 显示多核 CPU 的状态

    • lscpu: 显示系统 CPU 的配置信息

    • 查看 IO 信息,可以使用以下命令:

    • iostat : 用于检测磁盘I/O的使用状况

    • vmstat : 用于检测虚拟内存的使用状况

    • mpstat : 用于检测 CPU 和磁盘I/O的使用状况

    • dstat : 用于检测磁盘I/O,网络,CPU等系统资源的使用状况

    • 需要注意的是这些命令需要安装对应的工具包

    ‘玖’ 如何查看linux是否开启异步IO

    查看linux是否开启异步IO命令如下:
    [DATA@localhost ~]$ cat /proc/slabinfo | grep kio
    kioctx 37 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0
    kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0
    返回结果中kiocp对应的前两项为0,说明系统中没有使用异步io。

    ‘拾’ linux查看磁盘io的几种方法

    linux查看磁盘io的几种方法

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

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

    Top可以看到的cpu信息有:

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

    Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si

    具体的解释如下:

    Tasks: 29 total 进程总数

    1 running 正在运行的进程数

    28 sleeping 睡眠的进程数

    0 stopped 停止的进程数

    0 zombie 僵尸进程数

    Cpu(s):

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

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

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

    98.7% id 空闲CPU百分比

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

    0.0% hi

    0.0% si

    0.0% 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            60.72        18.95        71.53  395637647 1493241908

    sda10          299.02      4266.67      129.41      4352        132

    sda10          483.84      4589.90      4117.17      4544      4076

    sda10          218.00      3360.00      100.00      3360        100

    sda10          546.00      8784.00      124.00      8784        124

    sda10          827.00    13232.00      136.00      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          1.56  28.31  7.84 31.50  43.65    3.16    21.82    1.58    1.19    0.03    0.80  2.61  10.29

    sda          1.98  24.75 419.80  6.93 13465.35  253.47  6732.67  126.73    32.15    2.00    4.70  2.00  85.25

    sda          3.06  41.84 444.90 54.08 14204.08 2048.98  7102.04  1024.49    32.57    2.10    4.21  1.85  92.24

    可以看到磁盘的平均响应时间<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有问题

热点内容
我的世界手机无人管理服务器 发布:2025-08-24 16:57:54 浏览:190
androidsdk32下载 发布:2025-08-24 16:36:35 浏览:266
安卓手机忘了解锁密码怎么办 发布:2025-08-24 16:35:09 浏览:789
存储过程在java代码 发布:2025-08-24 16:32:11 浏览:498
写编译器需要哪些知识 发布:2025-08-24 16:09:06 浏览:330
数据库的关系符号 发布:2025-08-24 16:02:29 浏览:626
sqlserver表值函数 发布:2025-08-24 15:56:27 浏览:554
linuxc内存泄露 发布:2025-08-24 15:54:30 浏览:112
python读取文件每一行 发布:2025-08-24 15:32:27 浏览:83
abbplc编程软件 发布:2025-08-24 15:31:43 浏览:210