Sto eseguendo una serie di test di carico per determinare le prestazioni della seguente configurazione:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
In breve, la suite di test node.js invia una determinata quantità di metriche ogni x secondi a un'istanza di StatsD che si trova su un altro server. Successivamente, StatsD scarica le metriche ogni secondo su un'istanza di Graphite situata sullo stesso server. Guardo quindi quante metriche sono state effettivamente inviate dalla suite di test e quante sono state ricevute da Graphite per determinare la perdita di pacchetti tra la suite di test e la grafite.
Tuttavia ho notato che a volte ho ottenuto percentuali di drop dei pacchetti molto grandi (si noti che viene inviato con il protocollo UDP), che vanno dal 20-50%. Quindi è stato quando ho iniziato a esaminare dove venivano rilasciati questi pacchetti, visto che potrebbe essere un problema di prestazioni con StatsD. Quindi ho iniziato a registrare le metriche in ogni parte del sistema per rintracciare dove si è verificato questo calo. Ed è qui che le cose si fanno strane.
Sto usando tcpdump per creare un file di acquisizione che ispeziono dopo l'esecuzione del test. Ma ogni volta che eseguo i test con tcpdump in esecuzione, la perdita di pacchetti è quasi inesistente! Sembra che tcpdump stia in qualche modo aumentando le prestazioni dei miei test e non riesco a capire perché e come. Sto eseguendo il comando seguente per registrare i messaggi tcpdump sia sul server che sul client:
tcpdump -i any -n port 8125 -w test.cap
In un caso di test particolare sto inviando 40000 metriche / s. Il test durante l'esecuzione di tcpdump ha una perdita di pacchetti di circa il 4% mentre quella senza una perdita di pacchetti di circa il 20%
Entrambi i sistemi funzionano come Xen VM con la seguente configurazione:
- Intel Xeon E5-2630 v2 a 2,60 GHz
- 2 GB di RAM
- Ubuntu 14.04 x86_64
Cose che ho già verificato per potenziali cause:
- Aumento della dimensione di ricezione / invio del buffer UDP.
- Carico della CPU che influisce sul test. (carico massimo del 40-50%, lato client e server)
- Esecuzione di tcpdump su interfacce specifiche anziché "qualsiasi".
- Esecuzione di tcpdump con '-p' per disabilitare la modalità promiscua.
- Esecuzione di tcpdump solo sul server. Ciò ha comportato una perdita di pacchetti del 20% e sembra non influire sui test.
- Esecuzione di tcpdump solo sul client. Ciò ha comportato un aumento delle prestazioni.
- Aumentando netdev_max_backlog e netdev_budget a 2 ^ 32-1. Questo non ha fatto differenza.
- Ho provato ogni possibile impostazione della modalità promiscua su ogni nic (server acceso e client spento, server spento e client acceso, sia acceso, sia spento). Questo non ha fatto differenza.
ifconfig eth0 promisc
abilita e ifconfig eth0 -promisc
disabilita la modalità promiscua su eth0. Se fa differenza, prova a confrontare le 4 possibili combinazioni di promisc on / off su entrambe le macchine. Ciò potrebbe aiutare a individuare l'origine dei problemi.
-p
opzione per saltare facendo ciò per vedere se fa la differenza.