当无法从LRU上获得一个可替换的Page时,说明当前Buffer pool可能存在大量脏页,这时候会触发single page flush(buf_flush_single_page_from_LRU),即用户线程主动去刷一个脏页并替换掉。这是个慢操作,尤其是如果并发很高的时候,可能观察到系统的性能急剧下降。在RDS MySQL中,我们开启了一个后台线程, 能够自动根据当前Free List的长度来主动做flush,避免用户线程陷入其中。
除了single page flush外,在MySQL 5.7版本里还引入了多个page cleaner线程,根据一定的启发式算法,可以定期且高效的的做page flush操作。
本文对此不展开讨论,感兴趣的可以阅读我之前的月报:
MySQL · 性能优化· 5.7.6 InnoDB page flush 优化
MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
在MySQL的InnoDB存储引擎中count(*)函数的优化