一 前言

最近忙着给YOUZAN的数据库服务器升级系统版本,从centos6 升级到centos7。centos/redhat 7 默认将文件系统设置为xfs。咨询了很多DBA朋友,他们已经升级到7 并且使用xfs很久。于是我们也随大流打算使用xfs文件系统。

本文聊聊 XFS 系统的基础知识,并且做一些性能优化方面的压测。

二 XFS 介绍

2.1 介绍

XfS文件系统是SGI( Silicon Graphics,Inc)开发的高性能的日志文件系统,XFS极具伸缩性,非常健壮。特别擅长处理大文件,同时提供平滑的数据传输。

2.2 特性

数据完全性

采用XFS文件系统,当意想不到的宕机发生后,首先,由于文件系统开启了日志功能,所以你磁盘上的文件不再会意外宕机而遭到破坏了。不论目前文件系统上存储的文件与数据有多少,文件系统都可以根据所记录的日志在很短的时间内迅速恢复磁盘文件内容。

传输特性

XFS文件系统采用优化算法,日志记录对整体文件操作影响非常小。XFS查询与分配存储空间非常快。xfs文件系统能连续提供快速的反应时间。笔者曾经对XFS、JFS、Ext3、ReiserFS文件系统进行过测试,XFS文件文件系统的性能表现相当出众。

可扩展性

XFS 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大 小为263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为18 exabytes。

XFS使用高的表结构(B+树),保证了文件系统可以快速搜索与快速空间分配。XFS能够持续提供高速操作,文件系统的性能不受目录中目录及文件数量的限制。

传输带宽

XFS 能以接近裸设备I/O的性能存储数据。在单个文件系统的测试中,其吞吐量最高可达7GB每秒,对单个文件的读写操作,其吞吐量可达4GB每秒。

容量

XFS是一个64位文件系统,最大支持 8exbibytes 减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在 16tebibytes。

注: 上述内容源自网络资料汇总。

三 性能压测

之前一篇压测centos7 vs centos6 的性能对比,没有详细说明机器以及数据库实例配置,很多读者提供建议压测对比一定要加上基础环境相关的配置,这样显得比较严谨。(这次加上 ^_^)

3.1 机器配置

压测方法:使用sysbench分为 12 24 36 48 60 72 个线程压测,采用oltp complex 模式,10 * 500万的记录,压测24小时,每个阶段的间隔为10分钟。

OS CentOS Linux release 7.2.1511 (Core) 3.10.0-327.el7.x86_64

mount 挂载参数

  1. 参数一  defaults,noatime,nobarrier


  2. 参数二  defaults,nobarrier


  3. 参数三  defaults

三种挂载参数下的数据库压测性能结果基本一致,无明显差异。

MySQL 相关参数

压测版本:percona 5.7.22-22-log
binlog_format[ROW] max_binlog_cache_size[4G] max_binlog_size[1G]
sync_binlog[1] 
table_definition_cache[1424]
table_open_cache[2048]
thread_cache_size[1024]
innodb_adaptive_flushing[ON] 
innodb_adaptive_hash_index[ON]
innodb_buffer_pool_instances[8]
innodb_buffer_pool_size[5G]
innodb_flush_log_at_trx_commit[1]
innodb_flush_method[O_DIRECT]
innodb_io_capacity[5000]
innodb_log_buffer_size[16M] 
innodb_log_file_size[2G] 
innodb_read_io_threads[32]
innodb_stats_on_metadata[OFF] 
innodb_thread_concurrency[24] 
innodb_write_io_threads[24]

SSD 机器是以10块960G SSD 做RAID5 RAID 缓存策略:WB

3.2性能压测结果

主要是和ext4的性能对比

select  性能  蓝色线是xfs ,黄色线是ext4

xfs vs ext4 性能压测对比_JAVA

insert/delete  黄色线 为xfs ,蓝色线是ext4

xfs vs ext4 性能压测对比_JAVA_02

update 绿色线 为xfs ,蓝色线是ext4

xfs vs ext4 性能压测对比_JAVA_03

io 利用率   ext4的io利用率比xfs 的高。

xfs vs ext4 性能压测对比_JAVA_04

cpu 绿色线 为xfs ,黄色线是ext4 ,xfs的cpu利用率略高。

xfs vs ext4 性能压测对比_JAVA_05

3.3 结论

高并发压力下 xfs 的性能比 ext4 高 5-10% 左右。对应的io利用率 xfs 明显比ext4低,但是cpu 比较高 如果qps tps 在5000以下 etf4 和xfs系统无明显差异。压测过程中 xfs 在高并发 72个并发情况下出现thread_running 抖动,而ext4 表现比较稳定。

四 拓展

可能的空间满报错

如果大家在网上搜索xfs的文章可能会搜到磁盘空间剩余很多,但是却报错空间不足的问题,大意就是xfs文件系统会把inode存储在磁盘最开始的这1T空间里,如果这部分空间被完全填满了,那么就会出现磁盘空间不足的错误提示了。解决办法就是在挂载时,指定 inode64 选项:

mount -o remount -o noatime,nodiratime,inode64,nobarrier /dev/sdb1 /backup

这个在内核3.7以后的版本 已经解决了。其实默认defaults 挂载参数是

(rw,noatime,attr2,inode64,sunit=128,swidth=512,noquota)

优化哪些事儿

当我们选择一个新的技术或者另一种技术时,都特别会在意性能问题。比如我们要压测xfs系统的性能。结合网上的资料以及官方文档(redhat),本文着重说几点。

1 挂载参数默认defaults就好,压测结果与其他几种显示无明显差异。

2 noatime 和 realtime 访问方式在xfs上差异也不大。select 的性能压测结果

xfs vs ext4 性能压测对比_JAVA_06

3 写入屏障

"XFS文件系统默认在挂载时启用“写入屏障”的支持。该特性会一个合适的时间冲刷下级存储设备的写回缓存,特别是在XFS做日志写入操作的时候。这个特性的初衷是保证文件系统的一致性,具体实现却因设备而异——不是所有的下级硬件都支持缓存冲刷请求。在带有电池供电缓存的硬件RAID控制器提供的逻辑设备上部署XFS文件系统时,这项特性可能导致明显的性能退化,因为文件系统的代码无法得知这种缓存是非易失性的。如果该控制器又实现了冲刷请求,数据将被不必要地频繁写入物理磁盘。为了防止这种问题,对于能够在断电或发生其它主机故障时保护缓存中数据的设备,应该以 nobarrier 选项挂载XFS文件系统。"

我自己的压测结果中带或者不带nobarrier  参数,性能差异不明显。后续有新的测试会在文章留言中更新。

最后援引wiki上的话

xfs vs ext4 性能压测对比_JAVA_07

阅读原文连接即可达到wiki地址。本文是自己的总结,难免有不准确的地方。 欢迎压测过xfs或者已经大规模使用xfs的读者朋友一起讨论。

-The End-


本公众号长期关注于数据库技术以及性能优化,故障案例分析,数据库运维技术知识分享,个人成长和自我管理等主题,欢迎扫码关注。

xfs vs ext4 性能压测对比_JAVA_08