编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

性能分析-IO(性能分析 火焰图)

wxchong 2024-10-19 15:52:21 开源技术 9 ℃ 0 评论

要点

  • 关注哪些IO指标。
  • 如何定位IO相关性能问题。
  • 一些常见问题分析。

基本概念

文件系统

一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。

内存映射

把文件映射到进程地址空间,并直接存取内存地址。

零拷贝

与传统IO相比,零拷贝主要是用来解决两个问题:一是避免内核空间与用户空间数据多次拷贝;二是减少内核空间与用户空间之间的上下文切换。

DMA(Direct Memory Access 直接内存存储)

DMA技术是指,设备可以自己执行读或写总线事务,而不需要CPU干涉的过程。在DMA传送完成后,设备控制器会通过给CPU发送一个中断信号进行通知。

磁盘访问

首先,CPU将命令、逻辑块号和目的存储器地址写到与磁盘相关联的存储器映射地址,发起一个磁盘读;然后,磁盘控制器读扇区,并执行DMA(直接存储器访问)传送,将数据写至主存;最后,当DMA传送完成时,磁盘控制器用中断的方式通知CPU。

SSD(Solid State Disk固态硬盘)

SSD是一种基于闪存的存储技术,是由半导体存储器构成,其读速度要优于写速度。一个SSD由一个或多个闪存芯片和闪存翻译层组成。闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,对逻辑块的请求翻译成对底层物理设备的访问。

块设备

块设备的主要特性是:每一个块都能够被独立地寻址和访问。

裸I/O与直接I/O

裸I/O是指,绕过了个整个文件系统,直接发给磁盘地址。直接I/O是指,允许应用程序绕过缓存使用文件系统。

同步写

同步写完成的标志是,所有的数据以及必要的文件系统元数据被完整地写入到永久存储介质中。由于包含了物理IO延时,通常情况下会比异步写要慢。同步写的两种形式:

  • 单次同步写:使用O_SYNC(或其变体:O_DSYNC等)标志,打开一个文件后,这个文件的写都为同步。
  • 同步提交已写内容:调用fsync()系统调用,同步提交之前异步写入的数据。通过这种方式同步写合并,以便提高性能。

阻塞IO

一般来说,IO操作要么立刻结束,要么需要等待。如果需要等待,应用程序线程会被阻塞,并让出CPU。如果立刻返回,不等待,则称为非阻塞IO。使用O_NONBLOCK或O_NDELAY标志时,便使用非阻塞IO。

进程表、文件描述符表和i节点表

每个进程在进程表中都有一个记录项,记录项中包含有一张打开的文件描述符表。

每个文件描述符表包含:文件状态标志、当前文件偏移量和指向i节点的表项的指针。

每个i节点包含:文件类型、文件属主、文件大小、时间等信息。

为什么需要有一个中间表(文件描述符表)?是因为,每个进程都有自己的文件读写位置,与每个文件描述符相关的用来指明下一次读(写)从哪个字节开始的文件读写位置。

分析工具

iostat

查看统计IO设备负载情况。

# iostat -d -x 1
Linux 3.10.0-1127.19.1.el7.x86_64 (VM-0-11-centos)  2021年11月02日   _x86_64_  (1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     2.13    0.07    3.14     2.91    33.96    22.98     0.02    8.12   18.69    7.87   0.39   0.12
scd0              0.00     0.00    0.00    0.00     0.00     0.00   100.29     0.00    0.30    0.30    0.00   0.22   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
vda               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
scd0              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
  • rrqm/s、wrqm/s:每秒合并的读、写请求数。
  • r/s、w/s:每秒发送给磁盘的合并后的读写请求数。
  • rkB/s、wkB/s:每秒从磁盘读取和写入的KB数据量。
  • avgrq-sz、avgqu-sz:平均读写请求大小,单位:KB。
  • await、r_await、w_await:处理完成时间,包含等待时间和设备处理时间,单位:毫秒。
  • svctm:设备处理IO请求所需的平均时间,不含等待时间,这是个预估值,单位:毫秒。
  • %util:磁盘处理IO的时间百分比,

sar

查看IO相关的历史统计信息。

# sar -d 1
Linux 3.10.0-1127.19.1.el7.x86_64 (VM-0-11-centos)  2021年11月02日   _x86_64_  (1 CPU)

17时55分15秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
17时55分16秒  dev253-0      2.04      0.00     73.47     36.00      0.00      2.00      0.50      0.10
17时55分16秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

17时55分16秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
17时55分17秒  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
17时55分17秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

17时55分17秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
17时55分18秒  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
17时55分18秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
^C

17时55分18秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
17时55分19秒  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
17时55分19秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

平均时间:       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
平均时间:  dev253-0      0.58      0.00     20.87     36.00      0.00      2.00      0.50      0.03
平均时间:   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
  • tps:设备每秒数据传输量。
  • rd_sec/s、wr_sec/s:每秒读取和写入扇区数(512B)。其他字段与iostat相似。

pidstat

查看磁盘IO统计信息。

# pidstat -d 1 3
Linux 3.10.0-1127.19.1.el7.x86_64 (VM-0-11-centos)  2021年11月02日   _x86_64_  (1 CPU)

18时19分04秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
18时19分05秒     0      4183      0.00      3.96      0.00  barad_agent

18时19分05秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
18时19分06秒     0       260      0.00     60.00      0.00  jbd2/vda1-8
18时19分06秒     0      4184      0.00      8.00      0.00  barad_agent

18时19分06秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command

平均时间:   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
平均时间:     0       260      0.00     19.93      0.00  jbd2/vda1-8
平均时间:     0      4183      0.00      1.33      0.00  barad_agent
平均时间:     0      4184      0.00      2.66      0.00  barad_agent
  • kB_rd/s、kB_wr/s:每秒读写的KB数。
  • kB_ccwr/s:每秒取消地写入KB数,例如,写回前的覆盖写。

vfsstat

BCC工具集,统计VFS调用次数。

# ./vfsstat 1 5
TIME         READ/s  WRITE/s CREATE/s   OPEN/s  FSYNC/s
09:51:36:      2438     3553        0       75        0
09:51:37:      2504     3585        0       70        0
09:51:38:      2522     3599        0       69        0
09:51:39:      2391     3390        0       67        0
09:51:40:      2431     3480        0       70        0

biosnoop

BCC工具集,跟踪块设备的IO操作,并输出其相关信息。

# ./biosnoop
TIME(s)     COMM           PID    DISK    T SECTOR     BYTES  LAT(ms)
0.000000    jbd2/sda7-8    17981  sda     W 331635800  32768     0.25
0.000541    jbd2/sda7-8    17981  sda     W 331635864  4096      0.42
1.842862    kworker/u113:1 2474   sda     W 357137472  4096      0.50
1.842900    kworker/u113:1 2474   sda     W 357153856  4096      0.51
1.843142    kworker/u113:1 2474   sda     W 85986200   4096      0.72
1.843540    kworker/u113:1 2474   sda     W 284908608  4096      1.13

biolatency

BCC工具集,显示块设备IO的延时分布。

# ./biolatency
Tracing block device I/O... Hit Ctrl-C to end.
^C
     usecs               : count     distribution
         0 -> 1          : 0        |                                        |
         2 -> 3          : 0        |                                        |
         4 -> 7          : 0        |                                        |
         8 -> 15         : 0        |                                        |
        16 -> 31         : 0        |                                        |
        32 -> 63         : 0        |                                        |
        64 -> 127        : 0        |                                        |
       128 -> 255        : 1        |*************                           |
       256 -> 511        : 3        |****************************************|
       512 -> 1023       : 3        |****************************************|

分析策略

1、先从文件系统层分析,应用程序很可能是异步磁盘I/O,不受磁盘延迟影响。

2、查看文件系统的基本情况:df、mount等。 一个文件系统使用率超过90%,它的性能会下降。这是因为随着可用空间的减少,空余块越来越少,并且越来越分散,会导致顺序式的写负载变成随机写负载。

3、观察打开文件的情况,尤其是注意短期文件:lsof、opensnoop、filelife等。

4、查找非常慢的文件系统操作、延时和缓存命中率,按进程和文件名观察。

5、检查基本的磁盘性能指标,如:请求时长、IOPS、使用率:iostat。

6、跟踪块I/O延时分布,检查是否有多峰分布、延时超标的情况:biolatency。

7、单独跟踪具体的块I/O,找寻系统中的一些行为模式,例如是否有大量写入请求导致读队列增长等:biosnoop。

常见问题

读写延时高

一般情况下,读写延时指的是,一个文件系统逻辑请求从开始到结束的时间,它包括了消耗在文件系统物理IO的延时。因此,在分析延时的时候,首先要找出读写延时主要消耗在哪部分。如果延时在文件系统层面,则考虑合并IO请求等手段优化。如果延时在物理IO上,则考虑磁盘性能的优化,包括更换SSD等。

需要注意的一点是,如果应用程序和磁盘IO是异步的,那么磁盘IO延时可能不会直接影响应用程序性能。

mmap的优势

可以减少系统调用和上下文切换的开销。但是,需要注意的是,通过mmap进行内存映射时,其文件大小不能改变,否则,可能会引发系统崩溃。

参考

《Systems Performance:Enterprise and Cloud》

《BPF Performance Tools》

《Computer Systems》

《Modern Operating Systems》

http://www.brendangregg.com/linuxperf.html

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表