[root@localhost caq]# xfs_db -c frag -r /dev/sdaw
actual , ideal , fragmentation factor 82.56%
Note, this number is largely meaningless.
Files on this filesystem average 5.73 extents per file
[root@localhost caq]# xfs_fsr /dev/sdaw
/mnt/K4HUWARB start inode= [root@localhost caq]#
[root@localhost caq]#
[root@localhost caq]# xfs_db -c frag -r /dev/sdaw
actual , ideal , fragmentation factor 14.79%
Note, this number is largely meaningless.
Files on this filesystem average 1.17 extents per file

在碎片化整理之前,碎片化率为82.56%,一般来说,碎片化率高于45%,则建议整理,一来连续的块可以提高读的性能,二来可以省出很多block。

除了xfs_fsr,还有很多有用的工具。

xfs_admin      xfs_db         xfs_freeze     xfs_info       xfs_logprint   xfs_mkfile     xfs_repair
xfs_bmap xfsdump xfs_fsr xfsinvutil xfs_mdrestore xfs_ncheck xfsrestore
xfs_copy xfs_estimate xfs_growfs xfs_io xfs_metadump xfs_quota xfs_rtcp

用的最多的是xfs_repair,xfs_check,xfs_db.

xfs_info的使用:

[root@localhost caq]# xfs_info /dev/sdaw
meta-data=/dev/sdaw isize= agcount=, agsize= blks
= sectsz= attr=
data = bsize= blocks=, imaxpct=
= sunit= swidth= blks
naming =version bsize= ascii-ci=
log =internal bsize= blocks=, version=
= sectsz= sunit= blks, lazy-count=
realtime =none extsz= blocks=, rtextents=

可以看出,sdaw有4个AG,block个数为 488378646,每个AG管理的block数量为总数量/4, 扇区大小为512,

swidth=0  条带参数,raid使用。

该挂载点的xfs的日志记录在内部,有些设备上面既有慢速的机械盘,又有快速的ssd甚至nvme盘,则可以把慢速设备的xfs日志放在nvme上,可以提高性能。

[root@localhost caq]# xfs_info -V
xfs_info version 3.1.

xfs_admin 的使用:

该工具能修改xfs文件系统参数

设置uuid      xfs_admin –U uuid /dev/sdc

设置label    xfsadmin –L label /dev/sdc

xfs_db工具能打印和修改未mount的,xfs元数据结构体:

xfs_db /dev/sdc

xfs_db> sb

xfs_db> p

magicnum = 0x58465342

blocksize = 4096

dblocks = 524288

修改:xfs_db -x -c 'sb 0' -c 'write dblocks 0' /dev/sdc

查看文件inode xfs_db> inode 131

xfs_db> p

core.magic = 0x494e

core.mode = 0100644

core.version = 2

打印文件系统剩余空间:

xfs_db> freesp
from to extents blocks pct
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.02
0.13
0.29
0.63
0.76
0.99
1.46
0.22
95.50

打印原始16进制数据:

xfs_db> type text

xfs_db> p

00:  49 4e 81 ed 02 02 00 00 00 00 00 00 00 00 00 00  IN..............

10:  00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01  ................

20:  54 a2 14 e5 01 bb 2a 29 54 a2 14 e5 02 72 45 2a  T.......T....rE.

30:  54 a2 14 e5 02 72 45 2a 00 00 00 00 00 00 22 4c  T....rE........L

40:  00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 01  ................

…..

xfs对block的管理是通过分级来管理数据的,扇区,块,et,ag。

其中:sector<block<extent<ag

typedef struct xfs_agf {
/*
* Common allocation group header information
*/
__be32 agf_magicnum; /* magic number == XFS_AGF_MAGIC */
__be32 agf_versionnum; /* header version == XFS_AGF_VERSION */
__be32 agf_seqno; /* sequence # starting from 0 */
__be32 agf_length; /* size in blocks of a.g. */
/*
* Freespace information
*/
__be32 agf_roots[XFS_BTNUM_AGF]; /* root blocks */
__be32 agf_spare0; /* spare field */
__be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */
__be32 agf_spare1; /* spare field */ __be32 agf_flfirst; /* first freelist block's index */
__be32 agf_fllast; /* last freelist block's index */
__be32 agf_flcount; /* count of blocks in freelist */
__be32 agf_freeblks; /* total free blocks */ __be32 agf_longest; /* longest free space */
__be32 agf_btreeblks; /* # of blocks held in AGF btrees */
uuid_t agf_uuid; /* uuid of filesystem */------------------------------以下字段在2.6.32版本中没看到,3.10对应的xfs模块有,中间版本没对比过 /*
* reserve some contiguous space for future logged fields before we add
* the unlogged fields. This makes the range logging via flags and
* structure offsets much simpler.
*/
__be64 agf_spare64[]; /* unlogged fields, written during buffer writeback. */
__be64 agf_lsn; /* last write sequence */
__be32 agf_crc; /* crc of agf sector */
__be32 agf_spare2; /* structure must be padded to 64 bit alignment */
} xfs_agf_t;

可以查看一个agf对比下:

[root@localhost caq]# xfs_db /dev/sdaw
xfs_db> agf
xfs_db> p
magicnum = 0x58414746--------------对比agf_magicnum字段
versionnum = 1---------------------对比agf_versionnum字段
seqno = 0--------------------------对比agf_seqno
length = 30523648------------------对比agf_length
bnoroot = 144----------------------agf_roots
cntroot =
bnolevel =
cntlevel =
flfirst =
fllast =
flcount =
freeblks = 29067437----------------空闲的block数
longest = 28900480-----------------最大的空闲段长度
btreeblks =
uuid = 6c46ba7a-03b6-46bc-912c-7bac04aafe92
lsn = 0xd000484b0
crc = 0x37a41d5b (correct)----------crc字段

查看144这个block的信息:

xfs_db> fsblock
xfs_db> p
: ffffffff ffffffff 0000000d 000484b0
: 6c46ba7a 03b646bc 912c7bac 04aafe92 8e0f24fb
: 0000006a 000006a4 0000005c 000002f9 000049a4 0000005c
: 00006a24 0000005c 00006f24 00001cdc 00008d00
: 00015b00 00000f00 00016a01 0000007f 0001aa80 00002d00
0a0: 00031f80 00043b88
0c0: 0004b704 0000007c 0004f780 0000037c
0e0: 0009a680 000a6a80
: 000aab80 00000c00 000ab880 000b6c80 000c6e80
: 000d7480 000df088 000000f8 000e3184 0000007c 000f7200 00000f80
: 00003f80 00003c00
: 0016c480 0018c480 01b8fc80 0018c480 01b8fc80
: 0018c480 01b8fc80 0018c480 01b8fc80 0018c480 01b8fc80 001a1e00 01b7a300
1a0: 001a2500 01b79c00 001a2b00 01b79600 001a3100 01b79000 001a3100 01b79000
1c0: 001a3900 01b78800 001a3900 01b78800 001a3b00 01b78600 001a4100 01b78000

这样打印不明显,可以跟printf一样,格式化,

xfs_db> fsblock
xfs_db> type bnobt-----------------指定打印的type类型
xfs_db> p
magic = 0x41423342-----------------这个可以看到,和上图直接打印的magic是一样的,就是‘ABTB’
level = 0--------------------------表示叶子节点,1表示中间节点
numrecs = 40-----------------------本叶子节点管理的空闲block块,就是recs的数组中有效的元素个数
leftsib = null
rightsib = null
bno =
lsn = 0xd000484b0
uuid = 6c46ba7a-03b6-46bc-912c-7bac04aafe92
owner =
crc = 0x8e0f24fb (correct)
recs[-] = [startblock,blockcount] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,] :[,]

查看xfs超级块的一些信息:

[root@localhost /]# xfs_db  /dev/sdaw
xfs_db> sb 0-----------------超级块
xfs_db> p
magicnum = 0x58465342--------这个就是XFSB的acsii码
blocksize = 4096-------------逻辑块大小
dblocks = 976754646----------磁盘总块数,块数*块大小就是磁盘的空间了
rblocks =
rextents =
uuid = 6c46ba7a-03b6-46bc-912c-7bac04aafe92
logstart =
rootino = 1024---------------根节点inode号
rbmino =
rsumino =
rextsize =
agblocks = 30523648----------每个AG的块数量,
agcount = 32-----------------32个AG,和AG块数乘起来就是块总数
rbmblocks =
logblocks = 476930-----------日志块数
versionnum = 0xbda5
sectsize =
inodesize =
inopblock = 8----------------每个block可以存储的inode的个数,4096/512=8
fname = "\000\000\000\000\000\000\000\000\000\000\000\000"--------------文件系统的名称
blocklog = 12----------------2的12次方,这个可以和page的shift类比,
sectlog = 12-----------------sector大小的log表示,
inodelog = 9-----------------inode大小的log表示
inopblog = 3-----------------每个block可以存储的inode的log表示,
agblklog = 25----------------每个ag可以管理的blcok个数的log表示,这个存在向上取整
rextslog =
inprogress =
imax_pct =
icount =
ifree =
fdblocks =
frextents =
uquotino = null
gquotino = null
qflags =
flags =
shared_vn =
inoalignmt =
unit =
width =
dirblklog =
logsectlog =
logsectsize =
logsunit =
features2 = 0x18a
bad_features2 = 0x18a
features_compat =
features_ro_compat =
features_incompat = 0x1
features_log_incompat =
crc = 0xd0deb599 (correct)
spino_align =
pquotino = null
lsn = 0xd00048528
meta_uuid = ----

xfs的加载过程及常见维护的队列:

Xfs加载ko入口函数在init_xfs_fs,主要申请xfs内核模块使用的内存资源,注册xfs文件系统。
常驻内存工作队列说明:
[xfsalloc] 模块加载产生,用于文件申请extent的时候,调用__xfs_bmapi_allocate,分配extent。
[xfs_mru_cache] 模块加载产生,用于访问MRU (Most Recently Used) Cache的时候使用。
[xfslogd]模块加载产生,xfs_buf的IO结束调用 b_iodone_work的队列。

产生阶段为mount阶段,此时会有指定的实例,挂载点,设备号等。
[xfs-data/sdc]mount产生,数据IO的异步操作队列,directIO结束的时候调用io_work。
[xfs-conv/sdc] mount产生,数据IO的异步操作队列,bufIO结束时候调用io_work。
[xfs-cil/sdc] mount产生,push日志的工作队列,用于xfs_trans_commit将事务提交到日志里。
[xfsaild/sdc] mount产生, xfs_log_worker触发,将脏节点push到buf,再将buf下盘,umount的时候也经常调用类似流程,如 xfs_ail_push_all_sync 函数。

参考资料:

http://oss.sgi.com

http://xfs.org/

https://access.redhat.com/

中兴OS团队的相关GPL文档。

xfs 的一些工具使用的更多相关文章

  1. centos8平台使用xfs文件系统

    一,xfs文件系统的特点 XFS是一种高性能的日志文件系统, 它是由SGI公司设计的,被称为业界最先进的.最具可升级性的文件系统技术. 最初是从unix(irix)移植到linux系统上的. 从cen ...

  2. Red Hat Enterprise Linux 7.x新特性

    Red Hat Enterprise Linux 7.x新特性 RHEL7新特性简介 1.      RHEL7目前支持架构 64-bit AMD.64-bit Intel.IBM POWER.IBM ...

  3. 部分rpm包总结描述

    acl-2.2.51-15.el7.x86_64 Commands for Manipulating POSIX(可移植操作系统接口 of unix) Access Control Lists.有ge ...

  4. WOSA/XFS PTR Form解析库—测试工具预览

  5. Ceph性能测试工具和方法。

    0. 测试环境 同 Ceph 的基本操作和常见故障排除方法 一文中的测试环境. 1. 测试准备 1.1 磁盘读写性能 1.1.1 单个 OSD 磁盘写性能,大概 165MB/s. root@ceph1 ...

  6. Linux 性能优化工具 perf top

    1. perf perf 是一个调查 Linux 中各种性能问题的有力工具. NAME perf - Performance analysis tools for Linux SYNOPSIS per ...

  7. 理解 OpenStack + Ceph (8): 基本的 Ceph 性能测试工具和方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. 关于ext3,ext4,xfs和btrfs文件系统性能对比

    关于ext3,ext4,xfs和btrfs文件系统性能对比 应为原文:http://www.ilsistemista.net/index.php/linux-a-unix/6-linux-filesy ...

  9. ext3,ext4,xfs和btrfs文件系统性能对比

    应为原文:http://www.ilsistemista.net/index.php/linux-a-unix/6-linux-filesystems-benchmarked-ext3-vs-ext4 ...

随机推荐

  1. Docker系列(三)Dockerfile 离线构建镜像

    一.Dockfile介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfil ...

  2. MSMQ .NET下的应用

    Message Message是MSMQ的数据存储单元,我们的用户数据一般也被填充在Message的body当中,因此很重要,让我们来看一看其在.net中的体现,如图: 在图上我们可以看见,Messa ...

  3. CentOS7中KVM虚拟机内存、CPU调整

    CentOS7中KVM虚拟机内存.CPU调整 1. 调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.1 查看当前内存大小 [root@kvm01 ~]# virsh dominfo vm1- ...

  4. Elasticsearch -- 索引管理

    1.#获取当前索引 # curl -u elastic:changeme 'localhost:9200/_cat/indices?v' 2. #删除指定索引    # curl -XDELETE - ...

  5. 防止shell script多次运行

    一个思路是在script初期检测系统中是否存在同名进程. ] then echo "This script is already running. Exit." else whil ...

  6. python基础知识4--数据类型与变量

    阅读目录 一.变量 二.数据类型 2.1 什么是数据类型及数据类型分类 2.2 标准数据类型: 2.2.1 数字 2.2.1.1 整型: 2.2.1.2 长整型long: 2.2.1.3 布尔bool ...

  7. zxing生成二维码和条码

    /*** * 生成二维码方法 * @param str 生成内容 * @param widthHeight 宽度和高度 * @return * @throws WriterException */ p ...

  8. How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)

    How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)

  9. springboot连mysql报一个奇怪的错误

    错误提示:Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection ...

  10. php 关于laravel5.7框架

    一.配置 首先说下配置,安装node.js  .npm .cmd 命令行 node -v  .npm -v 若已安装出现版本号,若无自行百度 安装compaser 通过compaser命令安装lara ...