共计 1000 个字符,预计需要花费 3 分钟才能阅读完成。
一、Linux 存储堆栈图
当应用 read() 和 write() 零碎调用向内核提交读写 I/O 申请操作时须要经验的步骤:
1)首先,申请通过虚构文件系统,虚构文件系统提供了对立的文件和文件系统的相干接口,屏蔽了不同文件系统的差别和操作细节;
2)其次,适配以后磁盘分区的文件系统,常见文件系统有 ext2/3/4、FATfs、sysfs、debugfs 等;
3)再次,内核将 I/O 申请交给 I/O 调度层进行排序和合并解决。通过 I/O 调度层加工解决后,将 I/O 申请发送给块设施驱动进行最终的 I/O 操作;
4)最初,通过总线协定对数据进行下盘或者读取操作。
二、零碎调用函数与存储介质替换
- SQL 查问执行过程:
- 客户端发送一条查问给服务器
- 服务器优先查看查问缓存,如果命中了缓存,则立即返回缓存中的后果,否则进入下一阶段
- 服务器端进行 SQL 解析、预处理,再由优化器生成对应的执行打算
- 依据优化器生成的执行打算,再调用存储引擎的 API 来执行查问
- 最初将后果返回给客户端
三、操作系统对于优化存储堆栈的参数
1) dirty_background_ratio:内存能够填充“脏数据”的百分比
这些“脏数据”后续将写入磁盘,后盾过程会清理脏数据。比方现有 32G 内存,那么有 3.2G 的内存能够待着内存中,假如超过 3.2G 就会有起初过程来刷盘;
2) dirty_ratio 是相对的脏数据限度,内存里的脏数据百分比不能超过这个值
如果脏数据超过这个数量,新的 IO 申请将会被阻挡,直到脏数据被写进磁盘。这是造成 IO 卡顿的重要起因,但也是保障内存中不会存在适量脏数据的爱护机制;
3) dirty_expire_centisecs 指定脏数据能存活的工夫
默认数值是 30 秒。当后盾过程在刷盘时,它会查看是否有数据超时,如果超时就会触发刷盘操作,尽量躲避数据在内存中贮存过久后的失落危险。
四、IO 优化在 KaiwuDB 中的利用实际
1) 通过观察 CPU 应用状况并借助火焰图,发现 KaiwuDB 内核程序过程内的性能瓶颈点,包含但不限于:
a. 过程服务压力与后盾服务解决能力不匹配;
b. 操作系统参数设置不匹配导致 CPU 占用低;
2) 通过 iostat 和 vmstat 察看磁盘性能工具,发现过程写入速度与后盾处理速度、磁盘处理速度不匹配,须要进行参数调优;
3) 借助 KaiwuDB 外部的日志及性能统计工具(Trace 功能模块和监控工具 KAP),发现某些利用及服务的性能瓶颈,调整优化过程程序逻辑。