我们为什么要关注业务的IO行为,或者IO访问模型呢?原因很简单,任何系统都要关注自己服务的对象,存储系统服务的对象就是上层应用,所以存储的研发离不开对业务行为的分析和研究。存储系统的整体设计和架构,是多种因素综合权衡的结果。在存储系统性能达到极限的时候,无论是存储的开发者还是使用者,都想知道IO的具体表现行为,开发者是为了能够找到瓶颈点,更好地优化存储系统,使用者是为了能够更优地使用存储系统,让业务稳定运行。
常见业务类型的IO特点
我们先基于几个典型的业务场景,介绍一下这些场景下IO模型的特点。
记录日志
日志文件通常情况都是追加写入,在每一次写之前,都需要调用statfs获取文件大小,以此作为pos(新内容插入位置)写入数据,因此write和statfs的请求比例是1:1。反过来,如果发现在某个客户端的请求统计中发现,write/stat请求比例接近1:1,基本可以断定,此客户端上的业务基本上是文件的追加写业务。如果面对这种日志IO类型在存储整体访问中占比比较高的用户,在需要提升系统整体性能时,可以建议用户扩大日志文件的写入buffer,从而减少write/stat的请求次数,达到性能优化的效果。
系统命令du/ls
操作系统的几个命令对于分布式文件存储来说,都不是特别友好,比如说ls/du,尤其是du命令。du命令会调用readdir,获取entry列表,再依此调用statfs获取文件size,如果是目录,还会递归查询统计,因此是多个readdir和多个statfs请求的组合,并且穿插调用,对于多MDS架构的文件系统,通常每个MDS都会处理大量readdir和statfs的请求。ls命令也是readdir和stat的组合,但是跟du不同的是,ls只会统计单一目录下的stat信息,因此是一个readdir和多个statfs请求。假如日常巡检的时候发现某个MDS负载较高,可以查看该MDS的负载类型,如果都集中在readdir/statfs,那么基本可以断定,有业务在执行系统统计命令,可以根据请求发送的客户端IP,获取到是哪个客户端发起的请求,进而可以查到是哪个业务触发的系统指令。
数据库
数据库的读写比例一般符合二八原则,20%是写,80%为读,在写的时候,以8KB,16KB为主,并且每一个写请求都会附带一个fsync请求和一个fdatasync请求,用来保证数据持久化到存储上,对于采用buffered cache的分布式文件存储,fsync带来的系统开销会比较大,进而导致数据库的写入性能较差,假如用户有数据业务的需求,建议采用direct IO的方式。MySQL的存储引擎InnoDB中有一项设置——innodb_flush_method,这项设置负责控制InnoDB写入数据时所使用的系统调用。我们会建议用户采用O_DIRECT_NO_FSYNC,即只使用O_DIRECT方式,绕过pagecache,将数据直接写入磁盘,并在写操作时跳过fsync()更新日志的元数据信息。在8.0.14版本之后, MySQL会在创建文件、增加文件长度以及关闭文件时自动调用fsync()来更新MySQL文件在文件系统中的元数据信息。
AI训练
大家都知道,在AI训练过程中,数据90%以上都是读操作,并且是小文件的顺序读或大文件的随机读。在训练过程中,数据集是不会被修改和删除的,元数据的操作集中在open/close/stat/revalidate,不会有特殊的元数据操作,数据操作就是read。基于这种IO特点,当需要进一步提升性能时,可以选择性弱化某些POSIX语义,甚至是降低数据的一致性,比如说在客户端增加弱化一致性之后的读缓存,从而大大提升训练过程中对数据的读取速度,缩短训练时间。
分析业务IO模型的方法
分析业务IO的模型有两种方式,可以通过阅读业务的源码,或者是通过存储系统提供的IO分析工具。然而,阅读业务源码大多数时候并不现实,而且对于存储开发人员或者运维人员,也没有这个必要,所以更多时候,只能依靠存储系统提供的IO分析工具。
在大规模存储系统中,分析业务的IO行为是一套非常复杂的流程,尤其是分布式文件存储,文件存储需要实现一套标准POSIX语义的文件接口,丰富的接口带来的困扰就是需要监控和分析更多的IO操作类型,分析的难度也就更大。对文件存储来说,我们需要关注两类IO,元数据和数据。元数据IO主要包括文件/目录的元数据操作,比如说open/close/mkdir/rmdir/stat/unlink/revalidate/hardlink/rename等,数据IO主要包括read/write,在统计read/write的时候,还要统计对应的IOPS和BW。遗憾的是,市场上常用的文件存储产品和方案也很少提供方便的工具帮助管理员系统地了解业务IO特点。
我们是怎么做的
俗话说,工欲善其事,必先利其器。为了能够对各种业务系统IO特点有更深入和全面的掌握, YRCloudFile专门实现了一套IO统计框架,方便管理员实时了解和分析业务IO特点,我们也可以通过这个功能对存储系统做针对性的优化。
当YRCloudFile客户端连接到存储集群后,集群将自动加载并开始监控客户端的元数据及数据请求行为,同时在界面上实时展示。
- 元数据请求:客户端为了获取元数据信息而做的请求,请求类型多种多样,一般来说,比较常发生的元数据请求大概可以分为3类:
- 文件数据请求:指的是客户端或者元数据服务为了获取文件数据或者信息所做的请求,注意并不是所有文件数据请求都是读写文件数据本身的。文件数据请求主要有以下8种:
YRCloudFile的客户端监控功能,涵盖了35项元数据操作请求和17项文件数据操作请求,用户可以根据生产的实际情况来设置最常使用的OPS选项作为重点观察项。该功能不仅能实时展示各OPS的情况,还能按天平均和周平均OPS来展示、排序和导出,为CTO和管理团队对系统资源的调配、优化运营提供精准的数据支撑。
通过这个功能,用户可以很清晰地看到各个客户端的IO统计分布。同时也可以根据自身情况,选择性监控某些操作类型和某些客户端,还可以根据某种操作类型进行排队,让用户能够快速定位和分析各个客户端的情况。焱融科技的研发团队也可以根据这些IO特征的分析,为用户的业务进行针对性的系统优化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。