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

LinuxDebian/OttimizzazioniKernel (last edited 2014-12-11 23:16:33 by Kurgan)