【发布时间】: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
如果我错了,请纠正我,但由于 top 和 ps(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