现象:
客户在ext4文件系统下,以4KB数据块大小同步写性能在47MB/s左右,和PCI-E SSD 4K同步写性能200MB/s有差距。
根因分析:
1、文件系统下4KB同步写性能与200MB/s有差距,与文件系统行为有关。文件系统存在写放大,导致性能降低。
在裸设备下(无文件系统),以单进程4KB同步写,PCI-E SSD卡性能可以达到200MB/s。
在文件系统下,4KB同步写时,通过iostat命令看到的底层SSD写带宽也可达到200MB/s。
2、为什么ext3/ext4文件系统存在写放大?
由于ext3/ext4是具有Journal(日志卷)功能,上层程序每写一个I/O数据块到存储,文件系统都会同时更新数据块对应的Journal。
每个Journal大小是固定的,通常设置为32KB。也就是不管上层的I/O数据块多大,往存储每写一个数据块,都必须要更新32KB的Journal和4KB的Metadata。
即虽然上层程序只写4KB数据,但事实上写到PCI-E SSD上的数据量为4KB(客户数据)+32KB(文件系统的Journal)+4KB(Metadata)。若数据块大小为1MB,
写到PCI-E SSD上的数据量为1MB(客户数据)+ 32KB(文件系统的Journal)+ 4KB(Metadata)。且32KB的Journal会分为5个I/O写,进一步降低写性能。
写数据块大小为4KB时,写到 SSD的有效数据量只有4KB/(4KB+32KB+4KB) = 10%。
当数据块大小为32KB时,写到SSD的有效数据量为32KB/(32KB+32KB+4KB)= 47%
当数据块大小为512KB时,写到SSD的有效数据量512KB/(512KB+32KB+4KB)= 93.4%
注意:这里只是有效数据比例,和有效性能带宽不是一回事。
也就是小数据块下,同步写时,写到PCI-E SSD(所有存储介质都一样)的有效数据量小。
3、是否有性能提升方法?
由于写放大是文件系统的Journal日志更新导致,提升性能的唯一方法是尽可能减少Journal的更新或提升Journal写性能。
客户需要稳定、可靠的文件系统,故不能关闭ext3/ext4文件系统的Journal功能。
可能的性能提升手段:
- 格式化文件系统时,调整Journal Size大小。
- 调整文件系统mount是的Journal模式(data、ordered、writeback三种模式比较)。
转载请注明:爱开源 » Linux ext3/ext4文件系统中同步写放大问题