暂无图片
暂无图片
7
暂无图片
暂无图片
2
暂无图片

查看PostgreSQL数据库进程占用内存的正确姿势

中启乘数 2021-12-20
7975

  

 

·前言·

目前很多同学使top
命令查看内存时,会发现有一些PostgreSQL进程占用了很大的内存,用ps aux常看各个进程的内存时,如果把各个进程的内存加起来时,发现超过了总内存,所以很困惑。中启乘数科技做为专业的数据库服务提供商,对此问题有深入的研究,在这里给大家解惑。






































··原理解释··


我们用top查看时,有时会看到某个PostgreSQL进程占用的内存很大,如下图所示:


从上图中可以看到进程(pid=45286)占到了机器总内存的25.9%,这台机器的总内存是128G,25.9%,基本就是33GB,从感觉上看觉得不可能?但是这里确实显示占用了这么大内存。进一步查看这个进程:

  1. [root@pg01 ~]# ps -ef|grep 45286|grep -v grep

  2. postgres 452864528202020?05:33:30 postgres: checkpointer

复制

发现这个进程是checkpointer进程,难道有内存泄露?但是查看了很多长时间运行的PostgreSQL数据库,发现checkpointer进程都占用了很高的内存。实际上这里看到的这个内存并不是这个进程实际占用的真实内存。原因是这里显示的内存包括了共享内存,而共享内存是在很多的进程之间共享的,不能都算到这个进程头上。另我们知道PostgreSQL数据库使用了很大的共享内存,做数据块的缓存。查看数据库的参数shared_buffers看到数据库的共享内存的大小:

  1. [postgres@pg01 ~]$ psql

  2. psql (11.7)

  3. Type"help"for help.


  4. postgres=# show shared_buffers;

  5. shared_buffers

  6. ----------------

  7. 32GB

  8. (1 row)

复制

我们有时也会用ps aux查看进程的内存,如下:

注意上图中的列VSZ是虚拟内存并不是实际占用的内存,RSS虽然是实际的内存,但是包括了共享的部分。而top命令中看到进程内存的百分比就是RSS内存占用总内存的百分比。

所以查看PostgreSQL进程占用的内存,正确的姿势应该是把共享的那部分内存给扣除掉,但是用ps
命令没有办法扣除掉这部分内存。而实际上我们可以看/proc/
/smaps文件中查看Pss内存,Pss表示的内存是把共享内存平分到各个进程上的内存,这实际上是这个进程占用的实际内存:

  1. [root@pg01 ~]# cat /proc/12047/smaps |more

  2. 00400000-00ad1000 r-xp 00000000 fd:0142123205/usr/pgsql-11.7/bin/postgres

  3. Size: 6980 kB

  4. Rss: 528 kB

  5. Pss: 67 kB

  6. Shared_Clean: 512 kB

  7. Shared_Dirty: 0 kB

  8. Private_Clean: 16 kB

  9. Private_Dirty: 0 kB

  10. Referenced: 528 kB

  11. Anonymous: 0 kB

  12. AnonHugePages: 0 kB

  13. Swap: 0 kB

  14. KernelPageSize: 4 kB

  15. MMUPageSize: 4 kB

  16. Locked: 0 kB

  17. VmFlags: rd ex mr mw me dw sd

  18. 00cd0000-00cd1000 r--p 006d0000 fd:0142123205/usr/pgsql-11.7/bin/postgres

  19. Size: 4 kB

  20. Rss: 4 kB

  21. Pss: 0 kB

  22. Shared_Clean: 0 kB

  23. Shared_Dirty: 4 kB

  24. Private_Clean: 0 kB

  25. Private_Dirty: 0 kB

  26. ...

  27. ...

  28. ...

复制

这个smaps看到的内存非常详细,有很多项,如果我们想查询出哪些进程占用内存多,不是很方便。

实际上CentOS7.X下提供了命令smem,可以方便的查看Pss内存。

···使用smem查看进程占用的内存···


smem工具可以方便的查看Pss内存,这个工具实际是一个python脚本。

smem工具一般默认都没有安装上,这个包是在EPEL扩展包中,所以需要先安装epel扩展包:

  1. yum install epel-release

复制

然后在安装smem:

  1. yum install smem

复制

用smem命令查看占用内存最多的前20个进程:

如果完全不包括共享部分的内存,可以看上面“USS”列显示的内存。

最后把几类内存的名词解释一下:

·VSS- Virtual Set Size 虚拟内存(包含共享库占用的内存)

·RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)

·PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

·USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

本站文章,未经作者同意,请勿转载,如需转载,请邮件customer@csudata.com.



公司邮箱:services@csudata.com

公司官网:http://www.csudata.com

文章转载自中启乘数,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

11 0
暂无图片
1年前
评论
暂无图片 0
👍
1年前
暂无图片 点赞
评论
Switchblade
暂无图片
1年前
评论
暂无图片 1
做为
1年前
暂无图片 1
评论