[20170308]再谈hugepages.txt

[20170308]再谈hugepages.txt

--//节前跟别人的交流,不幸被我言中.当时是去年5月份的事前,系统迁移,我去观摩,我感觉很奇怪的是内存128G的机器,不知道为什么不
--//应用hugepages,让我吃惊对方并不知道.因为毕竟是别的系统,别人如何做我无权过问.我当时只是提醒如果连接用户数量大,按照他们
--//当时的是设置,有可能会出现内存不足的情况.

--//我在链接http://blog.itpub.net/267265/viewspace-2128811/的测试中:
--//使用与不使用仅仅2倍差距,这是因为我但是连接后基本没执行什么sql语句.今天在写一个例子说明问题:

1.建立测试环境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> create table t as select rownum id from dual connect by level<=2;
Table created.

SCOTT@book> ALTER TABLE t MINIMIZE RECORDS_PER_BLOCK ;
Table altered.
--//这样可以实现每块2条记录.

SCOTT@book> insert into t select rownum+2 from dual connect by level <=64000-2;
63998 rows created.

SCOTT@book> commit ;
Commit complete.

--//建立测试连接的执行脚本
$ cat a.sh
#! /bin/bash
for i in $(seq 100)
do
        sqlplus -s scott/book <<EOF > /dev/null &
select count(*) from t;
host sleep 60
commit;
quit;
EOF
done

2.测试一:
--//测试前可以执行select count(*) from t;让该表数据块全部进入缓存.
--//使用hugepages的情况:

$ cat /proc/meminfo | grep -i page
AnonPages:        221076 kB
PageTables:        11972 kB
AnonHugePages:     40960 kB
HugePages_Total:     305
HugePages_Free:        3
HugePages_Rsvd:        3
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//执行脚本a.sh

$ cat /proc/meminfo | grep -i page
AnonPages:        876416 kB
PageTables:        66296 kB
AnonHugePages:     40960 kB
HugePages_Total:     305
HugePages_Free:        3
HugePages_Rsvd:        3
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//页面的使用情况:
--//66296-11972=54324. 54324/100=543.24 平均每个会话使用543K.

3.测试二:
SYS@book> alter system set use_large_pages=false scope=spfile;
System altered.

--//重启数据库.

--//测试前可以执行select count(*) from t;让该表数据块全部进入缓存.
--//如果走直接路径读,可以先设置
alter session set events '10949 trace name context forever, level 1';
select count(*) from t;

$ oerr ora 10949
10949, 00000, "Disable autotune direct path read for full table scan"
// *Cause:
// *Action:  Disable autotune direct path read for serial full table scan.

--//不使用hugepages的情况:

$ cat /proc/meminfo | grep -i page
AnonPages:        146628 kB
PageTables:        15832 kB
AnonHugePages:     20480 kB
HugePages_Total:     305
HugePages_Free:      305
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//执行脚本a.sh

$ cat /proc/meminfo | grep -i page
AnonPages:        789256 kB
PageTables:       161916 kB
AnonHugePages:     20480 kB
HugePages_Total:     305
HugePages_Free:      305
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//161916-15832=146084,146084/100=1460.84,平均每个会话使用1460.84K.对比前面也就是不到3倍的量.
--//与我的理解存在差距,我一直认为这样应该存在很大的差异,不知道那位给出解析.

4.测试三:
--//如果建立索引呢?
SCOTT@book> alter table t modify (id not null);
Table altered.

SCOTT@book> create index i_t_id on t(id);
Index created.

--//这样执行计划如下:
SQL_ID  cyzznbykb509s, child number 1
-------------------------------------
select count(*) from t

Plan hash value: 3548397654

Plan hash value: 3548397654
------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name   | Starts | E-Rows | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |      1 |        |    40 (100)|          |      1 |00:00:00.02 |     149 |
|   1 |  SORT AGGREGATE       |        |      1 |      1 |            |          |      1 |00:00:00.02 |     149 |
|   2 |   INDEX FAST FULL SCAN| I_T_ID |      1 |  64000 |    40   (0)| 00:00:01 |  64000 |00:00:00.01 |     149 |
------------------------------------------------------------------------------------------------------------------

--//不使用hugepages的情况:

$ cat /proc/meminfo | grep -i page
AnonPages:        142228 kB
PageTables:        17136 kB
AnonHugePages:     20480 kB
HugePages_Total:     305
HugePages_Free:      305
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//执行脚本a.sh:

$ cat /proc/meminfo | grep -i page
AnonPages:        795240 kB
PageTables:       104772 kB
AnonHugePages:     20480 kB
HugePages_Total:     305
HugePages_Free:      305
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//104772-17136=87636, 87636/100=876.36K,平均每个会话使用876.36K.比测试二要小一点.从另外一个侧面也可以说明优化也可以减
--//少页面表的内存占用.

5.测试四:
--//取消use_large_pages;,这样缺省是true.
SYS@book> alter system reset use_large_pages;
System altered.

--//重启数据库.回到使用hugepages的情况:
--//使用hugepages的情况:
$ cat /proc/meminfo | grep -i page
AnonPages:        135852 kB
PageTables:        10768 kB
AnonHugePages:     20480 kB
HugePages_Total:     305
HugePages_Free:       94
HugePages_Rsvd:       94
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//执行脚本a.sh:

$ cat /proc/meminfo | grep -i page
AnonPages:        789384 kB
PageTables:        64512 kB
AnonHugePages:     20480 kB
HugePages_Total:     305
HugePages_Free:       91
HugePages_Rsvd:       91
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//与测试一相似.

总结:
--我一直报者这样的观点,使用比不使用好,虽然我上面的测试相差比例1:3.缺点不能使用assm,实际上assm根本不适合大型系统.
--但是当你不使用hugepages,出现内存不足后,改用hugepages效果明显.
--而且如果你仔细看的前面的测试,实际上暗含一个提示,优化sql语句也可以达到减少页面表使用的情况.
--或者页面表占用大量的内存情况下,可能暗含统可能存在大量的不良sql语句问题.

--实际上当时我去看了一下,优化一些语句,页面表马上减少很多(当时的情况是无法重启数据库的).至少当时业务高峰顶过去了.
--但是如果采用hugepages,问题就看不出来,我看过我们生产系统的数据库,如果hugepages,大约每个用户使用500K页面表内存.

--而且内存越大,采用hugepages效果越好.

时间: 2024-09-20 20:00:54

[20170308]再谈hugepages.txt的相关文章

再谈IO的异步,同步,阻塞和非阻塞

原本转过一个<六种Socket I/O模型幽默讲解>,里面用比喻的方法讲解各种IO,但说到底那个时候我对同步异步这些还是只知其表.还未能完全理解异步和同步,现在觉得清晰一些了.总结一下. 前提概要: IO的过程: 整个IO的过程其实是应用发起IO的请求,到应用获取到IO请求数据的中间过程. 这个中间,其实主要的时间就是系统准备数据的过程.这也是异步技术的优化所在. 对系统调用的理解: 首先,我们要明确一点.IO的操作属于一种系统调用.也就是应用在运行中,进入到内核代码来执行某些重要的操作. 其

再谈ASP防止SQL Injection漏洞的问题

问题 再谈ASP防止SQL Injection漏洞的问题 /**作者:慈勤强Email: cqq1978@Gmail.com*/ 关于Asp的SQL Injection预防问题,似乎已经没什么可说的了.在我做的Asp的项目里面, 都是用自己写的函数来处理客户端提交进来的数据,我的Blog里面也贴过这个函数. 具体可以参考http://blog.csdn.net/cqq/archive/2004/09/23/113786.aspx 不过,从朋友的留言和网上其他的一些讲如何防范SQL Injecti

用户交互设计:再谈人机交互中的设计隐喻

文章描述:再谈人机交互中的设计隐喻. 上篇文章<人机交互中的设计隐喻-由Mac的文件替换引出来的话题>发出来以后收到了各种各样的反馈,我索性再写一篇续文,算是集中答复吧. 用户习惯 在所有的反馈中,"用户觉得Windows的做法更好用,所以理应这样设计"的说法可谓最多.那么我们就来看一下,为什么有人会觉得Windows的做法更"好用". 我们来看两个例子. 银行里面用的系统-就是柜台后面业务人员用的那个-基本上还是字符界面,没有漂亮的图标和窗口,甚至可能

网页设计经验分享:再谈网易首页的改版

之所以说再谈网易首页的改版,是因为去年临近奥运会的时候,网易首页做过一次改版,奥运会之后网易首页做了一下小调整,调整后的首页让人感到很困惑.今天在没有任何预告的前提下,网易又上线了新首页. 其间有个小插曲是,新首页刚上线后,很多地区突然无法访问网易首页,我访问的时候是服务器返回500. 网易就此次改版的说明是:"本次改版从整体到细节都有一个质的飞跃,新版继承了网易一贯简约.大气.包容的设计品质,达到以用户为中心提高用户体验.促进频道发展的改版设计目的." 此次改版促进频道发展的目的似乎

走近VB.Net(二) 再谈函数调用

函数 走近VB.Net(二) 再谈函数调用 在VB6中如果你想调用一个对话框,首先你知道要使用vb内置的MsgBox函数,你甚至于使用API,大部分人乐于使用API.如下:Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wTy

再谈CMOS密码

对于CMOS而言,相信大家已经不再陌生.但就CMOS密码而言,我想真正了解的人就不太多了,所以我们就做了些实验,研究了一下.以前已经有不少人讨论过了,但我觉得还是有再谈的必要,下面就把其中合适的部分拿出来,以飨各位. 在谈密码之前,还是先说说什么是CMOS(本文所言CMOS均针对Award而言).CMOS实际上存放的是计算机的系统时钟和硬件配置方面的一些信息,供系统引导时读取:同时初始化计算机各个部件的状态,总共有128个字节,存放在RAM芯片中. 好了,先看一个例子,用来向大家说明一下CMOS

再再谈java乱码:GBK和UTF-8互转尾部乱码问题分析(续)

GBK字节码用UTF-8解码 UTF-8 的编码规则 转码实例 解决问题 jdk 18 测试 jdk 1617 jdk 版本的影响 小结 参考 在<再谈java乱码:GBK和UTF-8互转尾部乱码问题分析>我们分析了,如果从一个UTF-8 的字节序列,经过 new String(b,"GBK") 的操作,"可能"(与总字节数有关)会破坏数据.结果可能是,损失最后一个"字". 反过来呢?可能会很惨,大范围溃散... 同时,可参考:一段j

【Go语言】【13】再谈GO语言的结构体

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1671842 本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struc

[译]再谈如何安全地在 Android 中存储令牌

本文讲的是[译]再谈如何安全地在 Android 中存储令牌, 原文地址:A follow-up on how to store tokens securely in Android 原文作者:Enrique López Mañas 译文出自:掘金翻译计划 译者: lovexiaov 校对者:luoqiuyu hackerkevin 作为本文的序言,我想对读者做一个简短的声明.下面的引言对本文的后续内容而言十分重要. 没有绝对的安全.所谓的安全是指利用一系列措施的堆积和组合,来试图延缓必然发生的