====== Huge Pages für eine Oracle Datenbank einrichten - Transparent Huge Pages deaktivieren ====== Ab einer gewissen Speichergrößen empfiehlt es sich Huge Pages für die Verwaltung des Speichers einzusetzen und das neue Feature Transparent Huge Pages zu deaktivieren. ====Einrichtung Huge Pages:==== - Datenbank auf die Verwendung des Parameters sga_target überprüfen - memory_target wird nicht unterstützt - Anzahl der benötigten Huge Pages im OS aus der SGA Größe ermitteln - HugePages im OS definieren - Datenbank anpassen - Numa Einstellungen prüfen und deaktivieren "_enable_NUMA_optimization"=false - AMM (Automatic Memory Management) MEMORY_TARGET & MEMORY_MAX_TARGET ausschalten - Indirect data buffers - Parameter USE_INDIRECT_DATA_BUFFERS=FALSE (default), dadurch memory allocation in pseudo-files under ramfs/tmpfs deaktivieren - Paramter use_large_pages=true|automatic einstellen ===Umstellen auf SGA_TARGET=== Beim Umstellen von AMM (memory_target) Parameter darauf achten, das diese nicht auf den Wert "0" sondern resetet werden! Hier für eine Cluster Datenbank: sqlplus / as sysdba show parameter target show parameter max alter system set sga_target=40G scope=spfile sid='*'; alter system set sga_max_size=40G scope=spfile sid='*'; alter system reset memory_target sid='*'; alter system reset memory_max_target sid='*'; exit srvctl stop database -d GPIDB srvctl start database -d GPIDB sqlplus / as sysdba #check show parameter target show parameter max #set PGA show parameter pga_aggregate_target alter system set pga_aggregate_target=8G scope=spfile sid='*'; exit Bei Fehler mit memory_target siehe auch "ORA-00843, ORA-00849 When Trying To Change SGA_TARGET With MEMORY_MAX_TARGET=0 Being Active (Doc ID 1397761.1)" === Anzahl der Huge Pages ermitteln === Rule of thumb: Byte Wert von "show SGA + 1%" / 2MB = sqlplus / as sysdba sql>show sga Total System Global Area 4.2758E+10 bytes .... sql>select (4.2758E+10 * 1.01 )/ ((1024*1024)*2) as count_pages from dual; COUNT_PAGES ----------- 20592.4892 => Im OS 20593 Seiten konfigurieren für sga_target=40G Oder Verwendung des Scripts unter Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1) === Im OS die Huge Pages konfigurieren === => Script für die Größe bei einer laufenden DB => https://oracle-base.com/articles/linux/configuring-huge-pages-for-oracle-on-linux-64 Mit "sysctl -w vm.nr_hugepages=20593" kann die Anzahl der Huge Pages gesetzt werden. Damit das auch noch nach dem nächsten Reboot gilt: vi /etc/sysctl.conf .. vm.nr_hugepages= 20593 .. sysctl -w vm.nr_hugepages=20593 # oder einfach sysctl -p Prüfen mit: # grep HugePages /proc/meminfo HugePages_Total: 20593 HugePages_Free: 20593 HugePages_Rsvd: 0 HugePages_Surp: 0 Das auf allen Cluster Knoten in einer RAC Umgebung auch einrichten! User Limits anpassen vi /etc/security/limits.conf oracle soft memlock unlimited oracle hard memlock unlimited === DB anpassen === Den DB Parameter use_large_pages setzen: * false = keine Hugepages verwenden * true = Hugepage verwenden, falls genug da, ansonsten 4K Pages * only = Nur HugePages verwenden, falls zuwenige => ora-27102 : out of memory beim start der Instance * auto = ab 11.2.0.3 wird die Verwendung von Huge Pages automatisch erzwungen falls möglich siehe Node 1392497.1 sqlplus / as sysdba sql>show parameter use_large_pages sql>alter system set use_large_pages=only scope=spfile sid='*'; exit srvctl stop database -d GPIDB # grep HugePages /proc/meminfo HugePages_Total: 20593 HugePages_Free: 20593 HugePages_Rsvd: 0 HugePages_Surp: 0 srvctl start database -d GPIDB # grep HugePages /proc/meminfo HugePages_Total: 20593 HugePages_Free: 17195 HugePages_Rsvd: 17083 HugePages_Surp: 0 HugePages_Total is the size of the pool of huge pages. HugePages_Free is the number of huge pages in the pool that are not yet allocated. HugePages_Rsvd is short for "reserved," and is the number of huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made. Reserved huge pages guarantee that an application will be able to allocate a huge page from the pool of huge pages at fault time. HugePages_Surp is short for "surplus," and is the number of huge pages in the pool above the value in /proc/sys/vm/nr_hugepages. The maximum number of surplus huge pages is controlled by /proc/sys/vm/nr_overcommit_hugepages. Auf den Wert von HugePages_Rsvd achten! siehe auch https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt ==Fehler: "ORA-27125: unable to create shared memory segment" bei set use_large_pages=only== adrci show alert ... ****************************************************************** Large Pages are not compatible with specified SGA memory parameters use_large_pages = "ONLY" cannot be used with memory_target, memory_max_target, or use_indirect_data_buffers parameters Large Pages are compatible with sga_target and shared_pool_size ****************************************************************** .. Die Ursache sind falsch auf 0 gesetzte MEMORY TARGET Parameter! Lösung, Mit Backup PFILE SPFILE "reparieren" und Memory Parameter reseten und nicht auf den wert 0 setzen! #Merken wo das SPFILE zur Zeit liegt: srvctl config database -d GPI .... Spfile: +DATA01/ISORCL7/spfileISORCL7.ora ... #Backup SPfile suchen, letzes Backup in meine Fall unter #/u01/app/oracle/flash_recovery_area/GPIDB1/init_GPIDB1_1.ora sqlplus / as sysdba sql>create spfile='+DATA01/GPIDB/spfileGPIDB1.ora' from pfile='/u01/app/oracle/flash_recovery_area/GPIDB/init_GPIDB_1.ora'; sqlplus>startup # Memory Parameter wie oben beschrieben anpassen sqlplus>shutdown immediate sqlplus>exit exit srvctl start database -d GPIDB Bei Fehler mit memory_target: siehe auch ORA-00843, ORA-00849 When Trying To Change SGA_TARGET With MEMORY_MAX_TARGET=0 Being Active (Doc ID 1397761.1) === Numa Support prüfen und bei Bedarf ausschalten === siehe Oracle Support Document 736173.1 (NUMA FAQ) In 11g per Default off, siehe hidden Parameter "_enable_NUMA_support" sollte auf "FALSE" stehen Abfragen mit "init.sql num" in SQL*Plus, siehe dazu Script unter [[[http://orapowershell.codeplex.com/SourceControl/latest#sql/init.sql|init.sql]]. **numa** kann auch komplett auf OS Level ausgeschaltet werden, in der Boot Konfiguration "/boot/grub/grub.conf: numa=off" setzen und Boot Konfiguration neu schreiben lassen. Ein Kunde hat im Zusammenhang mit dem Oracle Resource Manager und einem 6.5 Linux berichtet das nur so der Resource Manager betrieben werden kann. ==== Transparent Huge Pages ausschalten ==== Seit der Version Linux 6 gibt es das ransparent Huge Pages Feature, zur Zeit wird aber abgeraten es einzusetzen. === Testen ob im Einsatz === Test hier auf einem Oracle Linux Server release 6.5 - hier ist das per Default ausgeschaltet cat /boot/config-`uname -r`| grep TRANSPARENT_HUGEPAGE CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y # CONFIG_TRANSPARENT_HUGEPAGE is not set grep AnonHugePages /proc/meminfo #alternativ falls aktiviert cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag #bzw falls ein Redhat cat /sys/kernel/mm/redhat_transparent_hugepage/enabled always [never] # Das heißt es ist ausgeschaltet! === Dauerhaft ausschalten === A) /etc/rc.local anpassen und rebooten: ... if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi ... ===== Quellen ===== SAP * SAP Note 1672954 - Oracle 11g: Usage of hugepages on Linux * SAP Note 1871318 - Linux: Disable Transparent HugePages for Oracle Database Oracle Support * Oracle Support Document 361468.1 (HugePages on Oracle Linux 64-bit) * Oracle Support Document 361323.1 (HugePages on Linux: What It Is... and What It Is Not...) * Oracle Support Document 1392497.1 (USE_LARGE_PAGES To Enable HugePages) * Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1) * ASMM versus AMM and LINUX x86-64 Hugepages Support (Doc ID 1134002.1) * Oracle Support Document 1392497.1 (USE_LARGE_PAGES To Enable HugePages) * http://docs.oracle.com/cd/E37670_01/E37355/html/ol_config_hugepages.html Rechner: * http://www.peuss.de/node/67 Transparend Huge Pages: * http://notes-on-technology.blogspot.de/2012/10/redhattransparenthugepage-can-hurt-java.html * http://lwn.net/Articles/423592/ * https://blogs.oracle.com/linux/entry/performance_issues_with_transparent_huge * Oracle Support Document 1557478.1 (ALERT: Disable Transparent HugePages on SLES11, RHEL6, OEL6 and UEK2 Kernels) * Transparent Huge Pages Erklärung: * http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/vm/transhuge.txt?id=HEAD Blogs: * http://blog.yannickjaquier.com/linux/tmpfs-vs-ramfs-vs-transparent-huge-pages.html