jdb2-io-high
在一台 EC2(c5.xlarge) 、系统 ubuntu16.04,使用 docker 运行 mysql 和 java 程序
java 程序执行类似如下的 sql
START TRX
INSERT order (id, ..., ...)
COMMIT;
START TRX
UPDATE asset set ... = ... WHERE user_id = #{id}
COMMIT;
START TRX
UPDATE order set ... = ... WHERE id = #{id}
COMMIT;
上诉的 SQL 在 java 程序运行开头的一段时间(例如 30 分钟内),其执行时间是稳定 10ms 以内的。
执行一段时间后,执行平均时间突然变为 100ms左右,执行时间范围变成 50ms ~ 200ms, 有一些峰值是达到 500ms
如下图展示,在某个时间点,mysql 的事务执行时间突然进入一个"高原"。
mysql 事务执行时间 进入 “高原” 的时候,也发现 磁盘的 io 被沾满(使用 iostat 命令),
但是 磁盘的写入数据量减少了,如下图红色箭头标注。
然后使用 iotop 发现一个进程 jbd2/nvme0n1p1-
,其中 nvme0n1p1
是 EC2 的系统盘,200G(SSD)
这个 jbd2 进程占用了 90% 以上的 IO,但是读写量十分少,
我按照关键字:“jbd2 io high” 的关键字搜索,得到了如下的几篇文章
根据相关的搜索,我猜测,由于这个进程占用了大部分的磁盘 IO,导致 mysql 事务落地到磁盘的耗时变多。我看大多数文章都是说这个可能是 ubuntu16.04 内核 bug,升级内核版本应该可以解决。
最终是将系统升级到 ubuntu18.04。
如果升级到 ubuntu 18.04以及升级内核还没有效果,参考如下文章