学习了
前段时间考11gOCP 挂在了053这门考试中,发现OCP考试坑人成分居多。。。遂吐槽下......
total
used
free
shared
buffers
cached
oracle
hard memlock unlimited
添加入到
/etc/security/limits.conf
maximum locked-in-memory address space (KB)
操作系统版本:
[root@test ~]# uname -a
Linux test.example.com 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@test ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
oracle版本:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE
11.2.0.1.0
Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
言归正传,这几天课余时间,研究了11G R2在RHEL6 开启大页的设置,折腾了我2两小时方法如下:
调整内核参数
vm.nr_hugepage = 页的数量
比如我要设置1050个大页
[root@test ~]# echo "vm.nr_hugepages = 1050" >> /etc/sysctl.conf
[root@test ~]# sysctl -p
在这里要注意的是你的 数量x页的大小 不超过你空闲的内存,否则,大页数量少于调整的数量。
如何查看一个大页有多大呢:
[root@test ~]# cat /proc/meminfo | grep -i hugepagesize
Hugepagesize: 2048
查看大页是否生效:
[root@test ~]# sysctl -a | grep huge
AnonHugePages: 47104 kB
HugePages_Total:
1050 #这里有数字代表大页生效
HugePages_Free:
1050
HugePages_Rsvd:
0
HugePages_Surp:
0
Hugepagesize:
2048 kB
系统参数调整这里就可以了。
刚调出的大页尽管是空闲状态,但在操作系统看来,是被占用的物理内存空间。所以使用free查看的时候会发现好多物理内存没有了:
[root@test ~]# free -m
Mem:
3961
2695
1266
0
31
244
-/+ buffers/cache:
2419
1542
Swap:
5999
0
5999
如何查看大页是否被使用了呢:
[root@test ~]# cat /proc/meminfo | grep -i huge
AnonHugePages:
47104 kB
HugePages_Total:
1050
#
a系统总共大页的数量
HugePages_Free:
1050
#
b系统空闲大页的数量
HugePages_Rsvd:
0
#
c预分配的大页的数量
HugePages_Surp:
0
#
d超额分配的大页的数量
Hugepagesize:
2048 kB
以上a,b很好理解,c就有点抽象了,这里来解释下预分配,它是操作系统高效利用内存的方式之一。比如应用程序的进程在使用malloc(1024*1024*1024)函数申请内存时候,操作系统并不会立刻就从系统空闲的物理内存当中抽出1G出来分配给应用进程,而是“承诺”给应用进程1G内存。这份“承诺”就是预先分配,因为操作系统认为应用进程拿到内存后,并不会立即使用,而是过一会儿再使用。所以当进程真正使用这份被“承诺”的内存时,操作系统才真正分配空间。而d,超额分配就是预分配页的数量大于空闲页数量的部分, linux允许承诺给进程的内存超过系统空闲的内存(超出的百分比也可以设置),因为linux内核认为进程不会“约”好一起集中使用物理内存,就好象银行所有用户不会集中去取银行的钱一样。虽然银行的钱不太会被取空。 但物理内存很有可能被用光,当物理内存+swap都用光的时候,才有传说中的OOM情况。
接下来调整用户的限制,linux下有个很特别的功能叫做PAM(不懂的童鞋自行百度,如果想学习可以报考RH413)其中有个模块叫做
pam_limits.so 这个模块专门控制用户可以使用的计算机资源,这个模块有个配置文件叫做
/etc/security/limits.conf 看到这里,小伙伴们似乎明白了什么。
这个配置文件中可以限制用户对系统资源访问的种种行为(除了真实物理内存的使用,需要用cgroup来限制)。
其中有个memlock参数需要进行调整
将以下内容 oracle
soft memlock unlimited
通过命令
man limits.conf 可以查看到limits.conf配置文件的文档,对这个参数的描述只有半句话:
memlock
直译为 最大被锁在内存当中的地址大小。
本人的理解就是用户所属的进程占用的内存,不能被交换出去的最大值。默认为64K
调整完这个参数之后oracle用户需要重新登录才生效。
重新登录后查看这个参数是否生效:
[oracle@test ~]$ ulimit -a
core file size
(blocks, -c) 0
data seg size
(kbytes, -d) unlimited
scheduling priority
(-e) 0
file size
(blocks, -f) unlimited
pending signals
(-i) 31536
max locked memory
(kbytes, -l) unlimited ##生效了
max memory size
(kbytes, -m) unlimited
open files
(-n) 1024
pipe size
(512 bytes, -p) 8
POSIX message queues
(bytes, -q) 819200
real-time priority
(-r) 0
stack size
(kbytes, -s) 10240
cpu time
(seconds, -t) unlimited
max user processes
(-u) 2047
virtual memory
(kbytes, -v) unlimited
file locks
(-x) unlimited
最后启动oracle:
[oracle@test ~]$ rlwrap sqlplus
/ as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Fri Dec 6 20:33:25 2013
Copyright (c) 1982, 2009, Oracle.
All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 2137886720 bytes
Fixed Size
2215064 bytes
Variable Size
503317352 bytes
Database Buffers
1627389952 bytes
Redo Buffers
4964352 bytes
Database mounted.
Database opened.
在这里要注意的一个很重要的点 要想让oracle使用大页 必须关闭掉11g的AMM特性:
SQL> show parameter mem
NAME
TYPE
VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address
integer
0
memory_max_target
big integer 0
memory_target
big integer 0
shared_memory_address
integer
0
在这里 我将sga设置为如下值
SQL> show parameter sga
NAME
TYPE
VALUE
------------------------------------ ----------- ------------------------------
lock_sga
boolean
FALSE
pre_page_sga
boolean
FALSE
sga_max_size
big integer 2G
sga_target
big integer 2G
SGA最多会占用2048M内存
最后查看大页状态:
[root@test ~]# cat /proc/meminfo | grep -i huge
AnonHugePages:
51200 kB
HugePages_Total:
1050 #总共1050个大页
HugePages_Free:
776 #空闲776个大页
HugePages_Rsvd:
751 #预分配751个大页
HugePages_Surp:
0
Hugepagesize:
2048 kB
因为在我的系统中只有oracle数据库才会占用大页 所以通过计算 (1050-776)+ 751 =1025 得到oracle占用的页为1025个 总共2050M内存 , 而我们之前是这的sga值为2G证明oracle在获取大页的时候会多一个页,至于原因我还不知道。
如果想要oracle在启动实例的时候避免操作系统的“预先分配”直接获得物理内存 可以修改启动参数
pre_page_sga将其设置为true:
SQL> alter system set pre_page_sga=true scope=spfile;
然后关闭数据库
SQL> shutdown immediate
然后启动数据库实例
SQL> startup nomount
最后查看大页分配的状况:
[root@test ~]# cat /proc/meminfo | grep -i huge
AnonHugePages:
51200 kB
HugePages_Total:
1050
HugePages_Free:
25 #很干净的被分配出了1025个页
HugePages_Rsvd:
0
HugePages_Surp:
0
Hugepagesize:
2048 kB
使用大页有两个好处:
1减少页表使用的开销,特别是在大内存的使用,页表开销尤为浪费内存空间。
2大页不会被操作系统交换出去,所以进程使用大页,保证其I/O通畅。
关于第二点 不被交换出去 在oracle启动参数文件当中有个参数
lock_sga 如果开启为true sga占用的内存不会被操作系统交换出去(经过本人亲自测试 以后会放上测试效果试验) 。但我们有大页可以用 为何要用这个参数呢?我也不明白嘿嘿。。。。