内容提要
PXC从5.7升级到8.0后,Galera线程出现周期性大量磁盘写入,而InnoDB写入正常。原因是系统同时升级到Linux 6.1内核,其XFS大folio机制与Galera缓存使用mmap写入的方式冲突,导致回写放大。建议调整readahead等参数缓解。
延伸解读
问题根源:内核升级与mmap写入的冲突
文章指出,PXC从5.7升级到8.0后出现周期性大量磁盘写入,但InnoDB写入正常。真正原因是系统同时升级到Linux 6.1内核,其XFS大folio机制与Galera缓存使用mmap写入的方式冲突。Galera缓存文件不使用write()或pwrite(),而是mmap,导致回写时以整个folio(可达2MB)为单位,而非精确的4kB文件系统块,从而产生写放大。
为何InnoDB不受影响
InnoDB表空间通常使用O_DIRECT,不经过页缓存;redo和binlog使用小追加写入,创建的是order-0(4kB)小folio。而Linux 6.6引入的按块脏跟踪改进仅对write()/pwrite()路径有效,mmap路径无法受益。因此,只有Galera线程因mmap写入而出现大量磁盘写入,InnoDB相关写入保持平稳。
影响范围与识别方法
任何使用大folio支持的内核和文件系统的PXC/Galera集群,都可能对galera.cache和gcache.page.X产生额外写放大。若磁盘默认readahead为128kB,影响可能小到被忽略;但若readahead较大且folio达到2MB,放大效应会非常明显。可通过pidstat -d、iostat观察Galera线程写入,并检查/sys/block/<dev>/queue/read_ahead_kb和optimal_io_size等参数。
缓解思路与注意事项
由于Linux内核尚未针对mmap路径提供解决方案,可调整readahead等参数缓解。文章提到相关变量包括optimal_io_size、read_ahead_kb、dirty_writeback_centisecs和dirty_expire_centisecs。此外,混合使用页缓存和O_DIRECT的活跃写入负载可能导致额外停顿,需留意。这些工作适用于任何使用mmap文件的应用,不仅限于PXC/Galera。
Q&A
PXC从5.7升级到8.0后,为什么Galera线程会出现周期性大量磁盘写入?
因为升级PXC时操作系统也从Debian 11(Linux 5.10内核)升级到了Debian 12(Linux 6.1内核)。Linux 6.1内核的XFS文件系统支持大folio,而Galera缓存使用mmap写入,导致回写时以整个folio(最大2MB)为单位同步,而不是精确的文件系统块(4KB),从而引发写入放大。
为什么InnoDB的写入没有受到大folio问题的影响?
InnoDB通常使用O_DIRECT直接I/O访问表空间,不经过页缓存;而redo log和binlog使用小的追加写入,创建的是order-0(4KB)的小folio。因此大folio导致的写入放大主要影响使用mmap路径的Galera缓存,而不是InnoDB。
Galera缓存为什么特别容易受到大folio写入放大的影响?
Galera的writeset缓存从早期开始就一直使用mmap文件。在支持大folio的内核和文件系统上,mmap写入只能跟踪整个folio,回写时会同步整个folio(最大2MB),而不是精确的4KB块。如果存储的readahead较大,放大效应会非常显著。
有哪些方法可以缓解PXC/Galera因大folio导致的写入放大?
可以调整readahead等参数来缓解。文章提到相关变量包括optimal_io_size、read_ahead_kb、dirty_writeback_centisecs、dirty_expire_centisecs,并建议检查/sys/block/<dev>/queue/下的read_ahead_kb和optimal_io_size。此外,由于内核侧暂无针对mmap路径的解决方案,这些变通方法也适用于其他使用mmap文件的应用。
大folio机制从哪个内核版本开始引入?对XFS文件系统有何影响?
大folio在Linux 5.16中引入,最初在5.18内核中仅针对XFS文件系统实现页缓存的大folio处理。在早期实现(5.18–6.5)中,write()/pwrite()路径也受影响,但Linux 6.6增加了按块脏跟踪,使write()/pwrite()路径可以按文件系统块粒度跟踪,而mmap路径仍然只能跟踪整个folio。
除了PXC/Galera,还有哪些应用可能遇到类似的大folio写入放大问题?
任何使用mmap文件的应用都可能遇到,例如systemd journal就曾报告过类似的过度IO问题。文章还提到RocksDB在混合使用页缓存和O_DIRECT时可能出现额外停顿。因此,该问题不限于PXC/Galera。