user219430 Asked: 2020-12-16 11:00:10 +0800 CST2020-12-16 11:00:10 +0800 CST 2020-12-16 11:00:10 +0800 CST 如何在 Postgres 中追踪内存峰值的原因? 772 标题讲述了这个故事,但我如何追踪 Postgres 11.10 中内存峰值的原因?正如您从下面的屏幕截图中看到的那样,内存峰值一直高达 32 GB,这导致 OOM 启动并终止了一堆连接。根据/var/log/postgresql/postgresql-11-main.log数据库系统同时进入恢复模式,我们也丢失了相当多的数据。 我怀疑连接数加上非常大的插入语句可能与它有关,但需要一种证明(或反驳)假设的方法。 postgresql postgresql-11 1 个回答 Voted Best Answer Laurenz Albe 2020-12-16T11:08:54+08:002020-12-16T11:08:54+08:00 首先,您应该配置 Linux,使其不会过度使用内存,因为您无法从被 OOM 杀手杀死的后端获得任何信息。 设置vm.overcommit_memory = 2并设置vm.overcommit_ratio为计算为的值 100 * (RAM - swap) / RAM 然后你应该从 PostgreSQL 得到一个 OOM 错误,而不是让 PostgreSQL 进入崩溃恢复。 这样的 OOM 错误会导致 PostgreSQL 日志文件中的内存上下文转储,因此您可以看到哪个内存上下文使用了所有内存。此外,您还获得了导致错误的查询,因此您可以对此进行试验。
首先,您应该配置 Linux,使其不会过度使用内存,因为您无法从被 OOM 杀手杀死的后端获得任何信息。
设置
vm.overcommit_memory = 2
并设置vm.overcommit_ratio
为计算为的值然后你应该从 PostgreSQL 得到一个 OOM 错误,而不是让 PostgreSQL 进入崩溃恢复。
这样的 OOM 错误会导致 PostgreSQL 日志文件中的内存上下文转储,因此您可以看到哪个内存上下文使用了所有内存。此外,您还获得了导致错误的查询,因此您可以对此进行试验。