Aşağıdaki kurulumun performansını belirlemek için bir dizi yük testi çalıştırıyorum:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Kısacası, node.js test paketi, başka bir sunucuda bulunan bir StatsD örneğine her x saniyede bir belirli miktarda metrik gönderir. Daha sonra StatsD, metrikleri her saniye aynı sunucuda bulunan bir Grafit örneğine temizler. Daha sonra test takımı tarafından kaç metrikin gönderildiğine ve test takımı ve Grafit arasındaki paket kaybını belirlemek için Grafit tarafından kaç metrenin alındığına bakarım.
Bununla birlikte, bazen% 20-50 arasında değişen çok büyük paket düşüş oranları aldığımı fark ettim (UDP protokolü ile gönderildiğini unutmayın). İşte o zaman bu paketlerin nereye bırakıldığını araştırmaya başladım ve StatsD ile ilgili bir performans sorunu olabileceğini gördüm. Bu yüzden, bu düşüşün nerede gerçekleştiğini izlemek için sistemin her bölümündeki metrikleri günlüğe kaydetmeye başladım. Ve işlerin garipleştiği yer burası.
Test çalıştıktan sonra incelemek bir yakalama dosyası oluşturmak için tcpdump kullanıyorum . Ancak tcpdump çalışırken testleri her çalıştırdığımda, paket kaybı neredeyse yok! Görünüşe göre tcpdump testlerimin performansını bir şekilde artırıyor ve bunu neden ve nasıl yaptığını anlayamıyorum. Hem sunucuda hem de istemcide tcpdump iletilerini günlüğe kaydetmek için aşağıdaki komutu çalıştırıyorum:
tcpdump -i any -n port 8125 -w test.cap
Belirli bir test durumunda 40000 metrik / saniye gönderiyorum. Tcpdump çalıştırılırken yapılan testin paket kaybı yaklaşık% 4 iken, olmayan paketin kaybı yaklaşık% 20'dir.
Her iki sistem de aşağıdaki kurulumla Xen VM'leri olarak çalışıyor:
- Intel Xeon E5-2630 v2 @ 2.60GHz
- 2GB RAM
- Ubuntu 14.04 x86_64
Olası nedenler için zaten kontrol ettiğim şeyler:
- UDP arabellek alma / gönderme boyutunu artırma.
- Testi etkileyen CPU yükü. (maksimum yük% 40-50, hem istemci hem de sunucu tarafı)
- 'Any' yerine belirli arayüzlerde tcpdump çalıştırılıyor.
- Karışık modu devre dışı bırakmak için '-p' ile tcpdump çalıştırılıyor.
- TCpdump yalnızca sunucuda çalıştırılıyor. Bu% 20'lik paket kaybıyla sonuçlandı ve testleri etkilemediği görülüyor.
- Tcpdump yalnızca istemcide çalıştırılıyor. Bu, performansın artmasına neden oldu.
- Netdev_max_backlog ve netdev_budget değerinin 2 ^ 32-1 değerine yükseltilmesi. Bu bir fark yaratmadı.
- Her nic üzerinde olası her mod ayarını denedim (sunucu açık ve istemci kapalı, sunucu kapalı ve istemci açık, her ikisi de açık, her ikisi de kapalı). Bu bir fark yaratmadı.
ifconfig eth0 promisc
etkinleştirir ve ifconfig eth0 -promisc
devre dışı bırakır. Fark yaratırsa, her iki makinede olası 4 açma / kapama kombinasyonunu karşılaştırmayı deneyin. Bu, sorunların kaynağını tespit etmeye yardımcı olabilir.
-p
Bir fark yaratıp yaratmadığını görmek için bunu atlamak için seçeneği geçmek isteyebilirsiniz .