如何精准计算PostgreSQL等分叉进程的真实与合并内存占用?
PostgreSQL分叉进程内存监控的问题与疑问
我正在开发基于Bash的进程内存监控脚本,针对PostgreSQL这类分叉进程时遇到诸多问题:
- RSS作为内存指标,但包含其他进程共享的库内容;
- PSS仅显示进程私有内存,但需从
/proc/<pid>/smaps获取,需root权限; - USS(Private_Dirty + Private_Clean)同样需访问
/proc/<pid>/smaps。
当前尝试的解决方法
目前我尝试遍历各PID的smaps解决问题,示例代码:
for pid in $(pgrep -a -f "postgres" | awk '{print $1}' | tr "\n" " " ); do grep "^Pss:" /proc/$pid/smaps; done
*不确定是否需排除部分PostgreSQL进程。
该方法计算得到的内存占用总和为:
PSS: 4817 MB - USS: 4547 MB - RES: 6176 MB - VIRT: 26851 MB used
但此方法需root权限,且不同工具计算结果存在差异。
工具对比
top和htop无法合并显示PostgreSQL的所有分叉进程,atop可汇总显示且结果看似准确:
NPROCS SYSCPU USRCPU VSIZE RSIZE PSIZE SWAPSZ RDDSK WRDSK RNET SNET MEM CMD 1/1
27 56m50s 16m40s 5.4G 1.1G 0K 2308K 0K 0K 0 0 11% postgres
核心疑问
- 如何精准获取PostgreSQL等分叉进程的内存占用?
- 若atop计算准确,其RSIZE值如何无需root权限获取?
补充说明
编辑:发现脚本pgrep模式存在bug,误解析非PostgreSQL进程,修正后脚本计算的RES值与atop的RSIZE一致,但核心疑问仍存:汇总RSS(RES)是否为最准确的内存统计方式?
内容的提问来源于stack exchange,提问作者Claudio Kuenzler
相关产品推荐
相关产品推荐

