Ausgangslage
Ein Kunde hat mich kürzlich angefragt, wie am effizientesten alle Kernel Tuning Parameter für Oracle bei Red Hat 7 konfiguriert werden können. Daraus habe ich untersucht welche Möglichkeiten es gibt, ausser dem seit langer Zeit bekannten /etc/sysctl.conf. Bei dieser Analyse führt der Weg natürlich über tuned. Dieser Dienst erlaubt es Profile zu definieren welche ein ganzes Set von Kernel Tuningparametern enthält. Das habe ich bereits in einem BLOG “Stay tuned with kernel parameters” publiziert. Tuned ist seit Red Hat Linux 7 standardmässig enabled!
Welche Möglichkeiten gibt es?
Bei Red Hat Linux 7 sind standardmässig die THP (Transparent Hugepages) eingeschalten. Wird eine Oracle Datenbank auf diesem Server installiert, ist es dringend zu empfehlen die THP auszuschalten. Oracle gibt einen erheblichen Performance verlust an werden die THP nicht ausgeschalten.
Um die THP auszuschalten gibt es nun unterschiedliche Wege (der Weg führt über Kernel Boot-Parameter):
- Variante 1: Kernel Boot-Parameter /boot/grub2/grub.cfg
- Variante 2: Kernel Boot-Parameter /etc/default/grub.conf
- Variante 3: Kernel Boot-Parameter /usr/lib/tuned/oracle/tuned.conf
Jeder der aufgeführten Varianten hat wie immer Vor und Nachteile.
Variante 1: (/boot/grub2/grub.cfg)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | menuentry 'Red Hat Enterprise Linux Server (3.10.0-327.28.3.el7.x86_64) 7.2 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestri cted $menuentry_id_option 'gnulinux-3.10.0-327.28.3.el7.x86_64-advanced-5b1a0ee8-c384-47be-99be-6d09a44d9583' { load_video set gfxpayload=keep insmod gzio insmod part_msdos insmod xfs set root= 'hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid -- set =root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint= 'hd0,msdos1' 69 06b305-a050-4815-8e4b-79202d7ba9fa else search --no-floppy --fs-uuid -- set =root 6906b305-a050-4815-8e4b-79202d7ba9fa fi linux16 /vmlinuz-3 .10.0-327.28.3.el7.x86_64 root= /dev/mapper/rhel-root ro crashkernel=auto rd.lvm.lv=rhel /root rd.lvm.lv=rhel /swap rhgb quie t transparent_hugepage=never initrd16 /initramfs-3 .10.0-327.28.3.el7.x86_64.img } |
Hier wurde die Zeile in der der Kernel Aufruf ist, mit “transparent_hugepage=never” erweitert.
Nachteil, wird eine neue Kernel Version installiert muss dieser Eintrag dort manuell nachgeführt werden. Hier handelt es sich bestenfalls um eine schnelle Möglichkeit für einen Test und nicht um eine permanente Lösung.
Variante 2: (/etc/default/grub.cfg)
[root@redhat72 ~]# cat /etc/default/grub
1 2 3 4 5 6 7 | GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR= "$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU= true GRUB_TERMINAL_OUTPUT= "console" GRUB_CMDLINE_LINUX= "crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet transparent_hugepage=never hugepages=100" GRUB_DISABLE_RECOVERY= "true" GRUB_CMDLINE_LINUX_DEFAULT= "${GRUB_CMDLINE_LINUX_DEFAULT:+$GRUB_CMDLINE_LINUX_DEFAULT }" |
Hier wurde die Zeile “GRUB_CMDLINE_LINUX=”, mit “transparent_hugepage=never hugepages=100” erweitert. Vorteil, es wird bei jedem neuen Kernel der installiert wird automatisch ergänzt im /boot/grub2/grub.cfg. Im Vergleich zur Variante 1, schon eher am richtigen Ort, aber es geht noch etwas besser….
Variante 3: (/usr/lib/tuned/oracle/tuned.conf)
Jetzt kommen in Abhängigkeit des gewählten tuned Profile, die Kernel Boot-Parameter in die /boot/grub2/grub.cfg. Ein solches tuned Profile z.B. für Oracle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | [root@redhat72 ~] # cat /usr/lib/tuned/oracle/tuned.conf # # tuned configuration # maintained by dbi services, GGR 24.08.2016 [main] include=throughput-performance [bootloader] cmdline = "transparent_hugepage=never" [sysctl] vm.swappiness = 1 vm.dirty_background_ratio = 3 vm.dirty_ratio = 80 vm.dirty_expire_centisecs = 500 vm.dirty_writeback_centisecs = 100 vm.nr_hugepages = 100 kernel.shmmax = 4398046511104 # # Half the size of physical memory in bytes # See My Oracle Support Note 567506.1 for additional information about # configuring shmmax # kernel.shmall = 1073741824 # # 40 percent of the size of physical memory in pages # Note: If the server supports multiple databases, or uses a large SGA, # then set this parameter to a value that is equal to the total amount # of shared memory, in 4K pages, that the system can use at one time # kernel.shmmni = 4096 kernel.msgmni = 2878 kernel.msgmnb = 65536 kernel.msgmax = 65536 # kernel.sem = 250 32000 100 128 # on oracle engineered systems kernel.sem = 4096 256000 100 4096 fs. file -max = 6815744 fs.aio-max-nr = 3145728 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 kernel.panic_on_oops = 1 |
Der spezielle Abschnitt in dem Konfigurationsfile ist die “bootloader” Sektion, mit darauf folgendem Befehl: tuned-adm profile oracle wird das Profile aktiviert.
Das hat den grossen Vorteil, wird ein anderes tuned Profile selektiert können andere Parameter gesetzt werden. Diese Methode erlaubt die Konfiguration, ausschalten der THP und festlegen der grösse der HugePages in einem Profile und das nur an einer Stelle, im oracle/tune.cfg.
Nachteil, es muss nach der Anpassung mit grub2-mkconfig -o /boot/grub2/grub.cfg, noch die /boot/grub2/grub.cfg neu Erstellt werden.
[root@redhat72 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
1 2 3 4 5 6 7 8 9 10 11 | Generating grub configuration file ... Found linux image: /boot/vmlinuz-3 .10.0-327.28.3.el7.x86_64 Found initrd image: /boot/initramfs-3 .10.0-327.28.3.el7.x86_64.img Found linux image: /boot/vmlinuz-3 .10.0-327.28.2.el7.x86_64 Found initrd image: /boot/initramfs-3 .10.0-327.28.2.el7.x86_64.img Found linux image: /boot/vmlinuz-3 .10.0-327.el7.x86_64 Found initrd image: /boot/initramfs-3 .10.0-327.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-29b38e2132e04639809cde7749271d64 Found initrd image: /boot/initramfs-0-rescue-29b38e2132e04639809cde7749271d64 .img done [root@redhat72 ~] # |
Mit dem letzten Schritt, werden einige Dinge automatisch angepasst:
- Parameter auf der command_line_linux_default im /etc/default/grub
- Parameter auf der Kernelzeile im /boot/grub2/grub.cfg
- angepasstes File unter /etc/tuned/bootcmdline
/boot/grubs/grub.cfg
1 2 | linux16 /vmlinuz-3 .10.0-327.28.3.el7.x86_64 root= /dev/mapper/rhel-root ro crashkernel=auto rd.lvm.lv=rhel /root rd.lvm.lv=rhel /swap rhgb quie t $tuned_params |
/etc/default/grub
1 | GRUB_CMDLINE_LINUX_DEFAULT= "${GRUB_CMDLINE_LINUX_DEFAULT:+$GRUB_CMDLINE_LINUX_DEFAULT }$tuned_params" |
/etc/tuned/bootcmdline
1 | TUNED_BOOT_CMDLINE= "transparent_hugepage=never" |
Damit die ganzen Anpassungen Wirkung zeigen, muss ein Reboot des Servers durchgeführt werden.
Prüfen der Anpassungen:
Nun wollen wir die ganzen Anpassungen auch überprüfen, speziell die AnonHugePages sind die transparenten Hugepages, auf das achten wir jetzt:
Wie sehen uns die HugePage Konfiguration vor der Konfiguration an:
1 2 3 4 5 6 7 | [root@redhat72 ~] # cat /proc/meminfo | grep Huge AnonHugePages: 6144 kB HugePages_Total: 100 HugePages_Free: 100 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB |
Wir sehen uns die Konfiguration nach der Konfiguration an:
1 2 3 4 5 6 7 | [root@redhat72 ~] # cat /proc/meminfo | grep Huge AnonHugePages: 0 kB HugePages_Total: 100 HugePages_Free: 100 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB |
Fazit:
Wird mit tuned gearbeitet und werden auf diese Art die Kernel-Parameter für z.B. für Oracle gesetzt, so können auf die gleiche Art auch gerade noch die THP ausgeschaltet und die Anzahl der HugePages welche bereitsgestellt werden sollen konfiguriert werden.