Willy đã nhận được câu trả lời cho tôi qua email. Tôi đã nghĩ rằng tôi sẽ chia sẻ nó. Câu trả lời của anh ấy được in đậm.
Tôi có câu hỏi về cấu hình haproxy của mình:
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 syslog emerg
maxconn 4000
quiet
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option abortonclose
option dontlognull
option httpclose
option httplog
option forwardfor
option redispatch
timeout connect 10000 # default 10 second time out if a backend is not found
timeout client 300000 # 5 min timeout for client
timeout server 300000 # 5 min timeout for server
stats enable
listen http_proxy localhost:81
balance roundrobin
option httpchk GET /empty.html
server server1 myip:80 maxconn 15 check inter 10000
server server2 myip:80 maxconn 15 check inter 10000
Như bạn có thể thấy, nó là thẳng về phía trước, nhưng tôi hơi bối rối về cách hoạt động của các thuộc tính maxconn.
Có một toàn cầu và maxconn trên máy chủ, trong khối lắng nghe.
Và cũng có một cái khác trong khối lắng nghe được mặc định là 2000.
Suy nghĩ của tôi là: cái toàn cầu quản lý tổng số kết nối mà haproxy, với tư cách là một dịch vụ, sẽ xếp hàng hoặc xử lý cùng một lúc.
Chính xác. Đó là số lượng kết nối đồng thời tối đa cho mỗi quá trình.
Nếu con số vượt quá con số đó, nó có thể giết chết kết nối hoặc vùng chứa trong một số ổ cắm linux?
Càng về sau, nó chỉ đơn giản là ngừng chấp nhận các kết nối mới và chúng vẫn nằm trong hàng đợi socket trong nhân. Số lượng ổ cắm có thể xếp hàng được xác định theo giá trị tối thiểu của (net.core.somaxconn, net.ipv4.tcp_max_syn_backlog và maxconn của khối lắng nghe).
Tôi không biết điều gì sẽ xảy ra nếu con số cao hơn 4000.
Các kết nối thừa chờ một kết nối khác hoàn thành trước khi được chấp nhận. Tuy nhiên, miễn là hàng đợi của nhân chưa bão hòa, máy khách thậm chí không nhận thấy điều này, vì kết nối được chấp nhận ở mức TCP nhưng không được xử lý. Vì vậy, khách hàng chỉ nhận thấy một số chậm trễ để xử lý yêu cầu. Nhưng trên thực tế, maxconn của khối lắng nghe quan trọng hơn nhiều, vì theo mặc định, nó nhỏ hơn khối toàn cầu. Maxconn của lắng nghe giới hạn số lượng kết nối cho mỗi người nghe. Nói chung, bạn nên định cấu hình nó cho số lượng kết nối bạn muốn cho dịch vụ và định cấu hình maxconn chung cho số lượng kết nối tối đa mà bạn cho phép quy trình haproxy xử lý. Khi bạn chỉ có một dịch vụ, cả hai đều có thể được đặt thành cùng một giá trị. Nhưng khi bạn có nhiều dịch vụ,
Sau đó, bạn có thuộc tính maxconn của máy chủ được đặt ở mức 15. Đầu tiên, tôi đặt ở 15 vì php-fpm của tôi, điều này đang chuyển tiếp đến trên một máy chủ riêng biệt, chỉ có rất nhiều quy trình con mà nó có thể sử dụng, vì vậy tôi đảm bảo rằng mình gộp các yêu cầu ở đây, thay vì trong php-fpm. Mà tôi nghĩ là nhanh hơn.
Đúng vậy, nó không chỉ nhanh hơn mà còn cho phép haproxy tìm thấy một máy chủ khả dụng khác bất cứ khi nào có thể và nó cũng cho phép nó loại bỏ yêu cầu trong hàng đợi nếu máy khách nhấn "dừng" trước khi kết nối được chuyển tiếp đến máy chủ.
Nhưng trở lại chủ đề, lý thuyết của tôi về con số này là mỗi máy chủ trong khối này sẽ chỉ được gửi 15 kết nối cùng một lúc. Và sau đó các kết nối sẽ đợi một máy chủ mở. Nếu tôi bật cookie, các kết nối sẽ đợi máy chủ mở ĐÚNG. Nhưng tôi không.
Đó chính xác là nguyên tắc. Có một hàng đợi cho mỗi proxy và một hàng đợi cho mỗi máy chủ. Các kết nối với cookie duy trì sẽ chuyển đến hàng đợi máy chủ và các kết nối khác sẽ đi đến hàng đợi proxy. Tuy nhiên, vì trong trường hợp của bạn không có cookie nào được định cấu hình, nên tất cả các kết nối sẽ đi đến hàng đợi proxy. Bạn có thể xem sơ đồ doc / queuing.fig trong các nguồn haproxy nếu bạn muốn, nó giải thích cách / nơi đưa ra quyết định.
Vì vậy, các câu hỏi là:
Điều gì xảy ra nếu kết nối toàn cầu vượt quá 4000? Họ có chết không? Hoặc gộp trong Linux bằng cách nào đó?
Chúng được xếp hàng đợi trong linux. Một khi bạn lấn át hàng đợi của nhân, thì chúng sẽ bị loại bỏ trong nhân.
Kết nối toàn cầu có liên quan đến kết nối máy chủ không, ngoài thực tế là bạn không thể có tổng số kết nối máy chủ lớn hơn toàn cầu?
Không, cài đặt kết nối toàn cầu và máy chủ là độc lập.
Khi tìm ra các kết nối toàn cầu, đó không phải là số lượng kết nối được thêm vào trong phần máy chủ, cộng với một tỷ lệ phần trăm nhất định để tổng hợp? Và rõ ràng là bạn có những hạn chế khác đối với các kết nối, nhưng thực sự đó là số lượng bạn muốn gửi đến proxy?
Bạn đã hiểu đúng. Nếu thời gian phản hồi của máy chủ của bạn ngắn, không có gì sai khi xếp hàng nghìn kết nối để chỉ phục vụ một vài kết nối tại một thời điểm, vì nó làm giảm đáng kể thời gian xử lý yêu cầu. Trên thực tế, việc thiết lập kết nối ngày nay mất khoảng 5 micro giây trên mạng LAN gigabit. Vì vậy, rất có ý nghĩa nếu để haproxy phân phối các kết nối nhanh nhất có thể từ hàng đợi của nó đến một máy chủ có maxconn rất nhỏ. Tôi nhớ một trang web chơi game đang xếp hàng hơn 30000 kết nối đồng thời và đang chạy với hàng đợi 30 trên mỗi máy chủ! Đó là một máy chủ apache và apache nhanh hơn nhiều với số lượng kết nối nhỏ hơn là với số lượng lớn. Nhưng đối với điều này, bạn thực sự cần một máy chủ nhanh, bởi vì bạn không t muốn tất cả các máy khách của bạn phải xếp hàng đợi một khe kết nối vì ví dụ như máy chủ đang đợi cơ sở dữ liệu. Ngoài ra, một thứ hoạt động rất tốt là cung cấp các máy chủ. Nếu trang web của bạn có nhiều tĩnh, bạn có thể hướng các yêu cầu tĩnh đến một nhóm máy chủ (hoặc bộ nhớ đệm) để bạn không phải xếp hàng các yêu cầu tĩnh trên chúng và các yêu cầu tĩnh không ăn các khe kết nối đắt tiền. Hy vọng điều này sẽ giúp, Willy