In questa domanda vorrei scoprire la migliore configurazione / hardware possibile per fornire 40 Gbps da un singolo server.
Situazione
Abbiamo un server proxy di condivisione video che scarica i picchi dai server di archiviazione lenti dietro di esso. Tutto il traffico è solo HTTP. Il server funge da proxy inverso (file che non sono memorizzati nella cache sul server) e da server Web (file archiviati su unità locali).
Attualmente ci sono qualcosa come 100 TB di file e in crescita sui server di archiviazione back-end.
Il meccanismo di memorizzazione nella cache è implementato in modo indipendente e questa domanda non riguarda la memorizzazione nella cache in quanto funziona molto bene: attualmente offre 14 Gbps, passa ai server back-end solo 2 Gbps. Quindi l'uso della cache è buono.
Obbiettivo
Ottieni una velocità di 40 Gbps o persino superiore da una singola macchina.
Hardware 1
HW: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), RAM DDR4 da 16 GB, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD: 1x 512 GB Samsung, 2x 500 GB Samsung, 2x480 GB Intel 535, 1x 240 GB Intel S3500
Sistema:
- irqbalancer si è fermato
- set_irq_affinity per ogni interfaccia (tramite script nel tarball del driver ixgbe)
- ixgbe-4.3.15
- Scadenza scheduler I / O
- iptables vuoto (moduli scaricati)
- File system: XFS
nginx:
- sendfile off
- fili aio
- directio 1M
- tcp_nopush on
- tcp_nodelay on
Come visto nei grafici, siamo riusciti a spingere 12,5 Gbps. Sfortunatamente il server non ha risposto.
Ci sono 2 cose che hanno attirato la mia attenzione. Il primo è un'elevata quantità di IRQ. In questo caso purtroppo non ho grafici da / proc / interrupt. La seconda cosa era il carico di sistema elevato, che penso sia stato causato da kswapd0 che aveva problemi a lavorare solo con 16G di RAM.
Hardware 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), 128GB DDR4 RAM, 2x Supermicro 10G STGN-i1S
SSD, la configurazione del sistema è la stessa dell'hardware 1. Nginx è sendfile attivo (aio / sendfile ulteriormente confrontato).
Questo sembra migliore, quindi ora che abbiamo un server, che funziona in picchi, possiamo provare alcune ottimizzazioni.
Discussioni Sendfile vs aio
Ho provato a disabilitare sendfile e usare invece i thread aio.
- sendfile off
- fili aio
- directio 1M (che corrisponde a tutti i file che abbiamo)
vs
- file di trasmissione attivo
Poi alle 15:00 sono tornato a sendfile e ricaricato nginx (quindi ci è voluto un po 'di tempo per terminare le connessioni esistenti). È bello che l'utilizzo dell'azionamento (misurato da iostat) sia diminuito. Non è cambiato nulla sul traffico (purtroppo zabbix ha deciso di non raccogliere i dati da bond0).
sendfile on / off
Ho appena provato a attivare / disattivare l'invio. Nulla è cambiato tranne la riprogrammazione degli interrupt.
irqbalancer come server / cron / disabilitato
Come menzionato @lsd ho provato a configurare irqbalancer per essere eseguito tramite cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
Purtroppo nel mio caso non ha aiutato. Una delle schede di rete ha iniziato a comportarsi in modo strano:
Non sono riuscito a trovare ciò che non andava nei grafici e, come è successo il giorno successivo, ho effettuato l'accesso al server e ho visto che un core era al 100% (utilizzo del sistema).
Ho cercato di avviare irqbalance come servizio, il risultato è stato sempre lo stesso.
Quindi ho deciso di utilizzare lo script set_irq_affinity e il problema è stato risolto immediatamente e il server ha inviato nuovamente 17Gbps.
Hardware 3
Abbiamo effettuato l'aggiornamento al nuovo hardware: chassis 2U 24 (+2) (6xSFF), 2x Xeon E5-2620v4, RAM DDR4 da 64 GB (moduli 4x16GB), 13x SSD, 2x schede di rete Supermicro (con chip Intel). Le nuove CPU hanno migliorato molto le prestazioni.
La configurazione corrente rimane: file di invio, ecc. L'unica differenza è che consentiamo a una sola CPU di gestire entrambe le schede di rete (tramite lo script set_irq_affinity).
È stato raggiunto il limite di 20 Gbps.
Prossimo obiettivo? 30Gbps.
Sentiti libero di spararmi idee su come migliorare le prestazioni. Sarò felice di provarlo dal vivo e condividere alcuni grafici pesanti qui.
Qualche idea su come gestire una grande quantità di SoftIRQ sulla CPU?
Questa non è una domanda sulla pianificazione della capacità: ho già l'hardware e il traffico. Posso sempre dividere il traffico su più server (cosa che dovrò comunque fare in futuro) e risolvere il problema con denaro. Questa è tuttavia una domanda sull'ottimizzazione del sistema e il tuning delle prestazioni in uno scenario reale dal vivo.