Mengapa latensi pada loopback lebih sedikit dibandingkan pada antarmuka ikan mas?

8

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.

Michael Gorsuch
sumber
1
Sebuah paket yang dikirim ke alamat on-box, baik yang dituju melalui port lo atau port e {th, n}, tidak pernah mengenai perangkat keras di Linux. Namun, saya tidak bisa berbicara secara otoritatif dengan BSD.
BMDan
Apakah Anda yakin telah mengubahnya ke antarmuka yang sama? Apakah 100ms hilang ketika Anda mengganti haproxy kembali ke loopback?
tomjedrz
@tomjedrz - ya. segera setelah saya kembali, latensi hilang.
Michael Gorsuch

Jawaban:

2

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.

Willy Tarreau
sumber
Terima kasih atas idenya, Willy. Saya memindahkan konfigurasi kembali ke antarmuka off-jam dan melihat apa yang muncul jejak paket.
Michael Gorsuch
1

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 -rndan lihat ke mana IP lokal dirutekan, itu harus dirutekan ke antarmuka lo0 (sama seperti 127).

netstat -rnOutput Anda harus agak mirip dengan ini:

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            1.2.3.1            UGS       131  2655014   nge1
1.2.3.0/23         link#2             U           0       88   nge1
1.2.3.4            link#2             UHS         0    34848    lo0
127.0.0.1          link#5             UH          0    64678    lo0
192.168.0.0/26     link#1             U           2 41703537   nge0
192.168.0.1        link#1             UHS         0    70088    lo0
Chris S
sumber
Saya harus memasukkan ini dalam posting: antarmuka ini adalah antarmuka ikan mas. Benar-benar menyelinap pikiran saya sampai saya menjalankan netstat. Apakah itu membuat perbedaan?
Michael Gorsuch
Ya, itu di sana. Jika alamat yang Anda gunakan ditugaskan ke antarmuka ikan mas dengan menggunakan IP itu akan memaksanya melalui tumpukan ikan mas sebelum menyentuh perangkat loopback; 100ms akan menjadi terlalu berlebihan. Apakah host yang dimaksud adalah master dari IP itu, atau apakah Anda menggunakan load balancing? Bisa jadi mengirim lalu lintas ke host ikan mas lainnya.
Chris S
Tuan rumah adalah master dari IP itu.
Michael Gorsuch
Saya baru saja selesai membuat lingkungan yang serupa dan mengujinya. Saya tidak melihat perbedaan yang cukup besar dalam waktu respons antara antarmuka IP, 127 IP, dan IP fisik. Saya hanya punya satu server untuk diuji, jadi tidak ada budak ikan mas, tapi saya curiga ada sesuatu yang salah di lingkungan Anda (firewall atau traffic traffic?) Yang menyebabkan latensi. Ini adalah i386-8.1-STABLE.
Chris S
Terima kasih, Chris. Saya akan melihat apakah saya dapat mengumpulkan lebih banyak info saat lalu lintas macet. Sistem saat ini tidak menggunakan paket firewall apa pun atau melakukan pembentukan lalu lintas apa pun. Saya juga harus mencatat (akan memperbarui pertanyaan awal) bahwa kami menerima sejumlah besar lalu lintas karena iklan pekerjaan yang kami tampilkan di situs keluarga SO. Kami bergerak sekitar 15 Mbps sekali jalan selama jam normal.
Michael Gorsuch
0

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

Pete Wilson
sumber
Ini bukan cara kerjanya di FreeBSD.
Chris S