linux ext4文件系统

  磁盘分配 原来 在write系统调用时
  磁盘分配 现在 在数据回写到磁盘时
 
  磁盘分配 原来 调用write系统函数,系统首先内存分配空间,并保存数据在内存上,等待数据回写到磁盘的命令;
                在保存到内存的同时,系统为数据在磁盘上分配了相应的空间。
  磁盘分配 现在 调用write系统函数,系统首先内存分配空间,并保存数据在内存上,等待数据回写到磁盘的命令;
                在保存到内存的同时,系统没有为数据在磁盘上分配了相应的空间,仅仅查询是否有已经为这些数据分配过磁盘块,标记。
                为的是尽量让同一个文件拥有连续的磁盘空间。
                
  磁盘分配 原来 每5秒文件系统会触发数据回写到磁盘
  磁盘分配 现在 每30秒文件系统会触发数据回写到磁盘,这样需要分配的磁盘块很多。
                在调用write系统函数时,查询是否已经为这些数据分配过磁盘块,系统需要一把 读 锁。
                当系统批量分配磁盘空间回写数据时,系统需要读锁,还需要写锁。
                锁的互斥性造成调用write系统函数时,进程会阻塞在等待批量分配磁盘空间和回写数据的完成。
                
  我们使用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挂载参数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值