linux性能优化如何分析系统I/O瓶颈

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux性能优化如何分析系统I/O瓶颈相关的知识,希望对你有一定的参考价值。

如何快准狠定位系统的I/O瓶颈,并且梳理清楚在不同场景下指标工具怎么选,性能瓶颈又该如何定位?

一、性能指标

老规矩,回顾一下描述I/O的性能指标有哪些?

回想一下文件系统和磁盘I/O的原理,结合下面这张Linux系统的I/O栈图梳理一下
在这里插入图片描述
说起I/O指标应该首先会想到分类描述
要区分开文件系统和磁盘,分别用不同指标来描述它们的性能

1.1 文件系统I/O性能指标

先来看文件系统的情况

  • 存储空间使用情况

首先,最容易想到的是存储空间的使用情况,包括容量、使用量以及剩余空间等
通常也称这些为磁盘空间的使用量,因为文件系统的数据最终还是存储在磁盘上

注:这些只是文件系统向外展示的空间使用,而非在磁盘空间的真实用量,因为文件系统的元数据也会占用磁盘空间
而且如果配置了RAID,从文件系统看到的使用量跟实际磁盘的占用空间,也会因为RAID级别的不同而不一样。比如,配置RAID10后从文件系统最多也只能看到所有磁盘容量的一半

除了数据本身的存储空间,还有一个容易忽略的是索引节点的使用情况,它也包括容量、使用量以及剩余量等三个指标
如果文件系统中存储过多的小文件,就可能碰到索引节点容量已满的问题

  • 缓存使用情况

其次,应该想到的是缓存使用情况,包括页缓存、目录项缓存、索引节点缓存以及各个具体文件系统(如ext4、XFS等)的缓存
这些缓存会使用速度更快的内存用来临时存储文件数据或者文件系统的元数据,从而可以减少访问慢速磁盘的次数

  • 文件I/O

除了以上这两点,文件I/O也是很重要的性能指标,包括IOPS(包括r/s和w/s)、响应时间(延迟)以及吞吐量(B/s)等
在考察这类指标时,通常还要考虑实际文件的读写情况。 比如,结合文件大小、文件数量、I/O类型等,综合分析文件I/O的性能

诚然,这些性能指标非常重要,但不幸的是Linux文件系统并没提供直接查看这些指标的方法,只能通过系统调用、动态跟踪或者基准测试等方法间接进行观察、评估

不过,实际上这些指标在考察磁盘性能时更容易见到,因为Linux为磁盘性能提供了更详细的数据

1.2 磁盘I/O性能指标

接下来,具体看看哪些性能指标可以衡量磁盘I/O的性能

在磁盘I/O原理中曾提到过四个核心的磁盘I/O指标:

  • 使用率

指磁盘忙处理I/O请求的百分比
过高的使用率(比如超过60%)通常意味着磁盘I/O存在性能瓶颈

  • IOPS

Input/Output Per Second,指每秒的I/O请求数

  • 吞吐量

指每秒的I/O请求大小

  • 响应时间

指从发出 I/O 请求到收到响应的间隔时间

考察这些指标时,一定要注意综合I/O的具体场景来分析,比如:

  • 读写类型
    顺序还是随机
  • 读写比例
  • 读写大小
  • 存储类型
    有无RAID以及RAID级别、本地存储还是网络存储

注:大忌的是把不同场景的I/O性能指标直接进行分析对比,这是一定要避免的常见误区

除了这些指标外,缓冲区(Buffer)也是要重点掌握的指标,它经常出现在内存和磁盘问题的分析中

文件系统和磁盘 I/O 的这些指标都很有用,需要熟练掌握,将上述点总结归类如下:

在这里插入图片描述

二、性能工具

掌握文件系统和磁盘I/O的性能指标后,还要知道怎样去获取这些指标,也就是搞明白工具的使用问题

回顾一下具体有哪些I/O相关的性能工具

2.1 df

查看文件系统容量的工具

它既可以查看文件系统数据的空间容量,也可以查看索引节点的容量

2.2 /proc

通过/proc/meminfo、/proc/slabinfo以及slabtop等各种来源查看文件系统缓存,可以观察页缓存、目录项缓存、 索引节点缓存以及具体文件系统的缓存情况

2.3 iostat

观察磁盘的I/O情况,是最常用的I/O性能分析工具之一

通过iostat可以得到磁盘的I/O使用率、吞吐量、响应时间以及IOPS等性能指标

2.4 pidstat

观察进程的I/O情况,是最常用的I/O性能分析工具之一

通过pidstat可以观察到进程的I/O吞吐量以及块设备 I/O的延迟等

2.5 lsof

获取进程正在读写的文件

三、性能指标和工具的联系

同CPU和内存板块一样,从指标和工具两个不同维度出发进行整理梳理

  • 从I/O指标出发

把性能工具同系统工作原理关联起来,对性能问题有宏观的认识和把握

  • 从性能工具出发

更快上手使用工具并迅速找出想观察的性能指标,特别是在工具有限的情况下,使用少量工具尽力挖掘出大量信息

3.1 从I/O指标出发

第一个维度,从文件系统和磁盘I/O的性能指标出发
换句话说,当想查看某个性能指标时要清楚知道哪些工具可以做到

根据不同的性能指标,对提供指标的性能工具进行分类和理解,在实际排查性能问题时可以清楚知道什么工具可以提供想要的指标

将提供I/O性能指标的工具梳理成一个表格:

在这里插入图片描述
第二个维度,从工具出发。也就是当你已经安装了某个工具后,要知道这个工具能提供哪些 指标

3.2 从性能工具出发

第二个维度,从工具出发
换句话说,当已经安装了某个工具后要知道这个工具能提供哪些指标

注:
每个工具的使用一般都支持丰富的配置选项。不过这些配置选项并不用背下来。只需知道有哪些工具以及这些工具的基本功能就可以了,真正要用到时通过man命令查它们的使用手册即可

将这些常用工具梳理成一个表格:

在这里插入图片描述

四、如何迅速分析I/O的性能瓶颈

有没有什么方法可以又快又准地找出系统的I/O瓶颈呢?答案是肯定的

4.1 分析方法

还是那句话,找关联
多种性能指标间都有一定的关联性,不要完全孤立的看待他们。想弄清楚性能指标的关联性就要通晓每种性能指标的工作原理

4.2 分析思路

虽然问题千差万别,但从I/O角度分析,最开始的分析思路基本上类似,都是:

  1. 先用iostat发现磁盘I/O性能瓶颈
  2. 再借助pidstat定位出导致瓶颈的进程
  3. 随后分析进程的I/O行为
  4. 最后结合应用程序的原理,分析这些 I/O 的来源

4.3 缩小工具范围

所以,为了缩小排查范围,通常会:

  1. 运行那几个支持指标较多的工具,如 iostat、vmstat、pidstat等
  2. 再根据观察到的现象,结合系统和应用程序的原理,寻找下一步的分析方向

4.4 分析基本流程

把这个过程梳理成一张图:

在这里插入图片描述
图中列出了最常用的几个文件系统和磁盘I/O性能分析工具以及相应的分析流程,箭头表示分析方向
其中,iostat、vmstat、pidstat是最核心的几个性能工具,它们提供了最重要的I/O性能指标

4.5 分析栗子

举几个例子助于理解:

  • I/O进程写入文件
  1. 通过iostat确认磁盘出现I/O性能瓶颈
  2. 然后用pidstat找出I/O最大的进程
  3. 接着借助strace找出该进程正在读写的文件
  4. 最后结合应用程序的原理并找出大量I/O的原因
  • I/O内核线程
  1. 用iostat发现磁盘有I/O性能瓶颈
  2. 再用pidstat和vmstat检查,可能会发现I/O来自内核线程
    如Swap使用大量升高,这种情况下得进行内存分析,先找出占用大量内存的进程,再设法减少内存的使用

以上是关于linux性能优化如何分析系统I/O瓶颈的主要内容,如果未能解决你的问题,请参考以下文章

linux 性能优化之CPU性能

linux 性能优化之CPU性能

linux性能优化磁盘I/O性能优化思路

Day783.网络通信优化之I/O模型:如何解决高并发下I/O瓶颈 -Java 性能调优实战

磁盘I/O性能优化的几个思路

linux性能优化分析性能问题的一般步骤