开发者社区> 问答> 正文

有一台64GRAM的机器A和一台32G的机器B 都装了PG 11 ,A的参数 share_buffer 设置为 16G,机器B的share_buffer设置为 8G,其它的内存相关的配置参数(work mem 等等) 机器B都是A 的一半,参数设置都是参照的德哥github的文章 pg 参数模板设的。

现在问题是 一套相同的程序连接 A 高峰跑起来时,机器A的内存占用 时 33%, 而程序连接到机器B的PG上,高峰时 内存占用确达到 88%,两台机器的CPU占用水平倒是一样的,。

两条机器的 CPU规格时一样的。
那套程序 跑的数据,跑的数据都是一样的,都是往pg里面 多个表 insert/update/delete 数据,大部分情况时 insert 数据。高峰时 数据库连接有 110个。

我的疑问时 为什么 A 内存只占了 33% ,而B都占了 88%?到底时 A 不正常 还是 B不正常。
A 不正常是否意味着 内存没有有效利用起来,需要调高 share_buffer?
内存占用是用TOP工具统计的

image

机器都在阿里云上
ECS A : 8核64G
B : 8核 32G
上面的TOP截图 时 机器A 上 的截图

image

内存的消耗量上 机器A 是占用 21g,机器B是 28G
关于 插入的数据量 ,都是同一套程序, 提交的数据也都是同一套.
机器A和 机器B 的初始数据都是一样的.
都是独占的.连接的程序,业务量都是相同的数据去挨个测得的。现在机器B 是只要开起来,随便跑一下,内存就到了 80%多,不过就稳定在这里,不会超过 90%。机器A是稳定在 33%左右。

我正在看两台机器得pg_top. 感觉看不出来差异得原因在哪里。
机器B 上现在没有跑数,只是空跑(测试程序 去跑机器A得了),机器B还是内存还是 27G(86%,从 top 上看得。pg_top没有这项显示).
而机器A 上面现在有100多连接在并发,但 内存也却没那么高(21G从 top 上看得。pg_top没有这项显示)。

机器A pg_top
image

机器B pg_top
image

机器B看来是操作系统缓存的问题了。
pg 停掉 系统内存使用占比 从 82% 降到 55%,PG应该使用了27%。
然后再重启linux, 内存占比 从 55% 讲到 3.1%。
然后再启动 pg,内存占比从 3.1% 到 4%。

展开
收起
我叫石头 2019-01-09 20:56:53 3180 0
1 条回答
写回答
取消 提交回答
  • 重启大法 , 以后内存分析 smem还是很管用的 可以分析系统占用内存 具体某个进程占用内存的情况等等;

    2年前也遇到过类似问题 那时是java程序占用内存特别高,后来也是重启centos系统解决掉的,也许是云服务商的虚拟化技术的问题。

    smem 的确是查询系统内存使用情况的利器!

    问题答疑来自云栖社区-技术进阶[钉钉群],喜爱PostgresSQL的同学扫码进群

    image | left

    2019-07-17 23:25:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
Data as a Service - 数据即服务 -- MongoDB⾼级应⽤模式 立即下载