[20161121]关于使用hugepage的讨论.txt
--ITPUB上的讨论, 请问使用HugePage性能提示明显吗?链接:http://www.itpub.net/thread-2071616-1-1.html
--我的观点使用总比不用好,当然你没有性能问题,也可以不用,通过一个简单的测试看说明内存的使用。
1.环境:
$ cat /etc/sysctl.conf| grep -i nr_hugepages
vm.nr_hugepages = 305
SCOTT@book> show parameter use_large_pages
NAME TYPE VALUE
--------------- ------- ------
use_large_pages string TRUE
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
2.重启数据库:
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
Database opened.
SYS@book> show parameter processes
NAME TYPE VALUE
------------------------- ------- ------
aq_tm_processes integer 0
db_writer_processes integer 3
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 0
log_archive_max_processes integer 4
processes integer 150
--建立1个脚本,a.sh
#! /bin/bash
for i in $(seq 100)
do
sqlplus -s scott/book <<EOF > /dev/null &
select sysdate from dual;
host sleep 200
commit;
quit;
EOF
done
--执行前:
$ cat /proc/meminfo | grep -i page
AnonPages: 193124 kB
PageTables: 13912 kB
AnonHugePages: 51200 kB
HugePages_Total: 305
HugePages_Free: 89
HugePages_Rsvd: 89
HugePages_Surp: 0
Hugepagesize: 2048 kB
--执行后:
$ cat /proc/meminfo | grep -i page
AnonPages: 859888 kB
PageTables: 68740 kB
AnonHugePages: 51200 kB
HugePages_Total: 305
HugePages_Free: 82
HugePages_Rsvd: 82
HugePages_Surp: 0
Hugepagesize: 2048 kB
--//PageTables使用了68740 kB,大约68M。
3.修改参数use_large_pages=false,重启数据库,也就是关闭hugepage的使用。
SYS@book> alter system set use_large_pages=false scope=spfile ;
System altered.
--重启数据库:
--执行前:
$ cat /proc/meminfo | grep -i page
AnonPages: 606504 kB
PageTables: 38904 kB
AnonHugePages: 51200 kB
HugePages_Total: 305
HugePages_Free: 305
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
--//HugePages_Free=305,表示没有使用hugepage。
--执行后:
$ cat /proc/meminfo | grep -i page
AnonPages: 1012584 kB
PageTables: 118872 kB
AnonHugePages: 51200 kB
HugePages_Total: 305
HugePages_Free: 305
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
--//PageTables使用了118872 kB,大约118M。实际上连接越大差距越大。
4.你也许会讲差距并不大,原因很容易解析。
a.连接数量不多,我仅仅测试100个连接。
b.访问的数据块很少,实际上我执行的语句根本不访问数据表dual。但是登录我审计是开的,至少存在少量sql语句。这样很容易解析为
什么仅仅相差2倍。
$ getconf PAGE_SIZE
4096
--普通页面大小4K。而使用hugepage=2048K,有2048/4=512倍的差异。但是我访问的块很少,数据块8K。我估计访问的块很离散。
--这样对以4K的页面存在8/4=2项,而对于使用hugapage仅仅1项,这样存在2倍差异还是很明显的。
c.存在512倍差异不大可能的,我估计至少20倍以上差异还是存在。顺便帖一个生产系统的情况:
# cat /proc/meminfo | grep -i page
AnonPages: 21392820 kB
PageTables: 1587204 kB
HugePages_Total: 80000
HugePages_Free: 5390
HugePages_Rsvd: 3983
HugePages_Surp: 0
Hugepagesize: 2048 kB
# ps -ef | grep oracleXXXX|wc
3629 32661 265027
--可以发现PageTables: 1587204 kB, 1587204/1024=1550.00390625M,将近1.5G,如果不使用hugepage,Pagesize可以达到30G,这样还是
--很巨大的.可以发现HugePages_Free:5390,5390块没用,浪费还是很严重的,5390*2=10780M,将近10G,也就是我们生产系统存在一定的
--浪费。反正不缺这点内存,也没时间纠正这个错误。
--说明一下,这些仅仅是我的猜测,OS的东西好多不是很了解。