Configuring HugePages for Oracle on Linux (x86-64)
For large SGA sizes, HugePages can give substantial benefits in virtual memory management. Without HugePages, the memory of the SGA is divided into 4K pages, which have to be managed by the Linux kernel. Using HugePages, the page size can be increased to anything between 2MB and 256MB, thereby reducing the total number of pages to be managed by the kernel and therefore reducing the amount of memory required to hold the page table in memory. In addition to these changes, the memory associated with HugePages can not be swapped out, which forces the SGA to stay memory resident. The savings in memory and the effort of page management make HugePages pretty much mandatory for Oracle 11g systems running on x86-64 architectures.
Note. Automatic Memory Management (AMM) is not compatible with HugePages, so apart from ASM instances and small unimportant databases, you will probably have no need for AMM on a real system. Instead, Automatic Shared Memory Management and Automatic PGA Management should be used as they are compatible with HugePages.
Run the following command to determine the current HugePage usage. The default HugePage size is 2MB on Oracle Linux 5.x and as you can see from the output below, by default no HugePages are defined.
$ grep Huge /proc/meminfo HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB $
Depending on the size of your SGA, you may wish to increase the value of Hugepagesize.
Create a file called "hugepages_setting.sh" with the following contents.
#!/bin/bash # # hugepages_settings.sh # # Linux bash script. to compute values for the # recommended HugePages/HugeTLB configuration # # Note: This script. does calculation for all shared memory # segments available when the script. is run, no matter it # is an Oracle RDBMS shared memory segment or not. # Check for the kernel version KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'` # Find out the HugePage size HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}` # Start from 1 pages to be on the safe side and guarantee 1 free HugePage NUM_PG=1 # Cumulative number of pages required to handle the running shared memory segments for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"` do MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q` if [ $MIN_PG -gt 0 ]; then NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q` fi done # Finish with results case $KERN in '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`; echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;; '2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;; *) echo "Unrecognized kernel version $KERN. Exiting." ;; esac # End
Make the file executable.
$ chmod u+x hugepages_setting.sh
Make sure all the Oracle services are running as normal on the server, then run the script. and make a note of the recommended "vm.nr_hugepages" value.
$ ./hugepages_settings.sh Recommended setting: vm.nr_hugepages = 191 $
Edit the "/etc/sysctl.conf" file as the "root" user, adding the following entry, adjusted based on your output from the script. You should set the value greater than or equal to the value displayed by the script. You only need 1 or 2 spare pages.
vm.nr_hugepages=192
Run the following command as the "root" user.
# sysctl -p
You can now see the HugePages have been created, but are currently not being used.
$ grep Huge /proc/meminfo HugePages_Total: 192 HugePages_Free: 192 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB $
Add the following entries into the "/etc/security/limits.conf" script, where the setting is the size of the HugePages allocation in KB (HugePages * Hugepagesize * 1024).
* soft memlock 393216 * hard memlock 393216
Check the MEMORY_TARGET parameters are not set for the database and SGA_TARGET and PGA_AGGREGATE_TARGET parameters are being used instead.
SQL> show parameter target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ archive_lag_target integer 0 db_flashback_retention_target integer 1440 fast_start_io_target integer 0 fast_start_mttr_target integer 0 memory_max_target big integer 0 memory_target big integer 0 parallel_servers_target integer 16 pga_aggregate_target big integer 125M sga_target big integer 376M SQL>
Restart the server and restart the database services as required.
Check the HugePages information again.
$ grep Huge /proc/meminfo HugePages_Total: 192 HugePages_Free: 52 HugePages_Rsvd: 49 HugePages_Surp: 0 Hugepagesize: 2048 kB $
You can see the HugePages are now being used.
Remember, if you increase your memory allocation, you need to retest the required number of HugePages, or risk Oracle running without them.
Note. If you are running Oracle 11.2.0.2 or later, you can set the USE_LARGE_PAGES initialization parameter to "only" so the database fails to start if it is not backed by hugepages. You can read more about this here.
For more information see:
- Overview of HugePages
- Configuring Linux Hugepages for Oracle Database Is Just Too Difficult! Isn’t It? Part – I.
转载:http://www.oracle-base.com/articles/linux/configuring-huge-pages-for-oracle-on-linux-64.php
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24433396/viewspace-746563/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24433396/viewspace-746563/