LINUX性能调优--IO总结

文件系统 I/O 性能指标
1 存储空间的使用情况,包括容量、使用量以及剩余空间。但这并不是真实的用量,文件系统的元数据也会占用磁盘空间。如果使用了RAID10,看到的磁盘容量最多是真实磁盘容量的一半。
2 除此之外,容易忽略的是索引节点的使用情况,它也包括容量、使用量以及剩余量等三个指标。如果文件系统中存储过多的小文件,就可能碰到索引节点容量已满的问题。
3 缓存使用情况也要注意,包括页缓存、目录项缓存、索引节点缓存以及各个具体文件系统(如 ext4、XFS 等)的缓存。
4 文件IO也是重要的指标,包括IOPS(包括 r/s 和 w/s)、响应时间(延迟)以及吞吐量(B/s)。这些指标需要结合文件实际的读写情况。比如,结合文件大小、文件数量、I/O 类型等,综合分析文件 I/O 的性能。
5 Linux 文件系统并没提供,直接查看这些指标的方法。只能通过系统调用、动态跟踪或者基准测试等方法,间接进行观察、评估
磁盘 I/O 性能指标
1 使用率,是指磁盘忙处理 I/O 请求的百分比。过高的使用率(比如超过 60%)通常意味着磁盘 I/O 存在性能瓶颈。
IOPS(Input/Output Per Second),是指每秒的 I/O 请求数。
吞吐量,是指每秒的 I/O 请求大小。响应时间,是指从发出 I/O 请求到收到响应的间隔时间。
2 常见的一个误区,把不同场景的 I/O 性能指标,直接进行分析对比
3 缓冲区(Buffer)也是要重点掌握的指标,它经常出现在内存和磁盘问题的分析中。
4 总结:LINUX性能调优--IO总结_第1张图片
性能工具
1 df 查看文件系统容量的工具.既可以查看文件系统数据的空间容量,也可以查看索引节点的容量
文件系统缓存,我们可以通过 /proc/meminfo、/proc/slabinfo 以及 slabtop 等各种来源,观察页缓存、目录项缓存、索引节点缓存以及具体文件系统的缓存情况。
2 iostat ,我们可以得到磁盘的 I/O 使用率、吞吐量、响应时间以及 IOPS 等性能指标;
pidstat ,则可以观察到进程的 I/O 吞吐量以及块设备 I/O 的延迟等。
3 一个方法是:
1 top 查看系统的 CPU 使用情况,如果发现 iowait 比较高;
2 用 iostat 发现了磁盘的 I/O 使用率瓶颈,
3 用 pidstat 找出了大量 I/O 的进程;
4 通过 strace 和 lsof,我们找出了问题进程正在读写的文件,并最终锁定性能问题的来源。
指标和工具的联系
可以从两个方面出发考虑:
1 从 I/O 指标出发,更容易把性能工具同系统工作原理关联起来,对性能问题有宏观的认识和把握。
2 从性能工具出发,可以让你更快上手使用工具,迅速找出我们想观察的性能指标。特别是在工具有限的情况下,我们更要充分利用好手头的每一个工具,少量工具也要尽力挖掘出大量信息。
3 由指标想到工具:
LINUX性能调优--IO总结_第2张图片
4 根据工具找指标
LINUX性能调优--IO总结_第3张图片
迅速分析 I/O 的性能瓶颈
1 想弄清楚性能指标的关联性,就要通晓每种性能指标的工作原理
2 分析思路基本类似:
1 先用 iostat 发现磁盘 I/O 性能瓶颈;
2 pidstat ,定位出导致瓶颈的进程;
3 分析进程的 I/O 行为;
4 结合应用程序的原理,分析这些 I/O 的来源。
3 分析方向:
LINUX性能调优--IO总结_第4张图片
4 I/O 的性能指标很多,相应的性能分析工具也有不少,但熟悉了各指标含义后,你就会自然找到它们的关联。顺着这个思路往下走,掌握常用的分析套路也并不难.
I/O 基准测试
1 为了更客观合理地评估优化效果,我们首先应该对磁盘和文件系统进行基准测试,得到文件系统或者磁盘 I/O 的极限性能。
2 fio是最常用的文件系统和磁盘 I/O 性能基准测试工具
3 # 随机读
fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 随机写
fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 顺序读
fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 顺序写
fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
4 direct,表示是否跳过系统缓存。上面示例中,我设置的 1 ,就表示跳过系统缓存。
iodepth,表示使用异步 I/O(asynchronous I/O,简称 AIO)时,同时发出的 I/O 请求上限。在上面的示例中,我设置的是 64。
rw,表示 I/O 模式。我的示例中, read/write 分别表示顺序读 / 写,而 randread/randwrite 则分别表示随机读 / 写。i
oengine,表示 I/O 引擎,它支持同步(sync)、异步(libaio)、内存映射(mmap)、网络(net)等各种 I/O 引擎。上面示例中,我设置的 libaio 表示使用异步 I/O。
bs,表示 I/O 的大小。示例中,我设置成了 4K(这也是默认值)。
filename,表示文件路径,当然,它可以是磁盘路径(测试磁盘性能),也可以是文件路径(测试文件系统性能)
5 slat ,是指从 I/O 提交到实际执行 I/O 的时长(Submission latency);
clat ,是指从 I/O 提交到 I/O 完成的时长(Completion latency);
lat ,指的是从 fio 创建 I/O 到 I/O 完成的总时长。
bw ,它代表吞吐量
iops ,其实就是每秒 I/O 的次数
6 怎么才能精确模拟应用程序的 I/O 模式呢?
fio 支持 I/O 的重放。借助前面提到过的 blktrace,再配合上 fio,就可以实现对应用程序 I/O 模式的基准测试。你需要先用 blktrace ,记录磁盘设备的 I/O 访问情况;然后使用 fio ,重放 blktrace 的记录.
应用程序优化
1 可以用追加写代替随机写,减少寻址开销,加快 I/O 写的速度
2 可以借助缓存 I/O ,充分利用系统缓存,降低实际 I/O 的次数。
3 可以在应用程序内部构建自己的缓存,或者用 Redis 这类外部缓存系统
4 在需要频繁读写同一块磁盘空间时,可以用 mmap 代替 read/write,减少内存的拷贝次数。
5 在需要同步写的场景中,尽量将写请求合并,而不是让每个请求都同步写入磁盘,即可以用 fsync() 取代 O_SYNC
6 在多个应用程序共享相同磁盘时,为了保证 I/O 不被某个应用完全占用,推荐你使用 cgroups 的 I/O 子系统,来限制进程 / 进程组的 IOPS 以及吞吐量
7 使用 CFQ 调度器时,可以用 ionice 来调整进程的 I/O 调度优先级,特别是提高核心应用的 I/O 优先
文件系统优化
1 你可以根据实际负载场景的不同,选择最适合的文件系统
2 在选好文件系统后,还可以进一步优化文件系统的配置选项,包括文件系统的特性(如 ext_attr、dir_index)、日志模式(如 journal、ordered、writeback)、挂载选项(如 noatime)等等。
3 可以优化文件系统的缓存。
磁盘优化
1 最简单有效的优化方法,就是换用性能更好的磁盘,比如用 SSD 替代 HDD。
2 我们可以使用 RAID ,把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列
3 针对磁盘和应用程序 I/O 模式的特征,我们可以选择最适合的 I/O 调度算法。比方说,SSD 和虚拟机中的磁盘,通常用的是 noop 调度算法。而数据库应用,我更推荐使用 deadline 算法
4 可以对应用程序的数据,进行磁盘级别的隔离。比如,我们可以为日志、数据库等 I/O 压力比较重的应用,配置单独的磁盘
5 在顺序读比较多的场景中,我们可以增大磁盘的预读数据
1 调整内核选项 /sys/block/sdb/queue/read_ahead_kb,默认大小是 128 KB,单位为 KB。
2 使用 blockdev 工具设置,比如 blockdev --setra 8192 /dev/sdb,注意这里的单位是 512B(0.5KB),所以它的数值总是 read_ahead_kb 的两倍。
6 磁盘本身出现硬件错误,也会导致 I/O 性能急剧下降,dmesg查看是否有IO故障的日志,检测磁盘工具badblocks,smartctl。。。检测文件系统问题工具e2fsck。修复工具 fsck 。。。

你可能感兴趣的:(linux性能调优)