最近在 docker 上跑 jellyfin 的时候碰到一个问题, 但是我不知道是怎么引起的, 对 io 这块的硬件处理不熟悉.
表现情况为, 当出现该问题时, iowait 直接 90%以上, 但是磁盘读取只有 10MB/s 左右, 没有大量的写入, 就我观察其他正常运行的程序磁盘读取 15MB/s 也不会引起高 cpu 使用乃至 90%的 iowait, 那这种情况应该不是磁盘瓶颈的问题吧?
同时 ps 查看进程后, docker 内 jellyfin 的 ffprobe 子进程(应该是正常的扫媒体文件)的 state 为 D(uninterruptible sleep (usually IO)), 而且 grep 后 D 状态的进程都是 ffprobe.
所以我粗略估计, 高 iowait 的问题应该是 jellyfin 扫库引起的, 但是扫库的时候该问题不是必现, 这是其一, 其二是如果不是磁盘的读写瓶颈, 到底为什么会导致 iowait, 是代码的问题?
1
billlee 2022-07-13 20:01:20 +08:00
看一下 iops
|
2
chenxytw 2022-07-13 20:07:07 +08:00 1
从描述看,就是磁盘读写引起的 iowait 。
关于磁盘繁忙程度的判断,不应该仅关心速度,还有 IOPS 。 从速度描述值 15 MiB/s 和行为来看,应该是机械硬盘,且发生大量随机小数据量读写。机械硬盘由于其特性,这种场景的读写能力很弱。如果还是多进程做这件事情,是很容易发生高 iowait 的。 题外话:单从速度来讲,无论是机械硬盘还是固态硬盘,大量小数据随机读写的表现出来的读写速度是远低于顺序读写的。 |
3
cxtrinityy OP |
4
aru 2022-07-13 23:52:09 +08:00
iostat -x 3
执行上面的命令,看下磁盘使用率 |
5
cxtrinityy OP @aru 磁盘使用率是 90%+, 就是磁盘使用率太高了, 但是读取写入速度又不快我才奇怪的, 估计是跟楼上说的一样, iops 的问题, 虽然暂时没有复现问题去验证, 但是我当初打印 jellyfin 日志的时候看到扫的文件夹是有很多小文件的, 我的媒体库是按照 emby 的方式建立文件夹的, 每部剧一个文件夹, 里面按季分, 自动字幕下载程序会下载非常多的匹配字幕文件, 导致一个文件夹肯能有 500-1000 个文件, 那部剧有 7 季, 将尽几千的小文件了
|