当前位置:首页>Linux>Linux 文件系统性能深度对比:ext4 vs XFS vs Btrfs 选型指南

Linux 文件系统性能深度对比:ext4 vs XFS vs Btrfs 选型指南

  • 2026-04-16 15:57:37
Linux 文件系统性能深度对比:ext4 vs XFS vs Btrfs 选型指南

前言

文件系统是操作系统管理存储资源的核心组件,它决定了数据如何组织、存储和检索。在Linux环境中,ext4、xfs和btrfs是最常见的三种文件系统。它们各自采用不同的设计理念,在性能、可靠性、功能特性等方面存在显著差异。

对于运维工程师而言,理解文件系统的底层原理和性能特性是必备技能。本文面向初中级运维工程师,深入分析这三种文件系统的架构设计、核心特性、性能表现和适用场景,帮助读者在实际工作中做出合理的选择和配置。

本文不讨论网络文件系统如NFS、CephFS等,仅聚焦于本地磁盘文件系统的对比。内容涵盖从基础概念到生产调优的完整知识体系,适合需要管理和优化服务器存储的运维人员阅读。

第一章 文件系统基础原理

1.1 磁盘与文件系统

在理解文件系统之前,需要了解磁盘的基本结构。磁盘由大量扇区组成,每个扇区通常为512字节或4KB(高级格式化)。文件系统在磁盘扇区之上建立逻辑抽象,将裸盘转换为组织化的文件存储空间。

磁盘读取数据涉及机械寻道和旋转延迟,性能远低于内存访问。因此,文件系统通过缓存、预读、写回等技术优化性能。

典型的磁盘I/O延迟:

操作类型
延迟
说明
顺序读1MB
1-5ms
机械盘顺序读
随机读4KB
5-15ms
机械盘随机读
SSD随机读4KB
0.1-0.5ms
SSD无机械延迟
内存读4KB
0.01-0.05ms
CPU缓存命中最快

1.2 文件系统结构

文件系统在磁盘上创建结构化的存储空间。典型结构包括:

超级块(Superblock)存储文件系统元数据:总块数、空闲块数、块大小、文件系统状态、挂载时间等。超级块是文件系统的核心,损坏将导致文件系统无法挂载。文件系统通常在多个位置保存超级块副本以实现冗余。

inode表存储文件的元数据。每个文件对应一个inode,记录文件大小、权限、时间戳、数据块位置、链接计数等信息。文件名存储在目录条目中,而非inode中,这使得硬链接成为可能。

数据块是实际存储文件内容的空间。块大小影响存储效率和I/O性能。较大的块减少inode寻址开销但浪费磁盘空间,较小的块则相反。

目录结构采用层级组织,目录本身也是文件,其数据块存储子项列表。

1.3 日志文件系统

日志文件系统通过预写日志(WAL)机制提高文件系统一致性。写入数据前,文件系统先记录操作日志;操作完成后,将日志标记为已提交;如果系统崩溃,可通过重放日志恢复一致性状态。

日志机制避免了文件系统检查(fsck)扫描整个磁盘的漫长等待。在崩溃后,ext4的日志恢复通常只需数秒,而ext2的fsck可能需要数分钟甚至数小时。

ext4、xfs、btrfs都是日志文件系统,但日志方式有所不同:ext4使用ordered模式,数据写入日志后再写入数据块;xfs采用类似的日志机制;btrfs使用写时复制(COW)机制,天然具备事务特性。

1.4 VFS虚拟文件系统层

Linux通过虚拟文件系统(VFS)层抽象底层具体文件系统。这使得上层应用可以通过统一的POSIX接口访问不同类型的文件系统。

VFS定义了所有文件系统必须实现的接口:inode操作、file操作、superblock操作等。这使得ext4、xfs、btrfs可以共存于同一系统,上层应用无需关心底层实现细节。

第二章 ext4文件系统

2.1 历史与定位

ext4(Fourth Extended Filesystem)是ext系列文件系统的最新成员,由Theodore Ts'o等人开发。ext4于2006年开始开发,2008年随Linux 2.6.28进入主线内核,2019年达到完全成熟状态。

ext4是多数Linux发行版的默认文件系统,尤其适合桌面和服务器场景。它的设计目标是向后兼容ext3、提供更大的文件系统和文件尺寸限制、改进性能。

2.2 核心架构

ext4的磁盘布局基于块组概念。每个块组包含:超级块副本(部分块组)、块位图、inode位图、inode表、数据块。

ext4块组设计:

+------------------+<- 0
| Super Block      |
+------------------+
| Group Descriptors|
+------------------+
| Block Bitmap     |
+------------------+
| Inode Bitmap     |
+------------------+
| Inode Table      |
+------------------+
| Data Blocks      |
+------------------+
| ...              |
+------------------+<- 块大小

块组位图管理块分配,每个位代表一个块的使用状态。inode位图管理inode分配。inode表存储文件元数据。

ext4的inode大小默认为256字节,可配置为更大值以存储扩展属性。单个文件最大支持16TB,单个文件系统最大支持1EB(理论值,实际受限于硬件)。

2.3 关键技术特性

ext4引入了多项重大改进:

多块分配(Extent):ext4用extent替代传统的块映射。一个extent描述起始块和连续块数量,减少元数据开销。对于大文件,extent显著减少I/O操作次数。

旧方式(间接块映射):
块0 -> 块1024 -> 块2048 -> 块3072 ... (每个数据块位置单独记录)

新方式(Extent):
起始块: 0, 长度: 100000 (一条记录覆盖10万个连续块)

延迟分配(Allocate-on-Flush):ext4延迟写入数据,直到真正需要刷盘时才分配块。这允许文件系统合并多个小写入为单个大分配,提升顺序性和减少碎片。

校验和保护:ext4对journal数据块进行校验和验证,确保日志完整性。这可以检测到磁盘硬件错误导致的日志损坏。

元数据校验和:ext4支持对所有元数据进行校验和,提供更强的数据完整性保护。

2.4 挂载选项与配置

mkfs.ext4创建ext4文件系统:

# 基本创建
mkfs.ext4 /dev/sda1

# 指定块大小
mkfs.ext4 -b 4096 /dev/sda1

# 指定inode大小和数量
mkfs.ext4 -I 256 -N 1000000 /dev/sda1

# 创建带日志的文件系统(默认行为)
mkfs.ext4 -O journal_dev /dev/sdb1  # 创建独立日志设备
mkfs.ext4 -J device=/dev/sdb1 /dev/sda1  # 使用外部日志

# 禁用日志(提升性能但增加风险)
mkfs.ext4 -O ^has_journal /dev/sda1

# 指定卷标
mkfs.ext4 -L mydata /dev/sda1

# 创建后直接调整参数
mkfs.ext4 -E stride=128,stripe-width=1024 /dev/sda1

常用挂载选项:

# 标准挂载
mount -t ext4 /dev/sda1 /mnt/data

# 指定挂载选项
mount -t ext4 -o noatime,nodiratime,errors=remount-ro /dev/sda1 /mnt/data

# 查看当前挂载选项
mount | grep ext4

# 重新挂载修改选项
mount -o remount,noatime /mnt/data

ext4常用挂载选项说明:

选项
说明
性能影响
noatime
不更新文件访问时间
显著提升写入性能
nodiratime
不更新目录访问时间
轻微提升
relatime
仅在mtime更新时更新atime
平衡方案
barriers
启用写屏障
数据安全,轻微性能损失
nobarrier
禁用写屏障
性能提升,有数据丢失风险
data=ordered
数据写入前先写日志
默认模式
data=journal
所有数据写入日志
最安全,性能最低
data=writeback
日志模式,无顺序保证
性能最高,风险最大
journal_checksum
日志校验和
数据安全,轻微性能损失
journal_async_commit
日志异步提交
性能提升,风险增加

2.5 性能调优

系统级优化:

# 查看当前I/O调度器
cat /sys/block/sda/queue/scheduler

# 设置deadline调度器(适合数据库等随机读写场景)
echo deadline > /sys/block/sda/queue/scheduler

# 设置noop调度器(适合SSD)
echo noop > /sys/block/sda/queue/scheduler

# 调整read-ahead(预读)大小
blockdev --setra 8192 /dev/sda

# 查看预读值
blockdev --getra /dev/sda

# 永久生效:编辑/etc/udev/rules.d/60-scheduler.rules

创建文件系统时优化:

# stride和stripe-width优化(RAID环境)
# stride = 条带大小 / 块大小
# stripe-width = 条带数量 * stride
mkfs.ext4 -E stride=128,stripe-width=1024 /dev/md0

# 大文件场景优化inode ratio
mkfs.ext4 -i 8192 /dev/sda1  # 每8192字节一个inode

# 禁用日志(极端性能场景)
mkfs.ext4 -O ^has_journal /dev/sda1

sysctl调优:

# /etc/sysctl.conf 添加以下内容

# 增加预读缓存
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50

# 调整内核缓冲区
fs.ext4.max_writeback_mb = 1024

# 使配置生效
sysctl -p

2.6 碎片问题与处理

ext4长期使用后可能产生碎片,导致性能下降。

查看碎片情况:

# 查看ext4文件系统挂载选项
tune2fs -l /dev/sda1 | grep features

# 在线查看碎片(需要工具)
e4defrag -c /mnt/data

在线碎片整理:

# 整理单个文件
e4defrag /mnt/data/largefile.dat

# 整理整个目录
e4defrag /mnt/data/

# 整理整个文件系统
e4defrag /dev/sda1

预防碎片措施:使用合适的块大小、避免小文件堆积、预留足够空闲空间、使用noatime挂载选项。

2.7 检查与修复

文件系统检查:

# 查看文件系统状态
tune2fs -l /dev/sda1

# 检查文件系统(必须先卸载)
fsck.ext4 /dev/sda1

# 自动修复
fsck.ext4 -p /dev/sda1

# 强制检查
fsck.ext4 -f /dev/sda1

# 最大挂载次数后强制检查
tune2fs -c 50 /dev/sda1  # 50次挂载后检查

# 时间间隔强制检查
tune2fs -i 30d /dev/sda1  # 30天后检查

第三章 xfs文件系统

3.1 历史与定位

xfs最初由Silicon Graphics(SGI)于1993年开发,专为大规模存储和高性能计算场景设计。2001年,xfs以GPL协议开源并进入Linux内核。

xfs采用B+树管理元数据,在大文件和大容量场景下表现优异。它支持动态inode分配,inode数量根据使用空间自动调整。xfs的日志设计特别优化了并发性能,适合多线程高并发场景。

xfs是Red Hat、CentOS、RHEL等发行版的默认文件系统选择,也广泛部署于企业级存储系统中。

3.2 核心架构

xfs的磁盘布局采用allocation group(分配组)设计。文件系统创建时被划分为多个分配组,每个分配组独立管理自己的inode和空间。

xfs分配组架构:

+------------------+<- 0
| Super Block      |
+------------------+
| AG 0             |
|  +----------+    |
|  | AGF      |    |
|  +----------+    |
|  | AGFL     |    |
|  +----------+    |
|  | B+Tree   |    |
|  +----------+    |
|  | Data     |    |
|  +----------+    |
+------------------+
| AG 1             |
+------------------+
| ...              |
+------------------+

分配组设计使得xfs可以高效并行处理I/O操作。多个CPU核心可以同时在不同分配组上工作,充分利用现代多核处理器的能力。

xfs的元数据全部记录在B+树中:空闲空间管理使用B+树;inode索引使用B+树;目录管理使用B+树。这种设计在大规模文件系统上依然保持高效。

3.3 日志机制

xfs采用物理日志方式,日志记录完整的物理块变化。日志被循环使用,写满后覆盖。

xfs日志选项:

# mkfs时指定日志类型

# 外部日志设备(推荐生产环境)
mkfs.xfs -l logdev=/dev/sdb1,size=10g /dev/sda1

# 内部日志(默认)
mkfs.xfs /dev/sda1

# 延迟日志(性能最佳,数据风险略高)
mkfs.xfs -l version=2 /dev/sda1

# 日志大小建议:内存的64MB或64KB块数取较大值
mkfs.xfs -l size=131072 /dev/sda1  # 512MB日志(131072 * 4KB)

3.4 创建与配置

mkfs.xfs创建xfs文件系统:

# 基本创建
mkfs.xfs /dev/sda1

# 指定块大小(可选,默认4KB)
mkfs.xfs -b size=4096 /dev/sda1

# 指定inode大小和空间比例
mkfs.xfs -i size=512 -i maxpct=5 /dev/sda1

# 为SSD优化
mkfs.xfs -s size=4096 -i size=512 /dev/sda1

# 查看创建参数
mkfs.xfs -p /dev/sda1dryrun 2>&1 | head -50

# 创建带UUID
mkfs.xfs -uuid 12345678-1234-1234-1234-123456789abc /dev/sda1

3.5 挂载选项

xfs挂载选项:

# 标准挂载
mount -t xfs /dev/sda1 /mnt/data

# 带选项挂载
mount -t xfs -o noatime,nodiratime,logbufs=8,logdev=/dev/sdb1 /dev/sda1 /mnt/data

# 查看挂载选项
mount | grep xfs

# 重新挂载
mount -o remount,noatime /mnt/data

xfs常用挂载选项:

选项
说明
性能影响
noatime
不更新访问时间
提升性能
nodiratime
不更新目录访问时间
提升性能
noquota
禁用配额检查
提升性能
logbufs=8
日志缓冲区数量
平衡选项
logdev=device
使用外部日志设备
提升写入性能
wsync
同步所有元数据操作
数据安全,性能下降
barrier
启用写屏障
数据安全
nobarrier
禁用写屏障
性能提升,有风险
largeio
优化大I/O
大文件场景优化
inode32
inode32位限制
兼容性选项

3.6 配额管理

xfs原生支持配额管理:

# 启用配额挂载
mount -o uquota,gquota /dev/sda1 /mnt/data

# 用户配额
xfs_quota -x -c 'limit bsoft=100g bhard=110g uadmin /mnt/data'

# 查看配额使用
xfs_quota -x -c 'report -ubih /mnt/data'

# 软限制和硬限制
# bsoft: 软限制(警告)
# bhard: 硬限制(禁止超出)
# isoft: inode软限制
# ihard: inode硬限制

# 设置定时宽限期
xfs_quota -x -c 'timer -b 14days -i 7days /mnt/data'

3.7 备份与恢复

xfsdump备份:

# 完整备份(需卸载或只读挂载)
xfsdump -f /backup/xfs_backup.img /mnt/data

# 增量备份(需要先做完整备份)
xfsdump -f /backup/xfs_incremental.img -l 1 /mnt/data

# 多媒体备份
xfsdump -f - /mnt/data | ssh remotehost "cat > backup.img"

# 查看备份元数据
xfsrestore -I

# 恢复完整备份
xfsrestore -f /backup/xfs_backup.img /mnt/data_restore

# 交互式恢复
xfsrestore -i -f /backup/xfs_backup.img /mnt/data

3.8 性能调优

xfs提供了多种调优参数:

创建时优化:

# SSD优化配置
mkfs.xfs -l internal,size=128m -d su=64k,sw=4 /dev/sda1

# 参数说明
# su: stripe单元大小
# sw: stripe数量
# 对应RAID5/6配置

# 大文件优化
mkfs.xfs -l version=2,lazy-count=1 /dev/sda1

实时调优:

# 修改I/O调度
echo deadline > /sys/block/sda/queue/scheduler

# 设置预读
blockdev --setra 8192 /dev/sda

# 调节xfs缓冲参数
echo 1024 > /proc/sys/vm/xfs_collision_metasync_interval
echo 2048 > /proc/sys/vm/xfs_syncd_center_writes

# xfs_info查看文件系统参数
xfs_info /mnt/data

xfs_info输出示例解析:

meta-data=/dev/sda1              isize=512    agcount=8, agsize=262144 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=1
         =                       reflink=1
data     =                       bsize=4096   blocks=2097152, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal              bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks
realtime =none                  extsz=4096   blocks=0, rtextents=0

3.9 检查与修复

xfs_check和xfs_repair:

# xfs_check检查文件系统(需要卸载)
xfs_check /dev/sda1

# xfs_repair修复(需要卸载)
xfs_repair /dev/sda1

# 日志重放(自动在挂载时执行)
mount -t xfs /dev/sda1 /mnt/data

# 查看日志重放信息
dmesg | grep xfs

# 强制修复严重损坏
xfs_repair -L /dev/sda1

# 大文件系统修复优化(多线程)
xfs_repair -o force_geo_rebuild=1 /dev/sda1

第四章 btrfs文件系统

4.1 历史与定位

btrfs(B-tree Filesystem,发音为"butter-fs")由Chris Mason于2007年开始开发,旨在提供强大的可扩展性、可靠性和管理功能。btrfs融合了多种现代文件系统理念,包括写时复制、快照、校验和、集成卷管理等。

btrfs在2014年被SUSE Linux Enterprise和openSUSE采纳为默认文件系统,但随后因稳定性问题被部分撤回。2020年起,随着经过多年生产环境验证,btrfs在SUSE和Facebook等公司得到广泛使用。

btrfs的核心优势在于其丰富的企业级特性:原生支持快照和克隆、内置RAID支持、高效的增量备份、原生压缩支持。这些特性使它在特定使用场景下具有不可替代的价值。

4.2 写时复制机制

Copy-on-Write(COW)是btrfs的核心设计哲学。修改数据时,系统先将数据复制到新位置,修改完成后更新指针。这带来了几个重要特性:

原子性更新:任何时刻都可以安全地中断操作,旧数据保持完整。

无写入放大:同一数据块不需要先擦除再写入。

快照一致性:快照捕获的是写入完成时的状态,不存在部分写入问题。

# COW机制示意图
# 初始状态
Block A: [Data1]

# 修改Data1 -> Data2
# COW行为:分配新块写入
Block A: [Data1]
Block B: [Data2]

# 更新元数据指向新块
# Block A成为孤儿块,后续被垃圾回收

但COW也有代价:随机小写入会产生写入放大,同一文件的频繁修改会打散数据位置。btrfs通过使用NOCOW模式和数据块重定位来缓解这个问题。

4.3 核心架构

btrfs采用Extent树结构管理数据:

btrfs_super_block (0位置)
     |
     +-- chunk tree (分配块管理)
     |
     +-- tree root
           |
           +-- root tree (文件系统树)
                 |
                 +-- fs trees (每个subvolume一个)
                       |
                       +-- extent tree (数据位置)
                       |
                       +-- csum tree (校验和信息)
                       |
                       +-- device tree (设备信息)

btrfs的核心概念:

Chunk:逻辑存储单元,对应物理磁盘空间,由chunk tree管理。

Extent:连续的数据区域,替代传统的块映射。

Subvolume:独立的文件系统树,可以单独挂载。

Block Group:块的逻辑分组,包含data、metadata或system类型。

4.4 创建与配置

mkfs.btrfs创建文件系统:

# 基本创建
mkfs.btrfs /dev/sda1

# 多设备创建
mkfs.btrfs -d single /dev/sda1 /dev/sdb1

# RAID配置
# -d raid0/raid1/single/dup
# -m raid0/raid1/single/dup
mkfs.btrfs -d raid10 -m raid10 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

# 指定数据/元数据RAID级别
mkfs.btrfs -d raid5 -m raid1 /dev/sda1 /dev/sdb1

# 创建时禁用校验和(性能提升)
mkfs.btrfs -n none /dev/sda1

# 查看文件系统信息
btrfs filesystem show /mnt/data

4.5 Subvolume管理

btrfs的subvolume是核心概念之一:

# 创建subvolume
btrfs subvolume create /mnt/data/vol1

# 列出subvolume
btrfs subvolume list /mnt/data

# 列出所有快照和subvolume
btrfs subvolume list -o /mnt/data

# 挂载subvolume
mount -t btrfs -o subvol=vol1 /dev/sda1 /mnt/vol1

# 或使用subvolume ID
mount -t btrfs -o subvolid=256 /dev/sda1 /mnt/vol1

# 删除subvolume(必须先卸载)
btrfs subvolume delete /mnt/data/vol1

# 查看subvolume快照
btrfs subvolume list /mnt/data -s

4.6 快照功能

btrfs的快照是subvolume的只读副本:

# 创建快照
btrfs subvolume snapshot /mnt/data /mnt/data/snapshot-$(date +%Y%m%d)

# 创建可写快照
btrfs subvolume snapshot -r /mnt/data /mnt/data/snapshot-20240101

# 将快照设为可写
btrfs subvolume snapshot /mnt/data/snapshot-20240101 /mnt/data/vol1-restored

# 删除快照
btrfs subvolume delete /mnt/data/snapshot-20240101

# 查看快照信息
btrfs subvolume show /mnt/data/snapshot-20240101

快照工作原理:快照不复制数据,只创建新的subvolume元数据。原始数据和快照共享同一Extent,随着文件被修改,COW机制将数据分离到不同Extent。

4.7 压缩支持

btrfs支持透明压缩:

# 挂载时启用压缩
mount -t btrfs -o compress=zstd /dev/sda1 /mnt/data

# 指定压缩算法
mount -t btrfs -o compress=lzo /dev/sda1 /mnt/data
mount -t btrfs -o compress=zlib /dev/sda1 /mnt/data

# zstd压缩比和性能最佳,lzo延迟最低,zlib压缩比最高

# 在线调整压缩
btrfs filesystem defragment -r -v -clzo /mnt/data

# 查看压缩统计
btrfs filesystem df /mnt/data

# 压缩效果查看
btrfs filesystem du -s /mnt/data

压缩级别:

算法
压缩比
CPU使用
延迟
zstd
lzo
最低
zlib
最高

4.8 RAID配置

btrfs原生支持软件RAID:

# 创建RAID10(4设备)
mkfs.btrfs -d raid10 -m raid10 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

# 创建RAID5(3设备)
mkfs.btrfs -d raid5 -m raid5 /dev/sda1 /dev/sdb1 /dev/sdc1

# 创建RAID6(4设备)
mkfs.btrfs -d raid6 -m raid6 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

# 平衡操作(设备增减后必须执行)
btrfs balance start /mnt/data
btrfs balance status /mnt/data

# 仅平衡数据
btrfs balance start -dconvert=raid1 /mnt/data

# 查看RAID状态
btrfs device stats /mnt/data

# 添加新设备
btrfs device add /dev/sde1 /mnt/data

# 删除设备
btrfs device delete /dev/sdb1 /mnt/data

# 替换故障设备
btrfs replace start -f /dev/sdb1 /dev/sde1 /mnt/data

4.9 配额管理

btrfs quota组:

# 启用配额
btrfs quota enable /mnt/data

# 创建配额组
btrfs qgroup create 0/5 /mnt/data

# 设置限制
btrfs qgroup limit 100g /mnt/data /mnt/data/vol1

# 限制文件和inode数量
btrfs qgroup limit -n 100000 /mnt/data /mnt/data/vol1

# 查看配额使用
btrfs qgroup show /mnt/data

# 查看详细配额信息
btrfs qgroup show -r /mnt/data

4.10 性能调优

btrfs调优策略:

# SSD设备优化
mount -t btrfs -o compress,ssd,discard=async /dev/sda1 /mnt/data

# discard选项说明
# discard: 同步TRIM
# discard=async: 异步TRIM(推荐)
# discard=none: 禁用TRIM

# NOCOW模式(禁用写时复制,适合数据库)
mount -t btrfs -o nodatacow /dev/sda1 /mnt/data

# 或对特定文件禁用NOCOW
chattr +C /mnt/data/databasefile

# 预分配空间
fallocate -l 100G /mnt/data/largefile

# 碎片整理
btrfs filesystem defragment -r /mnt/data

# 压缩碎片整理
btrfs filesystem defragment -r -c /mnt/data

# 平衡(减少碎片)
btrfs balance start -dusage=85 /mnt/data

4.11 检查与修复

btrfs scrub(在线检查):

# 启动scrub检查(后台运行)
btrfs scrub start /mnt/data

# 查看scrub状态
btrfs scrub status /mnt/data

# 停止scrub
btrfs scrub cancel /mnt/data

# 恢复scrub(如中断)
btrfs scrub resume /mnt/data

# 定期scrub(systemd timer)
systemctl enable --now btrfs-scrub@-.timer

btrfs_check修复:

# 必须先卸载
umount /mnt/data

# 检查文件系统
btrfs check /dev/sda1

# 修复(尝试只读恢复)
btrfs check --readonly /dev/sda1

# 强制修复(可能丢失数据)
btrfs check --force /dev/sda1

# 使用备份超级块恢复
btrfs check --super-root /dev/sda1

第五章 性能测试方法

5.1 测试准备

性能测试前准备:

# 确认测试设备
lsblk

# 查看当前I/O调度器
cat /sys/block/sda/queue/scheduler

# 清空缓存
sync
echo 3 > /proc/sys/vm/drop_caches

# 确认无其他I/O活动
iostat -x 1 10

# 测试前确保足够空闲空间
df -h /mnt/test

5.2 fio基准测试

fio是最常用的I/O基准测试工具:

# 安装fio
apt-get install fio  # Debian/Ubuntu
yum install fio      # RHEL/CentOS

# 顺序读测试
fio --name=seq-read --filename=/mnt/test/seq_read --ioengine=libaio \
    --rw=read --bs=1m --size=1g --numjobs=4 --runtime=60 \
    --group_reporting --iodepth=32

# 顺序写测试
fio --name=seq-write --filename=/mnt/test/seq_write --ioengine=libaio \
    --rw=write --bs=1m --size=1g --numjobs=4 --runtime=60 \
    --group_reporting --iodepth=32

# 随机读测试
fio --name=rand-read --filename=/mnt/test/rand_read --ioengine=libaio \
    --rw=randread --bs=4k --size=1g --numjobs=8 --runtime=60 \
    --group_reporting --iodepth=64

# 随机写测试
fio --name=rand-write --filename=/mnt/test/rand_write --ioengine=libaio \
    --rw=randwrite --bs=4k --size=1g --numjobs=8 --runtime=60 \
    --group_reporting --iodepth=64

# 混合读写测试(70%读 30%写)
fio --name=mixed --filename=/mnt/test/mixed --ioengine=libaio \
    --rw=randrw --bs=4k --rwmixread=70 --size=1g --numjobs=8 \
    --runtime=60 --group_reporting --iodepth=64

# 数据库模拟(8K随机读写,70%读)
fio --name=db-workload --filename=/mnt/test/dbtest --ioengine=libaio \
    --rw=randrw --bs=8k --rwmixread=70 --size=2g --numjobs=16 \
    --runtime=120 --group_reporting --iodepth=128 --time_based

fio关键参数说明:

参数
说明
ioengine
I/O引擎(libaio/sync/posixaio)
rw
读写模式(read/write/randread/randwrite/randrw)
bs
块大小
size
总测试文件大小
numjobs
并发线程数
runtime
测试运行时间
iodepth
队列深度
group_reporting
汇总报告

5.3 测试脚本

完整的文件系统基准测试脚本:

#!/bin/bash
# fs_benchmark.sh - 文件系统基准测试脚本

TARGET_DIR="/mnt/test"
TEST_SIZE="2G"
DURATION=60

# 清理测试文件
rm -rf $TARGET_DIR/*

echo"=== 文件系统基准测试 ==="
echo"测试目录: $TARGET_DIR"
echo"测试大小: $TEST_SIZE"
echo"测试时长: $DURATION 秒"
echo""

# 顺序读
echo"[1/6] 顺序读测试..."
fio --name=seq-read --filename=$TARGET_DIR/seq_read \
    --ioengine=libaio --rw=read --bs=1m --size=$TEST_SIZE \
    --numjobs=4 --runtime=$DURATION --group_reporting --iodepth=32 \
    --direct=1 2>&1 | tee /tmp/fio_seq_read.log

# 顺序写
echo"[2/6] 顺序写测试..."
fio --name=seq-write --filename=$TARGET_DIR/seq_write \
    --ioengine=libaio --rw=write --bs=1m --size=$TEST_SIZE \
    --numjobs=4 --runtime=$DURATION --group_reporting --iodepth=32 \
    --direct=1 2>&1 | tee /tmp/fio_seq_write.log

# 随机读
echo"[3/6] 随机读测试..."
fio --name=rand-read --filename=$TARGET_DIR/rand_read \
    --ioengine=libaio --rw=randread --bs=4k --size=$TEST_SIZE \
    --numjobs=8 --runtime=$DURATION --group_reporting --iodepth=64 \
    --direct=1 2>&1 | tee /tmp/fio_rand_read.log

# 随机写
echo"[4/6] 随机写测试..."
fio --name=rand-write --filename=$TARGET_DIR/rand_write \
    --ioengine=libaio --rw=randwrite --bs=4k --size=$TEST_SIZE \
    --numjobs=8 --runtime=$DURATION --group_reporting --iodepth=64 \
    --direct=1 2>&1 | tee /tmp/fio_rand_write.log

# 混合读写
echo"[5/6] 混合读写测试 (70%读/30%写)..."
fio --name=mixed --filename=$TARGET_DIR/mixed \
    --ioengine=libaio --rw=randrw --bs=4k --rwmixread=70 \
    --size=$TEST_SIZE --numjobs=8 --runtime=$DURATION \
    --group_reporting --iodepth=64 --direct=1 2>&1 | tee /tmp/fio_mixed.log

# 数据库模拟
echo"[6/6] 数据库模拟测试..."
fio --name=db --filename=$TARGET_DIR/dbtest \
    --ioengine=libaio --rw=randrw --bs=8k --rwmixread=70 \
    --size=$TEST_SIZE --numjobs=16 --runtime=$DURATION \
    --group_reporting --iodepth=128 --direct=1 2>&1 | tee /tmp/fio_db.log

# 清理
rm -rf $TARGET_DIR/*

echo""
echo"=== 测试完成 ==="
echo"结果保存在 /tmp/fio_*.log"

5.4 结果解读

fio输出关键指标:

seq-read: (groupid=0, jobs=4)
read: IOPS=2503, BW=2503MiB/s (2625MB/s)

关键指标说明:

指标
说明
良好值参考
IOPS
每秒I/O操作数
SSD: 10万+
BW
带宽
SSD: 500MB/s+
lat avg
平均延迟
SSD: <1ms
lat 99%
99分位延迟
SSD: <5ms
cpu
CPU使用率
<80%正常
iops
单线程IOPS
体现并发效率

5.5 iozone测试

iozone是另一款广泛使用的文件系统测试工具:

# 安装iozone
apt-get install iozone3

# 自动测试
iozone -a -g 2G -i 0 -i 1 -i 2 -f /mnt/test/iozone.test

# 手动指定测试项目
# -i 0: 写测试
# -i 1: 重读测试
# -i 2: 随机访问测试
# -i 8: 混合读写测试

iozone -Ra -g 1G -n 512M -i 0 -i 1 -f /mnt/test/iozone.test

# 输出到Excel格式
iozone -Ra -+b /tmp/iozone.xls -g 1G /mnt/test/iozone.test

第六章 场景选型建议

6.1 ext4适用场景

ext4最适合以下场景:

通用服务器:ext4是最成熟稳定的选择,兼容性好,问题排查资料丰富。中小规模Web服务、文件共享存储、开发测试环境等通用场景首选ext4。

桌面系统:Ubuntu、Debian等桌面发行版的默认选择,图形界面和日常使用完全满足。

兼容性要求高的环境:需要与旧系统兼容、或者运维团队对ext4更熟悉的场景。

不需要高级特性的场景:如果只是存储普通文件,不需要快照、压缩、RAID原生支持等功能,ext4的简单反而是优势。

ext4不擅长的场景:大容量存储(>50TB)、需要频繁快照的高动态数据、需要原生压缩的场景、需要灵活RAID配置的场景。

6.2 xfs适用场景

xfs最适合以下场景:

大容量存储:xfs在TB级甚至PB级存储上性能衰减最小。日志存储、视频存储、备份存储等大容量场景首选xfs。

高并发工作负载:xfs的分配组设计允许多线程并发操作,多核CPU利用率高。视频编码、科学计算等CPU密集型I/O场景表现优异。

大文件为主的工作负载:HPC、媒体制作、大数据分析等处理大文件的场景,xfs的extent机制效率很高。

需要高性能日志和外置日志的场景:将日志放到SSD上可以显著提升xfs写入性能。

企业级存储:Red Hat/CentOS默认文件系统,企业级支持完善。

xfs不擅长的场景:大量小文件场景(不如ext4)、需要快照和克隆的场景、需要透明压缩的场景。

6.3 btrfs适用场景

btrfs最适合以下场景:

需要快照功能:容器镜像存储、持续集成环境、数据备份等需要频繁快照的场景,btrfs原生快照是最佳选择。

需要透明压缩:NAS存储、远程分支办公室等带宽受限场景,btrfs压缩可以显著节省空间。

需要原生RAID:不想使用硬件RAID或LVM的场景,btrfs的RAID5/6/10原生支持足够好用。

容器基础设施:Docker/DPod的存储层、k3s持久化存储,btrfs的COW特性适合容器场景。

COW友好的工作负载:大文件写入为主、写入后很少修改的场景(如视频转码)。

btrfs不擅长的场景:极致性能要求(COW开销)、高密度小文件存储、对数据完整性要求极高且需要最大兼容性的场景。

6.4 选型决策矩阵

考量因素
ext4
xfs
btrfs
成熟度
最高
稳定性
最高
明显改善
性能-大文件
最高
性能-小文件
性能-随机I/O
大容量支持
最高
快照支持
原生支持
压缩支持
原生支持
RAID支持
需要LVM
需要LVM
原生
配额管理
Quota
原生Quota
原生Qgroup
降级风险

6.5 实际案例参考

案例1:电商Web服务器集群

背景:100台Web服务器,每台500GB SSD,存储静态图片和用户上传文件。

选择:ext4

理由:性能稳定、成熟可靠、小文件性能足够、运维简单。不需要快照和压缩功能。

配置优化:noatime、data=writeback、discard(SSD)。

案例2:视频监控存储

背景:100TB NAS存储,存储H.264视频流,每天写入100GB。

选择:xfs

理由:大容量支持优秀、大文件顺序写入性能最优、日志性能好、ext4在如此大容量上碎片问题严重。

配置优化:stripe配置(日志外置)、noatime、大块分配。

案例3:容器镜像仓库

背景:私有镜像仓库,Docker镜像总大小20TB,需要定期快照和备份。

选择:btrfs

理由:原生快照支持、镜像层存储效率高、快照不占空间、可以实时压缩节省带宽。

配置优化:compress=zstd、ssd、discard=async、subvolume组织镜像。

案例4:PostgreSQL数据库

背景:OLTP数据库,单库500GB,混合读写负载。

选择:ext4或xfs

理由:不推荐btrfs(COW写入放大问题),ext4或xfs均可,建议ext4的data=writeback模式性能更好。

配置优化:noatime、nodiratime、discard(SSD)、关闭barrier。

第七章 排障与数据恢复

7.1 ext4常见问题

问题1:文件系统只读

症状:写入时报Read-only file system错误

解决:

# 查看挂载状态
mount | grep sda1

# 查看系统日志
dmesg | grep -i ext4

# 检查是否有硬件错误
smartctl -a /dev/sda

# 尝试重新挂载读写
mount -o remount,rw /mnt/data

# 如果失败,备份数据后修复
fsck.ext4 -f /dev/sda1

问题2:空间未释放

症状:删除文件后df显示空间未回收

解决:

# 查看实际空间使用
df -h /mnt/data
du -sh /mnt/data/*

# 检查是否有进程持有删除文件的句柄
lsof +D /mnt/data | grep deleted

# 终止进程或重启
kill -9 <PID>

# 如果是日志问题,同步日志
sync

7.2 xfs常见问题

问题1:xfs文件系统无法挂载

症状:mount报Structure needs cleaning

解决:

# 尝试修复
umount /dev/sda1
xfs_repair /dev/sda1

# 如果失败,使用元数据修复
xfs_repair -L /dev/sda1

# 如果仍失败,使用备份超级块
xfs_repair -o superblock=8192 /dev/sda1
xfs_repair -o superblock=16384 /dev/sda1

问题2:xfsQuota不生效

解决:

# 确认配额已启用
mount | grep quota

# 如果没有,重新挂载启用
umount /mnt/data
mount -o uquota /dev/sda1 /mnt/data

# 重置配额
xfs_quota -x -c 'off -v' /mnt/data
xfs_quota -x -c 'remove -v' /mnt/data
xfs_quota -x -c 'on -v' /mnt/data

7.3 btrfs常见问题

问题1:空间已满但无法写入

症状:df显示还有空间,但写入报No space left on device

解决:

# 查看详细空间分配
btrfs filesystem df /mnt/data

# 查看设备使用情况
btrfs device usage /mnt/data

# 检查是否有孤儿数据块
btrfs scrub status /mnt/data

# 尝试平衡(释放未使用空间)
btrfs balance start -dusage=0 /mnt/data

# 如果是metadata空间不足
btrfs balance start -musage=0 /mnt/data

问题2:btrfs性能下降

解决:

# 检查碎片
btrfs filesystem defragment -c -r /mnt/data

# 平衡数据块(分散到所有设备)
btrfs balance start -d /mnt/data

# 如果使用HDD,考虑分配策略
btrfs balance start -dconvert=profile /mnt/data

# 检查是否有ENOSPC趋势
btrfs space cache show /mnt/data

问题3:快照删除后空间未回收

解决:

# 查看快照状态
btrfs subvolume list /mnt/data -s

# 删除快照
btrfs subvolume delete /mnt/data/snapshot-name

# 运行balance回收空间
btrfs balance start /mnt/data

# 或者删除后立即balance
btrfs subvolume delete /mnt/data/snapshot-name && \
    btrfs balance start -dusage=5 /mnt/data

7.4 数据恢复

ext4数据恢复:

# 使用testdisk恢复误删文件
apt-get install testdisk
testdisk

# 使用extundelete恢复
apt-get install extundelete
extundelete /dev/sda1 --restore-file /path/to/deleted/file

# 恢复所有删除文件
extundelete /dev/sda1 --restore-all

# 使用debugfs手动恢复
debugfs -w /dev/sda1
debugfs: ls -d /dir  # 列出已删除inode
debugfs: dump <inode> /tmp/recovered

xfs数据恢复:

# xfs_irecover恢复inode
xfs_irecover /dev/sda1

# 使用xfsdump/xfsrestore
# 需要先有备份

# 使用scratch工具(实验性)

btrfs数据恢复:

# btrfs restore恢复文件
btrfs restore /dev/sda1 /mnt/recovery

# 恢复特定文件
btrfs restore /dev/sda1 /mnt/recovery --path-regex ^/dir/file

# 从快照恢复
btrfs subvolume snapshot /mnt/data/snapshot-20240101 /mnt/data/restore-point
cp -a /mnt/data/restore-point/path/to/file /mnt/data/path/to/file
btrfs subvolume delete /mnt/data/restore-point

结语

ext4、xfs和btrfs各有特色,选择时应基于实际工作负载和需求。

ext4是最稳妥的通用选择,成熟稳定、兼容性好,适合大多数标准服务器场景。它的设计理念是"够用就好",不追求最新特性,但每一项功能都经过充分验证。

xfs在处理大规模存储和大文件工作负载时表现出色。它的分配组设计和B+树元数据结构在多核系统上效率很高,是企业级存储的首选。

btrfs提供了现代文件系统应有的所有特性:快照、压缩、原生RAID、校验和等。虽然历史上曾有稳定性问题,但经过多年发展已足够稳定。对于需要这些高级特性的场景,btrfs是唯一选择。

运维工程师应理解文件系统的底层原理,才能在出现问题时快速定位和解决。定期检查文件系统健康、合理规划存储容量、根据工作负载选择合适的文件系统和挂载选项,这些日常工作的积累才能确保生产系统的稳定运行。

本文涵盖了文件系统性能对比的核心知识点,但技术持续发展。建议读者关注各文件系统的最新稳定版本发布说明和内核更新日志,及时了解新特性和性能改进。

参考资料

  • Linux内核文档:https://www.kernel.org/doc/html/latest/filesystems/
  • ext4文档:https://ext4.wiki.kernel.org/
  • xfs文档:https://xfs.org/index.php/XFS_Documentation
  • btrfs文档:https://btrfs.readthedocs.io/
  • fio文档:https://fio.readthedocs.io/
  • Red Hat存储管理指南:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-17 15:33:38 HTTP/2.0 GET : https://f.mffb.com.cn/a/485221.html
  2. 运行时间 : 0.162591s [ 吞吐率:6.15req/s ] 内存消耗:4,904.30kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=7b933794f451dadd2028ef6c202b6682
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001068s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001635s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000689s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000719s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001303s ]
  6. SELECT * FROM `set` [ RunTime:0.000608s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001507s ]
  8. SELECT * FROM `article` WHERE `id` = 485221 LIMIT 1 [ RunTime:0.001707s ]
  9. UPDATE `article` SET `lasttime` = 1776411218 WHERE `id` = 485221 [ RunTime:0.017899s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000727s ]
  11. SELECT * FROM `article` WHERE `id` < 485221 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001216s ]
  12. SELECT * FROM `article` WHERE `id` > 485221 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001309s ]
  13. SELECT * FROM `article` WHERE `id` < 485221 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002344s ]
  14. SELECT * FROM `article` WHERE `id` < 485221 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002697s ]
  15. SELECT * FROM `article` WHERE `id` < 485221 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002476s ]
0.166537s