ext4XFS 是 Linux 系统中两种常用的文件系统,目前 RHEL 默认采用 XFS 文件系统,而 Ubuntu 默认采用 ext4 文件系统。

为什么两大发行版的选择不同呢?如果要部署 TDengine,应该选择哪个文件系统?

Ubuntu 和 RHEL 默认文件系统的不同,大概基于以下两点:

  1. Ubuntu 主要面向桌面用户,小文件操作占比高,而 ext4 在小文件操作方面具有优势。而 RHEL 主要是面向服务器,大文件、大并发写入场景较多。
  2. XFS 主要由 Red Hat 维护,因此 RHEL/CentOS/Fedora 这些发行版更倾向于 XFS。

ext3 与 XFS 对比

1. 概述

  • ext4
  • ext3 的升级版,具有更好的性能和扩展性。
  • 支持最大 1 EB(Exabyte)的文件系统和 16 TB 的单个文件。
  • 广泛用于大多数 Linux 发行版,是默认文件系统之一
  • XFS
  • 由 Silicon Graphics 开发,专注于高性能和大容量存储。
  • 支持最大 8 EB 的文件系统和 8 EB 的单个文件。
  • 在大型存储和高并发场景中表现优异。

2. 性能对比

特性

ext4

XFS

大文件性能

较好,但不如 XFS

优秀,特别适合大文件操作

小文件性能

优秀,适合大量小文件

较好,但不如 ext4

并发性能

一般,适合低并发场景

优秀,适合高并发场景

写入性能

较好,但延迟较高

优秀,延迟较低

元数据操作

较快

较慢,但支持延迟分配(延迟写入)


3. 功能对比

特性

ext4

XFS

最大文件系统大小

1 EB

8 EB

最大文件大小

16 TB

8 EB

日志功能

支持日志,可恢复性强

支持日志,可恢复性强

在线调整大小

支持在线扩展,不支持缩小

支持在线扩展,不支持缩小

快照功能

不支持

支持

延迟分配

不支持

支持,减少碎片化

碎片整理

支持(e4defrag)

不需要,延迟分配减少碎片


4. 适用场景

  • ext4
  • 适合大多数通用场景,尤其是桌面和小型服务器。
  • 适合需要频繁操作小文件的场景。
  • 适合对文件系统稳定性要求较高的场景。
  • XFS
  • 适合大容量存储和高并发场景(如数据库、视频处理)。
  • 适合需要处理大文件的场景。
  • 适合需要高性能写入的场景。

5. 优缺点总结

ext4
  • 优点
  • 成熟稳定,兼容性好。
  • 对小文件操作性能优秀。
  • 支持在线扩展。
  • 缺点
  • 对大文件和高并发支持较弱。
  • 不支持快照功能。
XFS
  • 优点
  • 对大文件和高并发支持优秀。
  • 延迟分配减少碎片化。
  • 支持快照功能。
  • 缺点
  • 对小文件操作性能不如 ext4。
  • 元数据操作较慢。

TDengine 在 ext4 和 XFS 上性能差异

ext4XFS 都是非常成熟的文件系统,但从稳定性和功能性来看,任何一种都能满足 TDengine 的部署要求。 但是从上面的介绍中,我们可以看出两个文件系统的在不同场景下性能是存在差异的。

为对比不同文件系统对 TDengine 读写性能的影响,我们选择在同一台服务器,分别安装不同操作系统版本和配置文件系统,进行对比测试。

1. 测试环境信息

为了对比 TDengine 在不同文件系统上的性能差异,我们选择了阿里云 ecs.c5.xlarge 服务器,配置为 4 核 8GB 内存 + 高效云盘。

操作系统分别选择了:CentOS 7.9,Ubuntu 22.04 和 Rocky Linux 8.9。

TDengine 版本为 3.3.5.4。

  • 数据库参数
name: test4419
         create_time: 2025-02-05 16:08:13.075
             vgroups: 4
             ntables: 6000
             replica: 1
              strict: on
            duration: 10d
                keep: 3650d,3650d,3650d
              buffer: 256
            pagesize: 4
               pages: 256
             minrows: 100
             maxrows: 4096
                comp: 2
           precision: ms
....
   encrypt_algorithm: none

数据的读写均采用了 TDengine 自带压测工具 taosBenchmark,使用方法见官网。

  • 数据写入
    并发 4 个写入线程,创建 6000 张表,每张表写入100000 条数据。
{
    "filetype":"insert",
    "cfgdir":"/etc/taos",
    "host":"localhost",
    "port":6030,
    "user":"root",
    "password":"taosdata",
    "thread_count":4,
    "thread_count_create_tbl":100,
    "num_of_records_per_req":1000,
    "confirm_parameter_prompt":"no",
    "databases":[{
    "dbinfo":{
    "name":"test4419",
    "cachemodel":"'both'",
    "cachesize":16,
    "vgroups":4,
    "drop":"yes"
    },
    "super_tables":[{
    "name":"meters",
    "child_table_exists":"no",
    "childtable_count":6000,
    "childtable_prefix":"tb_",
    "auto_create_table":"no",
    "batch_create_tbl_num":2000,
    "data_source":"rand",
    "insert_mode":"stmt",
    "insert_interval":0,
    "insert_rows":100000,
    "interlace_rows":1000,
    "max_sql_len":1048576,
    "disorder_ratio":0,
    "disorder_range":0,
    "timestamp_step":100,
    "start_timestamp":"2020-01-01 00:00:00",
    "sample_format":"csv",
    "sample_file":"",
    "tags_file":"",
    "columns": [{"type":"int","count":2},
    {"type":"float","count":2},
    {"type":"double","count":2},
    {"type":"bool","count":2},
    {"type":"bigint","count":2}],
    "tags":[{"type":"varchar","len":8,"count":1},
    {"type":"int","count":1}
    ]
    }]
    }]}
  • 数据查询

分布进行投影、聚会、缓存查询,每条语句查询 100 次。

query1:select * from ${db_name}.meters limit 100
query2:select last(*) from ${db_name}.meters
query3:select count(*) from ${db_name}.meters

查询示例如下:

{
        "filetype": "query",
        "cfgdir": "/etc/taos",
        "host": "localhost",
        "port": 6030,
        "user": "root",
        "password": "taosdata",
        "confirm_parameter_prompt": "no",
        "continue_if_fail": "yes",
        "databases": "test7202",
        "query_times": 100,
        "query_mode": "taosc",
        "specified_table_query": {
            "query_interval": 0,
            "concurrent": 4,
            "sqls": [
                {
                    "sql": "select * from test7202.meters limit 100",
                    "result": "./query1.log"
                }
            ]
        }
    }

2. 测试结果

CentOS 7.9

insert(r/s)

投影

last

count

XFS

787162.49

6.951

91.366

3.755

ext4

776243.06

6.771

104.877

3.746

Ubuntu 22.04

insert(r/s)

投影

last

count

XFS

806287.21

7.795

63.664

3.852

ext4

811195.23

8.069

59.907

3.877

Rocky Linux 8.9

insert(r/s)

投影

last

count

XFS

833747.28

8.087

78.064

4.084

ext4

806754.52

7.629

72.111

3.957


3. 测试结论

  1. Ubuntu 22.04 相比 CentOS 7.9 last 查询性能下降 40%,投影查询性能提升5%,聚合查询(count)无差异。
  2. Rock Linux 8.9 性能略高于 Ubunt 22.04,整体查询性能提升 5% 左右,写入性能无明显差异。
  3. 相同操作系统下,XFSext4 读写性能无明显差异。

4. 测试的局限性

  1. 测试用的数据集较小,可能无法体现 XFS 文件系统优势。
  2. 测试服务器配置较低,压测程序和 TDengine 服务端在同一台机器,造成干扰。

结论

根据以上对比测试,TDengine 在 ext4XFS 上性能无明显差异。因此文件系统爱选啥选啥。

PS: 之前在 2.6.x 版本测试时,ext4 + nobarrier 性能明显由于 XFS, 但在上面的测试中,性能变化并不明显(因此未附上测试结果)。