noqqe » blog | sammelsurium | photos | projects | about

MongoDB Kernel Tuning

2014-03-11 @ Databases, MongoDB

overcommit

2 bedeutet nur so viel overcommit wieder Swapspace hergibt. 80 ist die Ratio der Swap benutzt werden darf.

echo 2 > /proc/sys/vm/overcommit_memory
echo 80 > /proc/sys/vm/overcommit_ratio
vm.overcommit_memory=2
sysctl -p

Eventuell will man auch echo 1 machen wegen dem Journaling

"Thu Mar 20 14:16:55.481 [initandlisten] ** WARNING: /proc/sys/vm/overcommit_memory is 2",
"Thu Mar 20 14:16:55.481 [initandlisten] **          Journaling works best with it set to 0 or 1",

no atime

atime auf partition ausschalten

readahead bei partition

Einmalig:

blockdev --setra 4096 /dev/sdb

Readahead warnings ausschalten, persistent

## anzeigen der readahead einstellungen
blockdev --report |grep sdb

## informationen anzeigen
udevadm info -a -p /sys/block/sdb/

## udev loggt in syslog, also dahin schauen
tail -f /var/log/messages

vi /etc/udev/rules.d/99-readahead.rules
> SUBSYSTEM=="block", ATTRS{model}=="Virtual disk*", ACTION=="add|change", KERNEL=="sdb", ATTR{bdi/read_ahead_kb}="512"

## testen
udevadm test --action=add /sys/block/sdb 2>&1 | grep 512

## wenn erfolgreichen durchführen
udevadm trigger

## verifizieren
blockdev --report |grep sdb

weiterführende links

unix.stackexchange.com/questions/71364/persistent-blockdev-setra-read-ahead-setting

stackoverflow.com/questions/16715961/mongodb-readahead-warning

www.cyberciti.biz/tips/rhel-linux-optimize-3ware-raid-read-performance.html

ulimit

Fehlerbild

ERROR: mmap private failed with out of memory. (64 bit build)
Assertion: 13636:file /docdata/mongodb/data/xxx_letters.5 open/create failed in createPrivateMap (look in log for more information)

Folgende Werte sollten eingestellt sein.

-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited [1]
-n (open files): 64000
-m (memory size): unlimited [1]
-u (processes/threads): 32000

zum verifizieren kann folgende Bash funktion benutzt werden

return-limits(){

     for process in $@; do
          process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`

          if [ -z $@ ]; then
             echo "[no $process running]"
          else
             for pid in $process_pids; do
                   echo "[$process #$pid -- limits]"
                   cat /proc/$pid/limits
             done
          fi

     done

}
/etc/security/limits.conf
* soft nofile 64000
* hard nofile 64000
* soft rss unlimited
* hard rss unlimited
* soft as unlimited
* hard as unlimited
* soft nproc 32000
* hard nproc 32000