Sự khác biệt giữa maxconn toàn cầu và haproxy maxconn máy chủ


91

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. 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, như một dịch vụ, sẽ xếp hàng hoặc xử lý tại một thời điểm. 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? Tôi không biết điều gì sẽ xảy ra nếu con số cao hơn 4000.

Sau đó, bạn có thuộc tính maxconn của máy chủ được đặt ở 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.

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.

Vì vậy, các câu hỏi là:

  1. Đ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 đó?
  2. 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?
  3. 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?

Cảm ơn bạn trước.

Câu trả lời:


166

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à:

  1. Đ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.

  2. 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.

  3. 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


10
Cảm ơn vì đã đăng bài này.
Tarantula

9
Tôi có một haproxy proxy cho khoảng 200 chương trình phụ trợ khác. Khi một phần phụ trợ bị DDOS-ed với khoảng ~ 300k kết nối / giây, tất cả phần phụ trợ khác sẽ chết. Với giá trị maxconn 2048 trên máy chủ phụ trợ (trong ddos), haproxy của chúng tôi chạy tốt. Cảm ơn bạn rất nhiều, bạn đã cứu tôi một đêm :)
hungnv
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.