Stack Overflow Karir disajikan seperti:
user -> internet -> our fw -> nginx -> haproxy -> web farm
- FreeBSD adalah sistem operasi yang digunakan
- tidak ada firewall atau QoS di kotak ini
- nginx menangani pemutusan SSL kami
- haproxy menangani penyeimbangan muatan
- nginx / haproxy mendorong sekitar 15 Mbps setiap jalan
Selama operasi normal, nginx menerima permintaan HTTP, melakukan tugasnya, dan menyerahkan permintaan ke instance haproxy yang terikat ke alamat loopback (127.0.0.1) pada kotak yang sama.
Untuk melakukan pemecahan masalah beberapa hari yang lalu, saya memindahkan instance haproxy ke antarmuka yang sama dengan yang dijalankan nginx. Ini segera menambahkan 100 ms latensi ke semua permintaan. Antarmuka ini bukan antarmuka fisik yang sebenarnya, tetapi antarmuka ikan mas .
Adakah yang bisa menjelaskan kepada saya mengapa ini terjadi? Mungkin dengan antrian paket? Atau mungkin loopback selalu lebih cepat karena 'lunak'? Ada sesuatu yang mendasar yang saya rindukan di sini, dan saya berharap seseorang akan dengan baik mendidik saya.
sumber
Jawaban:
Penundaan konstan 100 ms terlihat aneh. Sepertinya paket mendapatkan buffer dan tidak segera dikirim. Atau mungkin beberapa dari mereka dijatuhkan dan dikirim kembali. Bisakah Anda menjalankan tcpdump pada antarmuka ini untuk menunjukkan masalahnya? Saya tidak tahu bagaimana stack IP bekerja pada FreeBSD, atau bagaimana CARP diimplementasikan, tetapi apakah mungkin misalnya slave secara teratur mengiklankan alamat MAC-nya dengan ARP yang gratis dan bahwa master secara alternatif mengirim paket ke setiap sisi?
Bisakah Anda juga menjalankan tcpdump pada antarmuka nyata untuk memastikan tidak ada yang dikeluarkan?
Apakah mungkin bahwa sistem menahan diri dari caching entri ARP perangkat CARP, sehingga menyebabkan permintaan ARP untuk dipancarkan untuk setiap paket sesi, yang harus dijawab oleh daemon CARP?
Sebagian besar dari itu adalah beberapa ide bodoh, tetapi itu untuk membantu Anda mencari ke arah yang benar.
sumber
Hanya untuk kejelasan, Anda hanya mengubah cara diakses, dari alamat 127, ke IP lokal; benar?
Jika itu masalahnya dan itu membuat perbedaan, sesuatu yang tidak benar. Periksa tabel perutean Anda dengan
netstat -rn
dan lihat ke mana IP lokal dirutekan, itu harus dirutekan ke antarmuka lo0 (sama seperti 127).netstat -rn
Output Anda harus agak mirip dengan ini:sumber
Saya telah melihat loopback diimplementasikan sebagai perangkat lunak tingkat interupsi i / f sehingga lalu lintas tidak pernah keluar dari kotak. Mungkinkah ini kasusnya ketika Anda menjalankan loopback? Penafian: Hanya pertanyaan umum; Saya tidak tahu apa-apa tentang FreeBSD.
- pete
sumber