性能指标
老规矩,咱们先来回顾一下,描述 I/O 的性能指标有哪些?你能够先回想一下文件系统和磁盘 I/O 的原理,结合下面这张 Linux 系统的 I/O 栈图,凭着记忆和理解本身写一写。或者,你也能够打开前面的文章,挨个复习总结一下。mysql
说了这么久的 I/O 性能知识,一提及 I/O 指标,你应该首先会想到分类描述。咱们要区分开文件系统和磁盘,分别用不一样指标来描述它们的性能。ios
文件系统I/O性能指标
咱们先来看文件系统的状况。redis
首先,最容易想到的是存储空间的使用状况,包括容量、使用量以及剩余空间等。咱们一般也称这些为磁盘空间的使用量,由于文件系统的数据最终仍是存储在磁盘上。sql
不过要注意,这些只是文件系统向外展现的空间使用,而非在磁盘空间的真实用量,由于文件系统的元数据也会占用磁盘空间。数据库
并且,若是你配置了 RAID,从文件系统看到的使用量跟实际磁盘的占用空间,也会由于RAID 级别的不一样而不同。比方说,配置 RAID10 后,你从文件系统最多也只能看到全部磁盘容量的一半。缓存
除了数据自己的存储空间,还有一个容易忽略的是索引节点的使用状况,它也包括容量、使用量以及剩余量等三个指标。若是文件系统中存储过多的小文件,就可能碰到索引节点容量已满的问题。网络
其次,你应该想到的是前面屡次提到过的缓存使用状况,包括页缓存、目录项缓存、索引节点缓存以及各个具体文件系统(如 ext四、XFS 等)的缓存。这些缓存会使用速度更快的内存,用来临时存储文件数据或者文件系统的元数据,从而能够减小访问慢速磁盘的次数。工具
除了以上这两点,文件 I/O 也是很重要的性能指标,包括 IOPS(包括 r/s 和 w/s)、响应时间(延迟)以及吞吐量(B/s)等。在考察这类指标时,一般还要考虑实际文件的读写状况。好比,结合文件大小、文件数量、I/O 类型等,综合分析文件 I/O 的性能。oop
诚然,这些性能指标很是重要,但不幸的是,Linux 文件系统并没提供,直接查看这些指标的方法。咱们只能经过系统调用、动态跟踪或者基准测试等方法,间接进行观察、评估。不过,实际上,这些指标在咱们考察磁盘性能时更容易见到,由于 Linux 为磁盘性能提供了更详细的数据。性能
磁盘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 性能指标,直接进行分析对比。这是很常见的一个误区,你必定要避免。
除了这些指标外,在前面 Cache 和 Buffer 原理的文章中,我曾屡次提到,缓冲区(Buffer)也是要重点掌握的指标,它常常出如今内存和磁盘问题的分析中。
文件系统和磁盘 I/O 的这些指标都颇有用,须要咱们熟练掌握,因此我总结成了一张图,帮你分类和记忆。你能够保存并打印出来,方便随时查看复习,也能够把它当成 I/O 性能分析的“指标筛选”清单使用。
性能工具
掌握文件系统和磁盘 I/O 的性能指标后,咱们还要知道,怎样去获取这些指标,也就是搞明白工具的使用问题。
第一,在文件系统的原理中,我介绍了查看文件系统容量的工具 df。它既能够查看文件系统数据的空间容量,也能够查看索引节点的容量。至于文件系统缓存,咱们经过/proc/meminfo、/proc/slabinfo 以及 slabtop 等各类来源,观察页缓存、目录项缓存、索引节点缓存以及具体文件系统的缓存状况。
第二,在磁盘 I/O 的原理中,咱们分别用 iostat 和 pidstat 观察了磁盘和进程的 I/O 状况。它们都是最经常使用的 I/O 性能分析工具。经过 iostat ,咱们能够获得磁盘的 I/O 使用率、吞吐量、响应时间以及 IOPS 等性能指标;而经过 pidstat ,则能够观察到进程的 I/O吞吐量以及块设备 I/O 的延迟等。
第三,在狂打日志的案例中,咱们先用 top 查看系统的 CPU 使用状况,发现 iowait 比较高;而后,又用 iostat 发现了磁盘的 I/O 使用率瓶颈,并用 pidstat 找出了大量 I/O 的进程;最后,经过 strace 和 lsof,咱们找出了问题进程正在读写的文件,并最终锁定性能问题的来源——原来是进程在狂打日志。
第四,在磁盘 I/O 延迟的单词热度案例中,咱们一样先用 top、iostat ,发现磁盘有 I/O瓶颈,并用 pidstat 找出了大量 I/O 的进程。可接下来,想要照搬上次操做的咱们失败了。在随后的 strace 命令中,咱们竟然没看到 write 系统调用。因而,咱们换了一个思路,用新工具 filetop 和 opensnoop ,从内核中跟踪系统调用,最终找出瓶颈的来源。
最后,在 MySQL 和 Redis 的案例中,一样的思路,咱们先用 top、iostat 以及 pidstat ,肯定并找出 I/O 性能问题的瓶颈来源,它们正是 mysqld 和 redis-server。随后,咱们又用 strace+lsof 找出了它们正在读写的文件。
关于 MySQL 案例,根据 mysqld 正在读写的文件路径,再结合 MySQL 数据库引擎的原理,咱们不只找出了数据库和数据表的名称,还进一步发现了慢查询的问题,最终经过优化索引解决了性能瓶颈。
至于 Redis 案例,根据 redis-server 读写的文件,以及正在进行网络通讯的 TCPSocket,再结合 Redis 的工做原理,咱们发现 Redis 持久化选项配置有问题;从 TCPSocket 通讯的数据中,咱们还发现了客户端的不合理行为。因而,咱们修改 Redis 配置选项,并优化了客户端使用 Redis 的方式,从而减小网络通讯次数,解决性能问题。
性能指标和工具的联系
同前面 CPU 和内存板块的学习同样,我建议从指标和工具两个不一样维度出发,整理记忆。
从 I/O 指标出发,你更容易把性能工具同系统工做原理关联起来,对性能问题有宏观的认识和把握。而从性能工具出发,可让你更快上手使用工具,迅速找出咱们想观察的性能指标。特别是在工具备限的状况下,咱们更要充分利用好手头的每个工具,少许工具也要尽力挖掘出大量信息。
第一个维度,从文件系统和磁盘 I/O 的性能指标出发。换句话说,当你想查看某个性能指标时,要清楚知道,哪些工具能够作到。
根据不一样的性能指标,对提供指标的性能工具进行分类和理解。这样,在实际排查性能问题时,你就能够清楚知道,什么工具能够提供你想要的指标,而不是毫无根据地挨个尝试,撞运气。
虽然你不须要把全部相关的工具背下来,但若是能记清楚每一个指标对应的工具特性,实际操做起来,必定能更高效、灵活。
这里,我把提供 I/O 性能指标的工具作成了一个表格,方便你梳理关系和理解记忆。你能够把它保存并打印出来,随时记忆。固然,你也能够把它当成一个“指标工具”指南来使用。
下面,咱们再来看第二个维度。
第二个维度,从工具出发。也就是当你已经安装了某个工具后,要知道这个工具能提供哪些指标。
这在实际环境中,特别是生产环境中也是很是重要的。由于不少状况下,你并无权限安装新的工具包,只能最大化地利用好系统已有的工具,而这就须要你对它们有足够的了解。
具体到每一个工具的使用方法,通常都支持丰富的配置选项。不过不用担忧,这些配置选项并不用背下来。你只要知道有哪些工具,以及这些工具的基本功能是什么就够了。真正要用到的时候, 经过 man 命令,查它们的使用手册就能够了。
一样的,我也将这些经常使用工具汇总成了一个表格,方便你区分和理解。天然,你也能够当成一个“工具指标”指南使用,须要时查表便可。
如何迅速分析I/O的性能瓶颈
到这里,相信你对内存的性能指标已经很是熟悉,也清楚每种性能指标分别能用什么工具来获取。
你应该发现了,比起前两个板块,虽然文件系统和磁盘的 I/O 性能指标仍比较多,但核心的性能工具,其实就是那么几个。熟练掌握它们,再根据实际系统的现象,并配合系统和应用程序的原理, I/O 性能分析就很清晰了。
不过,无论怎么说,若是每次一碰到 I/O 的性能问题,就把上面提到的全部工具跑一遍,确定是不现实的。
在实际生产环境中,咱们但愿的是,尽量快地定位系统的瓶颈,而后尽量快地优化性能,也就是要又快又准地解决性能问题。
那有没有什么方法,能够又快又准地找出系统的 I/O 瓶颈呢?答案是确定的。
仍是那句话,找关联。多种性能指标间都有必定的关联性,不要彻底孤立的看待他们。想弄清楚性能指标的关联性,就要通晓每种性能指标的工做原理。这也是为何我在介绍每一个性能指标时,都要穿插讲解相关的系统原理,再次但愿你能记住这一点。
以咱们前面几期的案例为例,若是你仔细对比前面的几个案例,从 I/O 延迟的案例到MySQL 和 Redis 的案例,就会发现,虽然这些问题千差万别,但从 I/O 角度来分析,最开始的分析思路基本上相似,都是:
- 先用 iostat 发现磁盘 I/O 性能瓶颈;
- 再借助 pidstat ,定位出致使瓶颈的进程;
- 随后分析进程的 I/O 行为;
- 最后,结合应用程序的原理,分析这些 I/O 的来源。
因此,为了缩小排查范围,我一般会先运行那几个支持指标较多的工具,如 iostat、vmstat、pidstat 等。而后再根据观察到的现象,结合系统和应用程序的原理,寻找下一步的分析方向。我把这个过程画成了一张图,你能够保存下来参考使用。
图中列出了最经常使用的几个文件系统和磁盘 I/O 性能分析工具,以及相应的分析流程,箭头则表示分析方向。这其中,iostat、vmstat、pidstat 是最核心的几个性能工具,它们也提供了最重要的 I/O 性能指标。举几个例子你可能更容易理解。
例如,在前面讲过的 MySQL 和 Redis 案例中,咱们就是经过 iostat 确认磁盘出现 I/O 性能瓶颈,而后用 pidstat 找出 I/O 最大的进程,接着借助 strace 找出该进程正在读写的文件,最后结合应用程序的原理,找出大量 I/O 的缘由。
再如,当你用 iostat 发现磁盘有 I/O 性能瓶颈后,再用 pidstat 和 vmstat 检查,可能会发现 I/O 来自内核线程,如 Swap 使用大量升高。这种状况下,你就得进行内存分析了,先找出占用大量内存的进程,再设法减小内存的使用。
另外注意,我在这个图中只列出了最核心的几个性能工具,并无列出前面表格中的全部工具。这么作,一方面是不想用大量的工具列表吓到你。在学习之初就接触全部核心或小众的工具,不见得是好事。另外一方面,也是但愿你能先把重心放在核心工具上,毕竟熟练掌握它们,就能够解决大多数问题。
因此,你能够保存下这张图,做为文件系统和磁盘 I/O 性能分析的思路图谱。从最核心的这几个工具开始,经过我提供的那些案例,本身在真实环境里实践,拿下它们。
总结
本文,咱们一块儿复习了常见的文件系统和磁盘 I/O 性能指标,梳理了常见的 I/O 性能观测工具,并创建了性能指标和工具的关联。最后,咱们还总结了快速分析 I/O 性能问题的思路。
仍是那句话,虽然 I/O 的性能指标不少,相应的性能分析工具也有很多,但熟悉了各指标含义后,你就会天然找到它们的关联。顺着这个思路往下走,掌握经常使用的分析套路也并不难。