查看: 6503|回复: 19

[原创] 你知道如何计算真正的PGA么?

[复制链接]
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
跳转到指定楼层
1#
发表于 2010-7-26 22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PGA大家都知道,就是Oracle Process所独有的一段内存。

那么你知道如何计算真正的PGA么?

于是熟悉Oracle的大家会想到两种办法:

select value from v$pgastat where NAME='total PGA allocated';
或者
select sum(PGA_ALLOC_MEM) from v$process;

这两个值应该相当接近。

但是,事实是这样么?这两个视图是完全准确的么?
答案是否定的。这两个视图会少计算PGA。

让实验告诉我们为什么:
1. 在一个几乎完全idle的数据库上(dedicate mode),由动态视图显示其当前PGA为76M, 当前session数目为34;操作系统当前free memory为11143.6M。
select value/1024/1024  from v$pgastat where NAME='total PGA allocated'
union all
select sum(PGA_ALLOC_MEM)/1024/1024 from v$process
union all
select count(*) from v$session;

VALUE/1024/1024
---------------
     76.6796875
     76.6996403
             34


RAM       Avail 11143.6 Mb

2. 从远端写一个java多线程程序连接到数据库上,保持一定时间。(脚本最后attached--jdbc.java)
javac jdbc.java
java jdbc 200     -- open 200 sessions

3. 当session数目增长到261时,此时动态视图显示当前PGA为197M;操作系统当前free memory为10329.7 M。
SQL> /
VALUE/1024/1024
---------------
     197.273438
      197.44428
            261


RAM       Avail 10329.7 Mb

4. 由此可知,操作系统减少的内存为814M(11143-10329),但是由动态视图v$pgastat和v$process算出来的增加的PGA只有121M(197-76)。
所以,在此种情况下,动态视图明显少计算了很大一部分的PGA。


-----------------------------------------------------------

那么如何才能真正计算出PGA的大小呢?
在Solaris/unix上,可以使用pmap -x <pid>。
为什么不直接用pmap(pmap pid会快很多),而用pmap -x?
因为pmap -x才会计算出真正一个进程所独占的内存空间。

例如
> pmap -x 9041
9041:   oracleSID (DESCRIPTION=(LOCAL=NO)(SDU=8192))

(中间是具体每个mapped object所占的内存,省略)
         Address     Kbytes        RSS       Anon     Locked Mode   Mapped File

---------------- ---------- ---------- ---------- ----------
        total Kb   77014800   77005280      13096   76873808


这里,第四列Anon的总和就是这个进程所独占的内存,而不会包含SGA的那部分。


如果我们直接采用pmap pid的结果,取其[ heap ]+[ anon ]+[ stack ]之和来当做PGA是不准确的。
这里有两点原因:
1.这种方法计算出的pmap不包含一些lib的数据空间。
例如,我们通过pmap pid可以看到对同一个lib有两行内容:
FFFFFFFF7C100000         32K r-x--  /lib/sparcv9/librt.so.1
FFFFFFFF7C208000          8K rwx--  /lib/sparcv9/librt.so.1


其中第一行是代码部分,可以看到,是不能写的:r-x--  。
第二行时数据部分,是可写的:rwx--  

这里第二行的数据部分,其实应该归入PGA的计算中。

2.pmap pid显示出来的是虚拟内存,不仅仅包含RSS部分。
而pmap -x pid会分隔开RSS部分以及Anon部分,而我们关注的仅仅是Anon部分。
例如看看pmap -x pid和pmap的这个差别:

pmap -x pid:
         Address     Kbytes        RSS       Anon     Locked Mode   Mapped File
0000000106730000        832        192         64          - rwx--    [ heap ]


pmap pid:
0000000106730000        832K rwx--    [ heap ]

其实说这么多,大家只需记住pmap -x pid的结果对Anon的总和就是这个进程独占的内存空间,也就是PGA.


所以,随之而来的计算PGA的脚本也孕育而生,其实逻辑很简单:
1.找出所有process,除了后台进程(其实后台进程也应该算在PGA之内,但是由于在高并发环境下pmap -x 后台进程比较危险,而且也没多少后台进程,所以忽略不计)。
select spid from v$process where spid is not null and  background is null;

2.对每个进程pmap -x,计算出Anon的总和,也就是PGA。
pmap -x $eachprocess |grep "total" > tmpfile

cat tmpfile | awk '{sum+=$5;}END{print sum}'


在1000+个sessions的数据库上如此检测,会得到非常准确的PGA大小。
(当然,在执行脚本的过程中,如果有进程退出,那么pmap会找不到该进程,所以这样写脚本适合长连接。)


jdbc.rar

753 Bytes, 下载次数: 221

论坛徽章:
27
数据库板块每日发贴之星
日期:2010-06-17 01:01:07迷宫蛋
日期:2011-07-07 15:25:46紫蛋头
日期:2011-08-10 10:31:56ITPUB十周年纪念徽章
日期:2011-09-27 16:33:28ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-02-07 09:59:35ITPUB知识分享者
日期:2012-02-20 17:49:25铁扇公主
日期:2012-02-21 15:02:40ITPUB年度最佳BLOG写作奖
日期:2012-03-13 17:09:53ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
2#
发表于 2010-7-26 22:50 | 只看该作者
学习了!
select value from v$pgastat where NAME='total PGA allocated';
select sum(PGA_ALLOC_MEM) from v$process;

这两个得出的值之间存在差别 ,为什么呢?

使用道具 举报

回复
论坛徽章:
2
2012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
3#
发表于 2010-7-27 11:35 | 只看该作者
学习了!!

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
4#
发表于 2010-7-27 11:41 | 只看该作者

使用道具 举报

回复
论坛徽章:
66
现任管理团队成员
日期:2011-05-07 01:45:08版主9段
日期:2013-04-21 02:21:02ITPUB年度最佳版主
日期:2014-02-19 10:05:27ITPUB年度最佳版主
日期:2013-01-30 17:30:25ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05优秀写手
日期:2013-12-18 09:29:15元宝章
日期:2015-02-10 19:57:54金牌徽章
日期:2015-02-10 19:59:42银牌徽章
日期:2015-02-10 19:59:42铜牌徽章
日期:2015-02-10 19:59:41
5#
发表于 2010-7-27 12:45 | 只看该作者
支持下lz

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
6#
发表于 2010-7-27 12:48 | 只看该作者
4. 由此可知,操作系统减少的内存为814M(11143-10329),但是由动态视图v$pgastat和v$process算出来的增加的PGA只有121M(197-76)。
所以,在此种情况下,动态视图明显少计算了很大一部分的PGA。

这里减少的814M是否都是PGA?也就是后面统计出来时数是多少?跟814M相差多少呢?

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
7#
发表于 2010-7-27 12:49 | 只看该作者
好贴是必须要save的,还需要支持LZ的辛苦劳动,赞扬LZ的分享精神...

使用道具 举报

回复
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
8#
 楼主| 发表于 2010-7-27 13:06 | 只看该作者

回复 #6 sundog315 的帖子

对的,全是PGA,因为这个机器没人用,内存很稳定,当所有sessions退出后,也会看到同样大小的内存释放出来。

使用道具 举报

回复
论坛徽章:
32
奥运会纪念徽章:摔跤
日期:2012-08-23 11:03:05青年奥林匹克运动会-击剑
日期:2014-09-19 10:58:152014年世界杯参赛球队:巴西
日期:2014-07-07 12:19:232014年世界杯参赛球队: 瑞士
日期:2014-05-19 12:18:36马上有钱
日期:2014-04-08 12:12:232014年新春福章
日期:2014-04-04 14:20:47马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09红旗
日期:2014-02-14 15:15:55优秀写手
日期:2013-12-18 09:29:16
9#
发表于 2010-7-27 13:44 | 只看该作者
学习!

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-01-04 08:33:08ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512013年新春福章
日期:2013-02-25 14:51:242015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
10#
发表于 2010-7-27 14:14 | 只看该作者
PGA包含的是有关进程正在使用的操作系统资源信息以及进程的状态信息,而其它的进程所使用的Oracle的共享资源是在SGA中。PGA是私有的而不是共享的,这个机制是有必要的,因为当进程死掉后可以把这些资源清除和释放掉。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表