使用HugePage能够有效减少整个系统的内存页数目,从而有效高TLB(Translation Lookaside Buffer)的命中率,也就是提高从虚拟内存向物理内存映射的速度。默认情况下,Linux的一个内存页是4K,而HugePage是2M (Linux 2.4-2.6)。请参考 Linux下hugetlbpage使用详解
二、设置内核参数 kernel.shmmax 和 kernel.shmall
shmmax定义了Linux能为单一的共享内存分配最大值(单位:字节),shmall则定义了系统能够使用的共享内存的页数。所以shmall的最小值是:ceil(shmmax/PAGE_SIZE)
假设我们的TimesTen的DataStore需要 400GB的Perm Space, 400G的Temp Space, Logger Buffer的大小是1G,那么共享内存需要400G+400G+1G+20MB的 DB Header=820244MB,那么我们可以把共享内存的最大值设为1T,HugePage的值设为820244MB
另外把信号量Semaphore设为2048# /sbin/sysctl -w kernel.shmmax=1099511627776 (1024GB)
# /sbin/sysctl -w kernel.shmall=536870912(=268435456/4096, 4096 is the page size)
# /sbin/sysctl -w kernel.sem="2048 64000 128 128"
三、设置系统的HugePage数目
根据上面的计算,需要的HugePage的内存数目是820244MB,每个HugePage的大小是2M,则需要820244/2 = 410122个HugePage。
# /sbin/sysctl -w vm.nr_hugepages = 410122其中501是TimesTen的DBA所属的组ID号。
# /sbin/sysctl -w vm.hugetlb_shm_group = 501
为了避免重启系统生效,直接执行以下命令,让操作系统立刻分配这么多HugePage的内存,这个时候会发现sysctl很忙,并且操作系统的Free的内存逐渐减少,直至分配内存的任务完成$ id
uid=500(oracle) gid=501(oinstall) groups=500(dba),501(oinstall)
在下图中我们为系统分配了270个HugePage页,目前都是空闲的。页的大小是2M# echo "410122" > /proc/sys/vm/nr_hugepages
四、设置TimesTen的Daemon参数# cat /proc/meminfo |grep Huge
HugePages_Total: 270
HugePages_Free: 270
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
在$TT_HOME//info/ttendaemon.options中加入一行-linuxLargePageAlignment X,其中X是HugePage的大小,单位为MB,这里为2M
五、启动TT的DataStore,并检查效果-linuxLargePageAlignment 2
TT设置的内存PermSize+TempSize+LogerBuffer+20MB=400+32+64(LogBuf的默认大小)+20(DB Header)=516M,这是计算的结果
来看TT实际使用的结果,看到TT正确的使用了Large Pages,并且成功锁定了(不进行交换),共享内存的ID号是4259844[sampledb_1122]
Driver=/home/oracle/TimesTen/tt1122/lib/libtten.so
DataStore=/home/oracle/TimesTen/tt1122/info/DemoDataStore/sampledb_1122
Connections=10
PermSize=400
TempSize=32
PLSQL=1
DatabaseCharacterSet=US7ASCII
看这块共享内存的实际大小:541065216/1024/1024=516,和计算的值完全相同。$ ttstatus
TimesTen status report as of Mon Jun 4 22:18:21 2012
Daemon pid 4266 port 53396 instance tt1122
TimesTen server pid 4275 started on port 53397
------------------------------------------------------------------------
Data store /home/oracle/TimesTen/tt1122/info/DemoDataStore/sampledb_1122
There are 12 connections to the data store
Shared Memory KEY 0x40007c13 ID 4259844 (LARGE PAGES, LOCKED)
PL/SQL Memory KEY 0x41007c13 ID 4292613 Address 0x7fa0000000
以下的数据目前还是无法解释,为什么分配出去的不到516M ?(270-56)×2=428,但如果把TT关闭,则所有的HugePage全部释放$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x45007b1d 4227075 oracle 660 1048576 1
0x40007c13 4259844 oracle 660 541065216 2
0x41007c13 4292613 oracle 660 33554432 2
# cat /proc/meminfo |grep Huge
HugePages_Total: 270
HugePages_Free: 52
HugePages_Rsvd: 40
Hugepagesize: 2048 kB