最近我们的服务进程遇到kill -15后处于Z的状态,变为了僵尸进程,经过/proc/{thread_id}/stack查看其上线程的栈,发现是卡在了fwrite的过程中,而我们的系统中所有文件系统挂载参数都使用了delalloc参数,怀疑是这个原因:ext4挂载的时候打开了delalloc选项,然后系统在没有分配磁盘块的情况下写写写,到page cache被回写到磁盘时,发现磁盘已经满了,没办法分配新的磁盘块了,就Hang住了。

这篇文章是淘宝内核组的刘峥同学在内部技术论坛上发表的一篇文章,但是由于刘峥同学目前没有blog,征得本人同意,贴在我的blog上,如果大家喜欢,请去新浪微博关注他。:)

日前线上在升级到Ext4文件系统后出现应用写操作延迟开销增大的问题。造成这一问题的根源目前已经查明,是由于Ext4文件系统的一个新特性——Delay Allocation造成的。(后面简称delalloc)

在详细分析这一问题之前,先来介绍一下Ext4文件系统的delalloc特性。这一特性简要概括起来就是将以前在buffer IO中每次写操作都会涉及的磁盘块分配过程推迟到数据回写时再进行。我们知道,在进行Buffer Write时,系统的实际操作仅仅是为这些数据在操作系统内分配内存页(page cache)并保存这些数据,等待用户调用fsync等操作强制刷新或者等待系统触发定时回写过程。在数据拷贝到page cache这一过程中,系统会为这些数据在磁盘上分配对应的磁盘块。

而在使用delalloc后,上面的流程会略有不同,在每次Buffer Write时,数据会被保存到page cache中,但是系统并不会为这些数据分配相应的磁盘块,仅仅会查询是否有已经为这些数据分配过磁盘块,以便决定后面是否需要为这些数据分配磁盘块。在用户调用fsync或者系统触发回写过程时,系统会尝试为标记需要分配磁盘块的这些数据分配磁盘块。这样,文件系统可以为这些属于同一个文件的数据分配尽量连续的磁盘空间,从而优化后续文件的访问性能(因为传统机械硬盘顺序读写的性能要比随机读写好很多)。

了解完delalloc特性的工作过程后,我们开始分析线上遇到的问题。线上应用的I/O模式可以简化为一个单线程追加写操作的程序,每秒写入2、3M数据,写操作后等待系统自动将数据回写到磁盘。在使用delalloc后,每次Buffer Write操作,系统都会去查询数据是否分配了磁盘块,这一过程需要获得一把读锁 (i_data_sem)。由于这时还没有触发回写操作,因此可以顺利获取i_data_sem,系统完成数据拷贝工作,并返回。由于仅仅是内存拷贝的过程,所以这一操作速度相当快。当系统开始进行回写操作时,系统会成批为数据分配磁盘块,这一过程同样需要获取i_data_sem,并且需要加写锁​以保证数据的一致性。由于使用delalloc后,需要分配的磁盘块比nodelalloc情况下多很多(nodelalloc情况下每5秒文件系统会提交日志触发回写;delalloc情况下,系统会在约每30秒左右触发一次回写),因此这一延迟时间较长。如果这时应用程序进行一次Buffer Write,则该操作在尝试获得i_data_sem时会等待上述磁盘块分配完成。由此造成写操作等待很长时间,从而影响应用程序的响应延迟。

在上面的分析中已经提到,delalloc是将多次磁盘块分配的过程合并到一次中来进行,那么是否真如预想的那样,delalloc的平均延迟会小于nodelalloc的情况呢?我们使用fio来做如下测试:设置bs=4k,单线程每秒追加写入5M,程序运行3分钟,我们来看一下最后fio对延迟的统计结果:

delalloc:
lat (usec): min=2 , max=193466 , avg= 5.86, stdev=227.91

nodelalloc:
lat (usec): min=3 , max=16388 , avg= 7.00, stdev=28.92

从上面的统计结果看,写操作的平均延迟:打开delalloc后为5.86us,关闭delalloc后为7.00us;最小延迟delalloc为2us,nodelalloc为3us;但是最大延迟delalloc为193.466ms,nodelalloc下仅为16.388ms。可见delalloc确实将多个写操作请求集中到了一起来进行。因此在提供较低平均延迟的情况下,会造成某次写操作的延迟较大。

通过上面的分析可以看到,目前会受到Ext4的delalloc特性影响的应用必须具备如下条件:
0. Buffer IO
1. 写操作过程中会涉及磁盘块的分配,主要是记录日志这类追加写操作;
2. 每次写操作后没有刷新数据,而是等待系统自动进行回写;
3. 对延迟有较高要求。

解决方法:关闭delalloc
1. mount -t ext4 -o remount,nodelalloc /${dev} /${mnt};
2. 编辑/etc/fstab中相关mount项,添加nodelalloc挂载参数

转载于:https://www.cnblogs.com/cobbliu/p/5603472.html

ext4文件系统的delalloc选项造成单次写延迟增加的分析相关推荐

  1. ext4 文件系统的优化

    ext4作为ext3的下一代,是Linux上的经典文件系统,功能上虽不及zfs.btrfs那么花哨,但是可靠实用,被广泛部署在企业级的生产环境中. ext4 作为一个通用文件系统,默认情况下已经工作良 ...

  2. linux虚拟文件系统(三)-ext4文件系统注册分析

    我们想要使用ext4文件系统,首先要把ext4文件系统注册到系统中,然后使用mount挂载文件系统,这样子就可以随便的操作里面的内容了,比如创建目录,创建文件,读写文件,删除文件等等,最后可以解挂文件 ...

  3. Linux fsync和fdatasync系统调用实现分析(Ext4文件系统)

    在Linux系统中,对文件系统上文件的读写一般是通过页缓存(page cache)进行的(DirectIO除外),这样设计的可以延时磁盘IO的操作,从而可以减少磁盘读写的次数,提升IO性能.但是性能和 ...

  4. Ext4文件系统架构分析(一)

    本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等 ...

  5. 在 Centos6/RHEL6 上恢复 ext4 文件系统下误删除的文件

    [root@xuegod63 ~]# rm -Rf / #执行不成功的, rm: 在"/" 进行递归操作十分危险 rm: 使用 --no-preserve-root 选项跳过安全模 ...

  6. 在Centos6/RHEL6上恢复ext4文件系统下误删除的文件

    在Centos6/RHEL6上恢复ext4文件系统下误删除的文件 [root@GDH ~]# rm -Rf / #执行不成功的, rm: 在"/" 进行递归操作十分危险 rm: 使 ...

  7. android ext4 损坏,EXT4文件系统损坏导致的实例无法启动的排查与修复

    现象 某现网局点进行POC时,发现某DN core掉,且一直无法启动. core文件堆栈和dn的pg_log日志中的堆栈信息一致. 堆栈中显示 checkpoint 时进行 buffer 落盘时导致c ...

  8. Linux内核学习:EXT4 文件系统在 Linux 内核系统中的读写过程

    目录 1 概述 2 虚拟文件系统 与 Ext4 文件系统 2.1 sys_write( ) 代码跟踪 2.2 sys_write( ) 过程分析 2.3 sys_write( ) 的核心部分 vfs_ ...

  9. 系统性学习Ext4文件系统(图例解析)

    Ext4文件系统布局综述 一个的Ext4文件系统被分成一系列块组.为减少磁盘碎片产生的性能瓶颈,块分配器尽量保持每个文件的数据块都在同一个块组中,从而减少寻道时间.以4KB的数据块为例,一个块组可以包 ...

最新文章

  1. Python 将字符串转为字典
  2. hdu 2516 FIB博弈模型
  3. Excel绘制甘特图
  4. 【CyberSecurityLearning 32】Apache配置、Apache的访问控制设定、LAMP平台的搭建
  5. MATLAB工具箱介绍
  6. Facebook 开源的快速文本分类器 FastTex
  7. Ubuntu server下“初始化月份字符串出错”的解决
  8. kbengine 的 nginx反向代理https/wss 配置 支持kbe负载均衡
  9. ZZULIOJ 1126: 布尔矩阵的奇偶性
  10. BZOJ2424 [HAOI2010]订货
  11. 面试非重复数字的全排列
  12. 独立站运营 | FaceBook营销神器——聊天机器人ManyChat
  13. 【JavaBigDecimal练习】利用BigDecimal精确计算欧拉数
  14. 2021年深圳市专精特新中小企业遴选申报指南
  15. 索尼M36h怎么刷第三方recovery?
  16. Docker容器化技术笔记
  17. 基于视频的车辆识别技术
  18. python 键盘钩子_WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例...
  19. 【Unity】PlayableGraph监控工具
  20. 因计算机丢失msvcp120d.dll,计算机中缺失MSVCP120D.dll和MSVCR120D.dll怎么解决

热门文章

  1. 如何开始了解一个新知识(Vuex)
  2. [css] 圣杯布局和双飞翼布局的理解和区别,并用代码实现
  3. [css] 你有用过sass中的Mixin功能吗?它有哪些作用?
  4. 工作239:内容过长省略号失败 直接改的样式表
  5. 前端学习(2002)vue之电商管理系统电商系统之绘制商品分类的级联选择器
  6. 前端学习(1179):vue概述
  7. 企业网站前端制作实战教程 JQuery CSS JS HTML 登录表单验证
  8. 前端学习(759):预解析案例
  9. mybatis学习(30):修改功能
  10. mybatis学习(14):log4j:ERROR Category option 1 not a decimal integer.