Saya sedang menjalankan serangkaian tes beban untuk menentukan kinerja pengaturan berikut:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Singkatnya, test suite node.js mengirimkan sejumlah metrik setiap x detik ke instance StatsD yang terletak di server lain. StatsD kemudian memilah metrik setiap detik ke instance Graphite yang terletak di server yang sama. Saya kemudian melihat berapa banyak metrik yang sebenarnya dikirim oleh test suite dan berapa banyak yang diterima oleh Graphite untuk menentukan paket loss antara test suite dan Graphite.
Namun saya perhatikan bahwa saya kadang-kadang mendapat tingkat penurunan paket yang sangat besar (perhatikan bahwa itu dikirim dengan protokol UDP), berkisar antara 20-50%. Jadi saat itulah saya mulai mencari di mana paket-paket ini dijatuhkan, mengingat itu bisa menjadi masalah kinerja dengan StatsD. Jadi saya mulai mencatat metrik di setiap bagian sistem untuk melacak di mana penurunan ini terjadi. Dan di sinilah segalanya menjadi aneh.
Saya menggunakan tcpdump untuk membuat file tangkap yang saya periksa setelah tes selesai berjalan. Tetapi setiap kali saya menjalankan tes dengan tcpdump berjalan, paket loss hampir tidak ada! Sepertinya tcpdump entah bagaimana meningkatkan kinerja tes saya dan saya tidak tahu mengapa dan bagaimana melakukan ini. Saya menjalankan perintah berikut untuk mencatat pesan tcpdump di server dan klien:
tcpdump -i any -n port 8125 -w test.cap
Dalam satu kasus uji tertentu saya mengirim 40000 metrik / s. Tes saat menjalankan tcpdump memiliki paket loss sekitar 4% sedangkan yang tanpa paket loss sekitar 20%
Kedua sistem berjalan sebagai Xen VM dengan pengaturan berikut:
- Intel Xeon E5-2630 v2 @ 2.60GHz
- RAM 2GB
- Ubuntu 14,04 x86_64
Hal-hal yang sudah saya periksa untuk kemungkinan penyebab:
- Meningkatkan buffer UDP menerima / mengirim ukuran.
- Beban CPU mempengaruhi tes. (maks. pemuatan 40-50%, baik sisi klien dan server)
- Menjalankan tcpdump pada antarmuka khusus alih-alih 'apa pun'.
- Menjalankan tcpdump dengan '-p' untuk menonaktifkan mode promiscuous.
- Menjalankan tcpdump hanya di server. Hal ini mengakibatkan hilangnya paket sebesar 20% yang terjadi dan tampaknya tidak mempengaruhi tes.
- Menjalankan tcpdump hanya pada klien. Ini mengakibatkan peningkatan kinerja.
- Meningkatkan netdev_max_backlog dan netdev_budget menjadi 2 ^ 32-1. Ini tidak membuat perbedaan.
- Mencoba setiap kemungkinan pengaturan mode promiscuous pada setiap nic (server on dan client off, server off dan client on, keduanya on, keduanya off). Ini tidak membuat perbedaan.
ifconfig eth0 promisc
mengaktifkan dan ifconfig eth0 -promisc
menonaktifkan mode promiscuous pada eth0. Jika ada perbedaan, coba bandingkan 4 kemungkinan kombinasi promisc on / off pada kedua mesin. Itu mungkin membantu menunjukkan dengan tepat sumber masalahnya.
-p
opsi untuk melewati melakukan itu untuk melihat apakah itu membuat perbedaan.