La velocità con cui il mio server può accettare () nuove connessioni TCP in entrata è davvero pessima in Xen. Lo stesso test su hardware bare metal mostra velocità 3-5x.
- Come mai questo è così male sotto Xen?
- Puoi modificare Xen per migliorare le prestazioni per le nuove connessioni TCP?
- Esistono altre piattaforme di virtualizzazione più adatte a questo tipo di casi d'uso?
sfondo
Ultimamente ho cercato alcuni colli di bottiglia delle prestazioni di un server Java sviluppato internamente in esecuzione su Xen. Il server parla HTTP e risponde alle semplici chiamate TCP connect / request / response / disconnect.
Ma anche durante l'invio di carichi di traffico al server, non può accettare più di ~ 7000 connessioni TCP al secondo (su un'istanza EC2 a 8 core, c1.xlarge che esegue Xen). Durante il test, il server presenta anche uno strano comportamento in cui un core (non necessariamente CPU 0) viene caricato molto> 80%, mentre gli altri core rimangono quasi inattivi. Questo mi porta a pensare che il problema sia legato al kernel / alla virtualizzazione sottostante.
Quando collaudo lo stesso scenario su una piattaforma bare metal non virtualizzata, ottengo risultati del test che mostrano velocità TCP () accettate oltre i 35000 / secondo. Questo su una macchina Core i5 4 core che esegue Ubuntu con tutti i core quasi completamente saturi. Per me quel tipo di figura sembra giusto.
Di nuovo sull'istanza Xen, ho provato ad abilitare / modificare quasi tutte le impostazioni presenti in sysctl.conf. Compreso l'attivazione del comando Ricevi pacchetto di pacchetti e Ricevi flusso di direzione e appuntamenti di thread / processi alle CPU ma senza evidenti guadagni.
So che ci si aspetta prestazioni degradate quando si esegue la virtualizzazione. Ma fino a questo punto? Un server bare metal più lento e performante. 8 core di un fattore 5?
- Questo comportamento è davvero atteso da Xen?
- Puoi modificare Xen per migliorare le prestazioni per le nuove connessioni TCP?
- Esistono altre piattaforme di virtualizzazione più adatte a questo tipo di casi d'uso?
Riproduzione di questo comportamento
Analizzando ulteriormente questo aspetto e individuando il problema, ho scoperto che lo strumento di test delle prestazioni di netperf potrebbe simulare lo scenario simile che sto vivendo. Usando il test TCP_CRR di netperf ho raccolto vari report da diversi server (sia virtualizzati che non virt.). Se desideri contribuire con alcuni risultati o consultare i miei rapporti attuali, consulta https://gist.github.com/985475
Come faccio a sapere che questo problema non è dovuto a software scritto male?
- Il server è stato testato su hardware bare metal e quasi satura tutti i core disponibili.
- Quando si utilizzano connessioni TCP keep-alive, il problema scompare.
Perché questo è importante?
In ESN (il mio datore di lavoro) sono il capo del progetto di Beaconpush , un server Comet / Web Socket scritto in Java. Anche se è molto performante e può saturare quasi tutta la larghezza di banda assegnata in condizioni ottimali, è ancora limitato alla velocità con cui è possibile effettuare nuove connessioni TCP. Cioè, se hai un grande abbandono di utenti in cui gli utenti vanno e vengono molto spesso, molte connessioni TCP dovranno essere configurate / abbattute. Cerchiamo di mitigare questo mantenendo le connessioni in vita il più a lungo possibile. Ma alla fine, la prestazione accept () è ciò che impedisce ai nostri core di girare e non ci piace.
Aggiornamento 1
Qualcuno ha pubblicato questa domanda su Hacker News , ci sono anche alcune domande / risposte. Ma proverò ad aggiornare questa domanda con le informazioni che trovo mentre procedo.
Hardware / piattaforme Ho provato questo su:
- EC2 con tipi di istanza c1.xlarge (8 core, 7 GB RAM) e cc1.4xlarge (2x Intel Xeon X5570, 23 GB RAM). Le AMI utilizzate erano rispettivamente ami-08f40561 e ami-1cad5275. Qualcuno ha anche sottolineato che anche i "gruppi di sicurezza" (ovvero il firewall EC2) potrebbero influire. Ma per questo scenario di test, ho provato solo su localhost per eliminare fattori esterni come questo. Un'altra voce che ho sentito dire è che le istanze EC2 non possono spingere più di 100k PPS.
- Due server virtualizzati privati che eseguono Xen. Uno aveva carico zero prima del test ma non faceva differenza.
- Server Xen dedicato dedicato a Rackspace. Circa gli stessi risultati lì.
Sono in procinto di rieseguire questi test e compilare i rapporti su https://gist.github.com/985475 Se desideri aiutare, contribuisci con i tuoi numeri. È facile!
(Il piano d'azione è stato spostato in una risposta separata e consolidata)