负载特征
- 操作频率和类型
- IO吞吐量
- IO大小分布
- 读写比例
- 同步写比例
- 随机和连续访问比例
静态性能调优
- 文件系统记录的大小是多少
- 是否开启了访问时间戳,还启用了哪些文件系统选项(压缩、加密)等
- 文件系统的缓存是怎么配置,最大缓存大小是多少
- 是否用了RAID
- 用的是什么文件系统
尝试回答上面这些问题可以暴露一些容易被忽视的配置问题
性能检测
延时和操作频率
一个1字节的写入操作可能会产生多次磁盘的读和写,比如:
文件系统定位这个地址对应的128KB记录块,发现它未在缓存中
文件系统请求从磁盘加载那个记录块
磁盘进行了多次较小的IO读操作,一共读取128KB
文件系统把要写入的那个字节替换成新的数据
文件系统请求把128K的脏记录写到磁盘
磁盘写入128KB,可能还会分拆成多次写请求
文件系统写入新的元数据,比如访问时间
操作并不平等
比如每秒500次的IO操作负载性能如何,我们无法判断。影响性能的关键因素还包括:随机IO还是顺序IO、读取还是写入、同步写还是异步写、IO的大小等等应用程序与文件系统延迟
比如一个程序执行一个事务花了200ms,其中180ms是在等待IO,程序程序被文件系统阻塞的时间为100 *(180/200) = 90%,假设我们解决文件系统IO等待,性能可以提升90%正确的描述一个文件系统负载 xx应用给文件系统产生了随机读负载,频率为180000/s次读,平均读大小是4KB,总操作频率是210000/s次,包括读取、统计、打开、关闭和每秒200次的同步写入,写评论相对于读较为稳定,高峰期读取能达到每秒40000次
观测工具
原生工具
mount
查看mount命令输出中,磁盘的挂载选项 比如relatime是一个提高性能的选项,只有在修改或则更新的时间距离上次时间超过一天时才触发更新,从而减少inode访问时间的更新,降低磁盘的IO开销
sar
sar -v 1
- dentunusd 目录项缓存未用计数
- file-nr 使用中的文件句柄数量
- inode-nr 使用中的inode数量
- pty-nr 使用的伪终端个数
BCC工具
opensnoop
opensoop -T
- -T时间戳
- -x 只显示失败的打开事件
- -p PID 仅仅跟踪这个进程
- -n 筛选进程名
cachestat
cachestat -T 1
显示内存命中率
ext4dist
extdist 10 1
10秒间隔和一次计数来展示一次10秒的跟踪,显示每种类型操作的延迟分布