Tại sao có độ trễ trên loopback ít hơn trên giao diện cá chép?


8

Stack Overflow Careerers được phục vụ giống như vậy:

user -> internet -> our fw -> nginx -> haproxy -> web farm
  • FreeBSD là hệ điều hành đang sử dụng
  • không có tường lửa hoặc QoS được đặt trên hộp này
  • nginx xử lý việc chấm dứt SSL của chúng tôi
  • haproxy xử lý cân bằng tải
  • nginx / haproxy đang đẩy khoảng 15 Mbps mỗi chiều

Trong quá trình hoạt động bình thường, nginx nhận được yêu cầu HTTP, thực hiện công việc của nó và chuyển yêu cầu đến một phiên bản haproxy được liên kết với địa chỉ loopback (127.0.0.1) trên cùng một hộp.

Để xử lý sự cố vào một ngày khác, tôi đã di chuyển cá thể haproxy lên cùng giao diện mà nginx đang chạy. Điều này ngay lập tức thêm 100ms độ trễ cho tất cả các yêu cầu. Giao diện này không phải là một giao diện vật lý thực sự, mà là một giao diện cá chép .

Bất cứ ai có thể giải thích cho tôi tại sao đây là trường hợp? Có thể liên quan đến hàng đợi gói? Hoặc có lẽ loopback luôn nhanh hơn vì nó 'mềm'? Có một cái gì đó cơ bản mà tôi đang thiếu ở đây, và tôi hy vọng ai đó sẽ vui lòng giáo dục tôi.


1
Một gói được gửi đến một địa chỉ trên hộp, cho dù được xử lý qua cổng lo hay cổng e {th, n}, không bao giờ chạm vào phần cứng trong Linux, bất kể. Mặc dù vậy, tôi không thể nói một cách có thẩm quyền đối với BSD.
BMDan

Bạn có chắc chắn rằng bạn đã chuyển nó sang cùng một giao diện? 100ms có biến mất khi bạn chuyển haproxy trở lại loopback không?
tomjedrz

@tomjedrz - vâng. Ngay khi tôi quay trở lại, độ trễ đã biến mất.
Michael Gorsuch

Câu trả lời:


2

Độ trễ 100ms không đổi trông lạ. Có vẻ như các gói được đệm và không được gửi ngay lập tức. Hoặc có thể một số trong số họ được bỏ và truyền lại. Bạn có thể chạy tcpdump trên giao diện này để hiển thị vấn đề không? Tôi không biết ngăn xếp IP hoạt động như thế nào trên FreeBSD, cũng như cách CARP được triển khai, nhưng liệu có thể là nô lệ thường xuyên quảng cáo địa chỉ MAC của mình với các ARP vô cớ và chủ nhân thay thế gửi các gói cho mỗi bên?

Bạn cũng có thể chạy tcpdump trên giao diện thực để đảm bảo rằng không có gì được phát ra?

Có thể hệ thống kiềm chế lưu vào bộ nhớ ARP của thiết bị CARP, do đó khiến cho yêu cầu ARP được phát ra cho mỗi gói của phiên, mà trình nền CARP sẽ phải trả lời?

Hầu hết đó là một số ý tưởng ngu ngốc, nhưng đó là để giúp bạn tìm kiếm đúng hướng.


Cảm ơn những ý tưởng, Willy. Tôi chuyển cấu hình trở lại giao diện ngoài giờ và xem dấu vết gói tin xuất hiện.
Michael Gorsuch

1

Để rõ ràng, bạn chỉ thay đổi cách truy cập, từ địa chỉ 127, sang IP cục bộ; chính xác?

Nếu đó là trường hợp và nó đã tạo ra một sự khác biệt, một cái gì đó không đúng. Kiểm tra bảng định tuyến của bạn với netstat -rnvà xem các IP cục bộ được định tuyến đến, nó sẽ được định tuyến đến giao diện lo0 (giống như 127).

netstat -rnĐầu ra của bạn nên mơ hồ tương tự như thế này:

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

Tôi nên đưa điều này vào bài viết: những giao diện này là giao diện cá chép. Hoàn toàn trượt tâm trí của tôi cho đến khi tôi chạy netstat. Điều đó làm cho một sự khác biệt?
Michael Gorsuch

Vâng, đó là nó ở ngay đó. Nếu địa chỉ bạn đang sử dụng được gán cho giao diện cá chép bằng IP đó sẽ buộc nó đi qua ngăn xếp cá chép trước khi nó chạm vào thiết bị loopback; 100ms vẫn là quá mức mặc dù. Là máy chủ trong câu hỏi là chủ của IP đó, hoặc bạn đang sử dụng cân bằng tải? Nó có thể được gửi lưu lượng đến các máy chủ cá chép khác.
Chris S

Máy chủ là chủ của IP đó.
Michael Gorsuch

Tôi vừa hoàn thành một môi trường tương tự và thử nghiệm nó. Tôi thấy không có sự khác biệt đáng kể về thời gian phản hồi giữa IP giao diện cá chép, 127 IP và IP vật lý. Tôi chỉ có một máy chủ ở đây để kiểm tra, vì vậy không có nô lệ cá chép, nhưng tôi nghi ngờ có gì đó không ổn ở môi trường của bạn (tường lửa hoặc hình dạng giao thông?) Điều đó gây ra độ trễ. Đây là một i386-8.1-ỔN ĐỊNH.
Chris S

Cảm ơn, Chris. Tôi sẽ xem liệu tôi có thể thu thập thêm thông tin khi lưu lượng truy cập không. Hệ thống hiện tại không sử dụng bất kỳ gói tường lửa hoặc thực hiện bất kỳ hình dạng lưu lượng truy cập. Tôi cũng cần lưu ý (sẽ cập nhật câu hỏi ban đầu) rằng chúng tôi đang nhận được một lượng lớn lưu lượng truy cập do quảng cáo công việc mà chúng tôi đang hiển thị trên các trang web gia đình SO. Chúng tôi đang di chuyển khoảng 15 Mbps mỗi chiều trong giờ bình thường.
Michael Gorsuch

0

Tôi đã thấy loopback được triển khai như một phần mềm cấp độ ngắt i / f sao cho lưu lượng không bao giờ vượt ra ngoài hộp. Đây có thể là trường hợp khi bạn đang chạy loopback? Tuyên bố từ chối trách nhiệm: Chỉ là một câu hỏi chung; Tôi không biết gì về FreeBSD.

- pete


Đây không phải là cách nó hoạt động trong FreeBSD.
Chris S
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.