4.8 文件系统监测命令
目录
本节我们来介绍文件系统相关的监测工具。
1. 命令总览
我们会介绍如下文件系统统计信息的工具
Linux | Solaris | 作用 | 说明 |
---|---|---|---|
vfsstat | 文件系统统计信息,包括平均延时 | ||
fsstat | 文件系统统计信息 | ||
kstat | 各种文件系统和缓存统计信息 | ||
fcachestat | 各种缓存命令中率和大小 | ||
free | 缓存容量统计信息 | ||
strace | truss | 系统调用调试器 | |
slaptop | mdb:kmastat | 内核 slab 分配器统计信息 | |
/proc/memeinfo | mdb:memstat | 内核内存使用情况 | |
sar | sar | 内存,swap使用统计信息 | 通用命令,位于独立的一节中 |
除此之外,还包括以下内容:
- 文件系统基准测试
- 文件系统调优
2. 文件系统统计命令
2.1 LatencyTop
LatencyTop 是一个报告延时根源的工具。可以针对整个系统,也可以针对单个进程。
启用 LatencyTop 需要两个内核选项的支持:
- CONFIG_LATENCYTOP
- CONFIG_HAVE_LATENCYTOP_SUPPORT
|
|
3. 文件系统测试
3.1 dd
可以执行文件系统连续读写负载的特定性能测试
|
|
3.2 Bonnie
是一个在单文件上一单线程测试集中负载的简单 C程序
3.3 fio
有很多高级功能的可定制文件系统基准测试工具:
- 非标准随机分布,可以更准确的模拟真实的访问模式
- 延时百分位数报告,包括 99,99.5,99.9,99.99
使用
fio(Flexible I/O Tester)正是最常用的文件系统和磁盘 I/O 性能基准测试工具,并且提供了大量定制化的选项。下面是对随机读、随机写、顺序读以及顺序写的基准测试。
|
|
示例命令中包含的参数的含义如下:
- direct,表示是否跳过系统缓存。上面示例中,我设置的 1 ,就表示跳过系统缓存。
- iodepth,表示使用异步 I/O(asynchronous I/O,简称 AIO)时,同时发出的 I/O 请求上限。在上面的示例中,我设置的是 64。
- rw,表示 I/O 模式。我的示例中, read/write 分别表示顺序读 / 写,而 randread/randwrite 则分别表示随机读 / 写。
- ioengine,表示 I/O 引擎,它支持同步(sync)、异步(libaio)、内存映射(mmap)、网络(net)等各种 I/O 引擎。上面示例中,我设置的 libaio 表示使用异步 I/O。bs,表示 I/O 的大小。示例中,我设置成了 4K(这也是默认值)。
- filename,表示文件路径,当然,它可以是磁盘路径(测试磁盘性能),也可以是文件路径(测试文件系统性能)。示例中,我把它设置成了磁盘 /dev/sdb。不过注意,用磁盘路径测试写,会破坏这个磁盘中的文件系统,所以在使用前,你一定要事先做好数据备份。
I/O 重放
fio 支持 I/O 的重放。借助前面提到过的 blktrace,再配合上 fio,就可以实现对应用程序 I/O 模式的基准测试。比如像下面这样:
|
|
输出
|
|
这个报告中,需要我们重点关注的是, slat、clat、lat ,以及 bw 和 iops:
- slat ,是指从 I/O 提交到实际执行 I/O 的时长(Submission latency);
- clat ,是指从 I/O 提交到 I/O 完成的时长(Completion latency)
- lat ,指的是从 fio 创建 I/O 到 I/O 完成的总时长。
- bw ,它代表吞吐量
- iops ,其实就是每秒 I/O 的次数
对同步 I/O 来说,由于 I/O 提交和 I/O 完成是一个动作,所以 slat 实际上就是 I/O 完成的时间,而 clat 是 0。而从示例可以看到,使用异步 I/O(libaio)时,lat 近似等于 slat + clat 之和。
3.4 SysBench
3.5 丢弃缓存
Linux 提供了丢弃缓存的方法,可用于缓存开始执行的基准测试
|
|
4. 调优
4.1 应用程序调优
应用程序可以给内核提供信息,来提高缓存和预期的效率,包括:
- posix_fadvise()
- madvise()
posix_fasvise()
int posix_fasvise(int fd, off_t offset, off_t len, int advice)
- 作用: 这个库函数调用操作文件的一个区域
- advice: 建议标志位:
- POSIX_FAD_SEQUENTIAL: 指定的数据范围会被连续访问
- POSIX_FAD_RANDOM: 指定的数据范围会被随机访问
- POSIX_FAD_NOREUSE: 数据不会被重用
- POSIX_FAD_WILLNEED: 数据会在不远的将来重用
- POSIX_FAD_DONTNEED: 数据不会在不远的将来重用
madvise()
int madvise(void *addr, size_t length, int advice
- 作用: 库函数调用对一块内存映射进行操作
- advice: 建议标志位
- MADV_RANDOM: 偏移量将以随机顺序访问
- MADV_SEQUENTIAL: 偏移量将以连续顺序访问
- MADV_WILLNEED: 数据还会再用,请缓存
- MADV_DONTNEED: 数据不会再用,无缓存
4.2 文件系统调优
ext 文件系统
|
|