Premier Training & Business Partner Red Hat

Tuning di un file server RHEL / CentOS

Alessandro Lorenzi
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

Tux_Muscle

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
Info about author

Alessandro Lorenzi

RHCE Consultant at Extraordy