【问题标题】:How does one monitor Postgres memory usage?如何监控 Postgres 内存使用情况?
【发布时间】:2021-04-28 15:28:48
【问题描述】:

我们在 Kubernetes 中运行 Postgres。我们的 Prometheus pod 监控始终显示 Postgres 以共享或缓存状态填满了整个 pod 内存。

free -h
              total        used        free      shared  buff/cache   available
Mem:            62G        1.7G         13G         11G         47G         48G


ps -u postgres o pid= | sed 's#.*#/proc/&/smaps#' | sed 's/ //g#/proc/&/smaps#' | \
    xargs grep -s ^Pss: | awk '{A+=$2} END{print "PSS: " A}' 
PSS: 13220013 kb

ps -u postgres o pid,rss:8,cmd | awk 'NR>1 {A+=$2} {print} END{print "RSS: " A}' | tail -1
RSS: 38794236 kb

如果我错了,请纠正我,但由于 topps(RSS/RES) 中显示的内存是共享内存,这意味着 Posgres 没有使用该内存,它仅在需要时保留,并且其他进程也可以使用该内存。一些articles 说需要cat /proc/<PID>/smaps 并检查PSS 以找到Postgres 的实际内存使用情况。

我们最近遇到了 OOM 错误,但我们无法在监控中发现它。由于我们的 pod 内存监控始终显示 90% 的使用率,因为它只监控 RSS/RES 内存,其中也包括共享/缓存内存。因此,当发生 OOM 错误并且我们的数据库出现故障时,我们没有看到 RAM 有任何增加。该错误是由我们向后端引入的新查询引起的,该查询每次查询使用大量内存。

我们安装了 prometheus-postgres-exporter,为我们提供了良好的 Postgres 指标,但这并没有表明我们有使用大量内存的查询,但也许我们的 Grafana 图表缺少该图表?

因为我们在 Kubernetes 中运行 Postgres,所以导出 PSS 内存很麻烦。所以感觉好像我错过了什么。

那么如何监控 Postgres 的内存使用情况呢?如何处理使用过多内存的查询或处理由于负载而使用过多内存的 postgres?

【问题讨论】:

    标签: postgresql kubernetes monitoring psql


    【解决方案1】:

    我建议您通过在/etc/sysctl.conf 中设置vm.overcommit_memory = 2 并运行sysctl -p 来禁用内存过量使用。不要忘记根据您拥有的 RAM 和交换区适当地设置 vm.overcommit_ratio

    应该阻止OOM杀手。

    然后您可以检查/proc/meminfo 以了解您是否内存紧张:

    • CommitLimit 显示内核愿意分配多少内存

    • Committed_AS 显示进程分配了多少内存

    详情请查看kernel documentation

    【讨论】:

    • 感谢这个信息很方便!我想对于 PSQL 内存监控,必须监控 /proc/meminfo ?要弄清楚一个人是否会很快耗尽内存?
    • 我认为这不是 PostgreSQL 特有的。如果您的监控系统不了解共享内存的工作原理,则可能是其他软件也存在问题。
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2011-04-30
    • 2011-07-10
    • 1970-01-01
    • 2021-11-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多