PostgreSQL码农集散地

为什么数据库重启或崩溃恢复后性能可能瞬间很差?

文章开始前推荐2个学习环境:

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能: 《最好的PostgreSQL学习镜像 》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库 》 3、PolarDB开源数据库内核、应用等学习图谱:  https://www.aliyun.com/database/openpolardb/activity

为什么数据库重启或崩溃恢复后性能可能瞬间很差?

https://www.bilibili.com/video/BV1pP4y177Do/

数据库实例崩溃、重启后性能可能变得很差, 就像烧油的汽车刚刚发动时还没有润滑一样. 原因是崩溃后在数据库shared buffer内的热数据没了, 大概率访问数据需要访问存储, 存储的性能和内存相差巨大, 因此性能瞬间变差.

社区版本:
为了解决启动时没有热数据的问题, PG社区版本引入了预热插件pg_prewarm.
  • pg_prewarm (版本11开始也支持自动dump pageid, 自动预热) + pg_buffercache

  • https://www.postgresql.org/docs/14/pgbuffercache.html

  • https://www.postgresql.org/docs/14/pgprewarm.html

注意:
社区版本存在double cache现象, 如果不重启服务器, 或者未清理page cache, 重启数据库实例后性能影响可能不大, 因为很多数据可能存在于page cache内.

PolarDB:

  • 不需要预热, PolarDB 支持 Persistent BufferPool的功能 (目前只有RW节点和standby实例有Persistent BufferPool), 实例重启、崩溃时, 由于Persistent BufferPool的存在, 性能基本没有抖动.

本期问题1:
为什么数据库重启或崩溃恢复后性能可能瞬间很差?
  • a. 客户端需要大量重建与数据库的连接

  • b. 数据库崩溃恢复或者重启时, shared buffer中没有数据, 所有数据都需要从存储层访问, 存储的性能和内存相差巨大, 因此性能瞬间变差.

  • c. 由于数据库重启或崩溃恢复, 操作系统的page cache中的热数据消失了

  • d. 数据库刚启动时需要处理复杂的启动任务, 所以刚启动时性能差

答案:

  • b

解释:

  • 参考本文内容


欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

文章中的参考文档请点击阅读原文获得.