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)

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

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:

[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

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

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

GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT:+$GRUB_CMDLINE_LINUX_DEFAULT }$tuned_params"

 

/etc/tuned/bootcmdline

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:

[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:

[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.