====== Ottimizzazioni del kernel per macchine virtuali ======
Questo e` un elenco di ottimizzazioni per il kernel Linux quando installato come guest in una VM.
==== Scheduler di I/O ====
L'elevator (lo scheduler di I/O sul disco) ideale per una virtuale, dove il disco e` in realta` virtualizzato e quindi dotato di uno scheduler e una cache "esterni", ovvero presenti nell' host fisico, e` quello che non fa nulla e lascia fare all'host fisico. Per ottenere questo risultato e` possibile impostare come parametro di avvio del kernel in grub questo:
elevator=noop
E` possibile per prova impostare lo scheduler a noop (o a quello che volete voi) leggendo e scrivendo su ''/sys/block/sdX/queue/scheduler''. Ad esempio qui si vede che lo scheduler attivo e` cfq, e poi si imposta lo scheduler noop.
# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
# echo noop > /sys/block/sda/queue/scheduler
==== Swappiness ====
La "swappiness" e` un indice di quanto il kernel "preferisce" usare lo swap oppure tenere quanti piu` dati in ram, passando a usare lo swap solo quando e` assolutamente necessario. Quando si gira sotto un virtualizzatore in linea di massima e` meglio evitare di swappare se non e` necessario. Per modificare l'impostazione, e` possibile impostarre un parametro dentro a /etc/sysctl.conf oppure dentro a un file dedicato con un nome a vostra scelta dentro a /etc/sysctl.d/nomechevolete.conf. Ad esempio possiamo vedere quale e` la swappiness attuale e modificarla, semplicemente cosi`:
# cat /proc/sys/vm/swappiness
60
# echo "vm.swappiness = 1" > /etc/sysctl.d/swappiness.conf
# sysctl --system
==== Memory overcommit ====
Il kernel Linux consente ai programmi di allocare piu` memoria (RAM + swap) di quanta non ce ne sia davvero disponibile. Questo comportamento puo` provocare piantamenti o comunque causare il killing di programmi piu` o meno a caso quando la memoria e` finita. (OOM killer)
Queste impostazioni impediscono l'overcommit. Possono essere una buona idea oppure no, dipende dall'uso che si fa della macchina e soprattutto dal fatto che si usino o meno programmi che richiedono enormi quantita` di memoria senza poi usarla realmente.
# echo "vm.overcommit_memory = 2" > /etc/sysctl.d/overcommit.conf
# echo "vm.overcommit_ratio = 80" >> /etc/sysctl.d/overcommit.conf
# sysctl --system
====== Ottimizzazioni del kernel generiche ======
Queste sono ottimizzazioni varie, utilizzabili sia in macchine virtuali che in macchine fisiche. Si tratta sempre di parametri impostabili in ''/etc/systl.conf'' o dentro a un file in ''/etc/sysctl.d/''. Ricordate poi di eseguire ''sysctl --system'' per caricarle. Al reboot si caricano da sole.
==== Disabilitare autoconfigurazione ipv6 ====
Queste impostazioni, salvate dentro a un file come ad esempio ''/etc/sysctl.d/disableipv6autoconf.conf'', servono ad impedire l'autoconfigurazione ipv6. Questo di per se` non disabilita ipv6, ma solo l'autoconfigurazione.
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
==== Configurazione dello stack ip per supportare grandi volumi di traffico ====
Se dovete mettere assieme un server che deve servire migliaia di connessioni ip contemporanee, queste impostazioni possono aiutare. Io personalmente non le ho mai provate.
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 2500
net.core.somaxconn = 65000
==== Ottimizzazioni varie ====
Queste impostazioni possono avere senso a seconda delle vostre necessita`. Sono commentate ad una ad una.
# per impedire l'overcommit della ram (come anche mostrato sopra per le virtuali, ma vale anche per le fisiche)
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
# increase the number of allowed mmapped files
vm.max_map_count = 1048576
# Increase the number of file handles available globally
fs.file-max = 1048576
# Auto reboot per kernel panic (occhio!!!)
kernel.panic = 10
# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536
# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296