I/O分析
2022-10-08 16:58:14 10 举报
AI智能生成
I/O问题排查和分析思路(极客时间)
作者其他创作
大纲/内容
磁盘和文件系统
文件系统
文件系统
索引节点(index node)inode
目录项(directory entry)
存储
扇区
逻辑块
超级块
图解
虚拟文件系统
和文件系统的关系
文件系统的分类
第一类是基于磁盘的文件系统
第二类是基于内存的文件系统,也就是我们常说的虚拟文件系统
第三类是网络文件系统
文件系统 I/O(文件读写方式的各种差异,导致 I/O 的分类多种多样)
缓冲 I/O 与非缓冲 I/O
I/O 与非直接 I/O
阻塞与非阻塞 I/O
同步与异步 I/O
磁盘
分类
机械磁盘
扇区,一般大小为 512 字节。
固态磁盘
页,通常大小是 4KB、8KB 等。
通用块层
第一功能
第二功能
I/O 调度
NONE
NOOP
CFQ
Deadline
I/O栈
全景图
文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。
通用块层,包括块设备 I/O 队列和 I/O 调度器。它会对文件系统的 I/O 请求进行排队,再通过重新排序和请求合并,然后才要发送给下一级的设备层。
设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。
性能指标
磁盘性能指标
使用率
饱和度
IOPS
吞吐量
响应时间
IO性能指标
指标查看工具
性能优化
1、应用层
可以用追加写代替随机写,减少寻址开销,加快 I/O 写的速度
可以借助缓存 I/O ,充分利用系统缓存,降低实际 I/O 的次数。
可以在应用程序内部构建自己的缓存,或者用 Redis 这类外部缓存系统
在需要频繁读写同一块磁盘空间时,可以用 mmap 代替 read/write,减少内存的拷贝次数。
在需要同步写的场景中,尽量将写请求合并,而不是让每个请求都同步写入磁盘,即可以用 fsync() 取代 O_SYNC。
在多个应用程序共享相同磁盘时,为了保证 I/O 不被某个应用完全占用,推荐你使用 cgroups 的 I/O 子系统,来限制进程 / 进程组的 IOPS 以及吞吐量
2、文件系统
你可以根据实际负载场景的不同,选择最适合的文件系统。比如 Ubuntu 默认使用 ext4 文件系统,而 CentOS 7 默认使用 xfs 文件系统。
在选好文件系统后,还可以进一步优化文件系统的配置选项,包括文件系统的特性(如 ext_attr、dir_index)、日志模式(如 journal、ordered、writeback)、挂载选项(如 noatime)等等。
可以优化文件系统的缓存。
3、磁盘优化
最简单有效的优化方法,就是换用性能更好的磁盘,比如用 SSD 替代 HDD。
我们可以使用 RAID ,把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列。这样做既可以提高数据的可靠性,又可以提升数据的访问性能。
针对磁盘和应用程序 I/O 模式的特征,我们可以选择最适合的 I/O 调度算法。
们可以对应用程序的数据,进行磁盘级别的隔离。比如,我们可以为日志、数据库等 I/O 压力比较重的应用,配置单独的磁盘。
在顺序读比较多的场景中,我们可以增大磁盘的预读数据,
我们可以优化内核块设备 I/O 的选项
分析
排查工具
iostat(/proc/diskstats)
pidstat(使用查看进程)
iotop(根据io排序)
lsof(查看进程的读写文件情况)
strace -pf 2>&1 (还可以跟踪线程)
filetop -C(查看文件调用)
opensnoop
ps -efT 查看进程和线程号:spid
vmstat(综合cpu、内存、IO)
分析思路
top-->iostat-->pidstat-->strace-->lsof 结合vmstat/ps
问题:
cpu占比低,但是IO占比高,执行命令会很慢?
执行命令也需要IO操作,比如加载依赖的文件库
做系统监控的工具
nmon
0 条评论
下一页