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