Abbiamo parlato Venerdi’ di come configurare un server FTP, oggi passiamo invece a vedere come configurare al meglio un server dedicato in modo da ottenere le migliori prestazioni.
Journaling
Un file system con supporto al journaling dedica una parte dell’hard disk a scrivere un log dei lavori che sta facendo il disco in quel momento. Una volta che l’operazione viene terminata viene eliminata anche la voce dal log, rendendo valida l’operazione. In questo modo si garantisce la consistenza dei dati anche nel caso di caduta di tensione.
Al momento del mount del file system il sistema analizza il journal e, in caso di scritture non terminate, sara’ in grado di far tornare il file system in stato consistente ed utilizzabile.
ext3 ed ext4 hanno tre tipi di journal:
ordered: la modalita’ di default, nel journal vengono scritti solo i metada;
writeback: come per l’ordered ma i dati non vengono scritti in maniera ordinata sul disco, questo migliora le prestazioni;
journal: tutti i dati vengono salvati all’interno del journal, poi vengono trascritti nel disco. Questo sistema assicura la massima sicurezza, degrada le prestazioni su grosse quantita’ di dati, mentre nel caso di tante piccole scritture permette di gestire meglio il disk elevator raggruppando le scritture.
Possiamo scegliere quale di questi journal utilizzare durante la fase di mount passando l’opzione data=mode.
I barriers sono un sistema che sfrutta una cache del disco per ordinare le scritture sul disco. L’uso di barriers e journaling permette di ottenere la miglior affidabilita’ del sistema nel caso di crash. Ext4 abilita di default i barriers, ext3 li mantiene disabilitati. Per migliorare le prestazioni, possiamo decidere di disabilitare i barriers a patto di essere assolutamente confidenti sul sistema di alimentazione del sistema (alimentazione ridondata, ups…). Per abilitare o disabilitare i barriers utilizziamo l’opzione di mount barriers=0|1
Per montare un disco con la modalita’ writeback e i barriers disabilitati usiamo questa configurazione su fstab:
/dev/sda1 /data ext4 defaults,data=writeback,barriers=0 1 2
Il journaling richiede una quantita’ di letture/scritture extra rispetto al normale uso del disco, questo porta ad un degrado delle prestazioni. Abbiamo pero’ la possibilita’ di creare il journal su un disco differente da quello usato per i dati.
Per usare sdb1 come disco dati e sdd1 come journal dobbiamo creare prima di tutto il journal su sdd1, quindi formattare il disco dati. Non e’ necessario specificare il blocksize (in questo caso 4k), l’importante e’ assicurarsi che i due block size siano di uguale dimensione.
# mkfs -t ext4 -O journal_dev -b 4096 /dev/sdd1 # mkfs -t ext4 -J device=/dev/sdd1 -b 4096 /dev/sdc1
Bandwidth Delay Product
Quando inviamo o riceviamo dati dalla rete non utilizziamo uno stream continuo di dati ma sfruttiamo dei socket che vengono di volta in volta riempiti e svuotati per passare dati tra i vari livelli dello stack network. Per dimensionare questi socket e’ necessario calcolare il Bandwidth Delay Product (BDP), il prodotto tra banda e latenza tra due host.
I due valori che ci interessano sono quindi la velocita’ della rete ( poniamo utilizzare una rete gigabit ) e la latenza, che possiamo calcolare con un ping.
# ping -c4 remotehost PING 193.70.152.25 (193.70.152.25) 56(84) bytes of data. 64 bytes from 193.70.152.25: icmp_seq=1 ttl=249 time=0.335 ms [...] --- remotehost ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 0.31/0.347/0.412/0.345 ms
Passiamo quindi a calcolare il BDP (espresso in KiB) avendo cura di convertire in maniera opportuna le unita’ di misura.
1Gbp / s * 0.347 ms = 1000000000 b/s * 0.000347 s = 347000 bit = 42.36 KiB
Possiamo utilizzare questo dato per configurare i buffer di invio e ricezione del sistema e del layer tcp. La configurazione di questi parametri avviene tramite il file /etc/sysctl.conf aggiungendo i seguenti parametri:
net.core.rmem_max = 43375 net.core.wmem_max = 43375 net.ipv4.tcp_wmem = 10240 87380 43375 net.ipv4.tcp_rmem = 10240 87380 43375
I tre campi di net.ipv4.tcp_rmem e net.ipv4.tcp_wmem sono rispettivamente: min pressure max. Lasciamo inalterati i primi due e utilizziamo il BDP calcolato come valore massimo.
Aggiorniamo quindi i parametri con il comando:
# sysctl -p /etc/sysctl.conf
Bonding
Se abbiamo due o piu’ schede ethernet disponibili, perche’ non usarle tutte? Con la modalita’ di bonding 802.3ad possiamo aggregare piu’ interfacce di rete ottenendo come velocita’ massima la somma delle velocita’ delle singole NIC. Lo switch deve pero’ supportare questa modalita’.
Prima di tutto attiviamo l’interfaccia di bonding creando il file di configurazione /etc/modprobe.d/bonding.conf
alias bond0 bonding
Configuriamo la scheda sul file /etc/sysconfig/network-scripts/ifcfg-bond0 come una qualsiasi interfaccia di rete.
DEVICE=bond0 ONBOOT=yes BOOTPROTO=dhcp BONDING_OPTS="mode=802.3ad xmit_hash_policy=layer2+3"
Infine adattiamo i file di configurazione delle interfacce di rete /etc/sysconfig/network-scripts/ifcfg-ethX
DEVICE=ethX ONBOOT=yes BOOTPROTO=none MASTER=bond0
Al riavvio della macchina sara’ possibile verificare il funzionamento del bonding con il comando:
# ip a l bond0
Jumbo Frames
Sempre in ottica networking e’ possibile abilitare i jumbo frames.
La dimensione di default dei pacchetti che inviamo sulla rete (MTU) e’ di 1500 bytes, di cui 52 bytes di header TCP/IP, che rappresentano il 3.5% del pacchetto.
E’ possibile aumentare la dimensione dei pacchetti (chiamati Jumbo Frames), fino ad un massimo di 9000 bytes, a patto che tutti gli elementi della rete lo supportino. Nel caso di un MTU di 9000, l’header si riduce ad essere il 0.58% del totale, che rappresenta un’ottimo miglioramento.
Per impostare la dimensione dell’MTU dobbiamo aggiungere questo parametro nel file di configurazione della scheda di rete /etc/sysconfig/network-scripts/ifcfg-name
MTU=9000