磁盘分配 原来 在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挂载参数.
磁盘分配 现在 在数据回写到磁盘时
磁盘分配 原来 调用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挂载参数.