Global maxconn ve server maxconn haproxy arasındaki fark


91

Haproxy yapılandırmam hakkında bir sorum var:

#---------------------------------------------------------------------
# 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

Gördüğünüz gibi basit, ancak maxconn özelliklerinin nasıl çalıştığı konusunda biraz kafam karıştı.

Dinleme bloğunda, sunucuda global olan ve maxconn vardır. Benim düşüncem şudur: küresel olan, bir hizmet olarak haproxy'nin bir seferde sıraya koyacağı veya işleyeceği toplam bağlantı sayısını yönetir. Sayı bunun üzerine çıkarsa, ya bağlantıyı keser, ya da bazı linux soketlerinde birikir? Sayı 4000'i geçerse ne olacağı hakkında hiçbir fikrim yok.

Ardından, sunucu maxconn özelliği 15 olarak ayarlandı. İlk olarak, bunu 15 olarak ayarladım çünkü php-fpm'm ayrı bir sunucuya iletiyor, yalnızca kullanabileceği çok sayıda çocuk süreç var, bu yüzden ben eminim istekleri php-fpm yerine burada havuzlamak. Bence daha hızlı.

Ancak konuya geri dönersek, bu sayı hakkındaki teorim, bu bloktaki her sunucuya bir seferde yalnızca 15 bağlantı gönderilecek. Ve sonra bağlantılar açık bir sunucuyu bekleyecek. Çerezlerim olsaydı, bağlantılar DOĞRU açık sunucuyu beklerdi. Ama yapmıyorum.

Yani sorular:

  1. Küresel bağlantılar 4000'in üzerine çıkarsa ne olur? Ölürler mi? Veya bir şekilde Linux'ta havuz mu?
  2. Global bağlantı, globalden daha fazla toplam sunucu bağlantı sayısına sahip olamamanız dışında, sunucu bağlantılarıyla mı ilgili?
  3. Global bağlantıları bulurken, sunucu bölümünde eklenen bağlantıların miktarı artı havuzlama için belirli bir yüzde olması gerekmez mi? Ve tabii ki bağlantılarla ilgili başka kısıtlamalarınız var, ama gerçekten de vekillere kaç tane göndermek istiyorsunuz?

Şimdiden teşekkür ederim.

Yanıtlar:


168

Willy bana e-posta ile bir cevap verdi. Paylaşacağımı düşündüm. Cevapları cesurca.

Haproxy yapılandırmam hakkında bir sorum var:

   #---------------------------------------------------------------------
   # 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

Gördüğünüz gibi basit, ancak maxconn özelliklerinin nasıl çalıştığı konusunda biraz kafam karıştı.

Dinleme bloğunda sunucuda global olan ve maxconn vardır.

Ayrıca, dinleme bloğunda 2000 gibi varsayılan değerlere sahip bir tane daha var.

Benim düşüncem şudur: küresel olan, bir hizmet olarak haproxy'nin bir seferde sıraya koyacağı veya işleyeceği toplam bağlantı sayısını yönetir.

Doğru. İşlem başına maksimum eşzamanlı bağlantı sayısıdır.

Numara bunun üzerine çıkarsa, ya bağlantıyı keser ya da bazı linux soketlerinde birikir?

Daha sonra, yeni bağlantıları kabul etmeyi bırakır ve çekirdekteki soket kuyruğunda kalırlar. Sıralanabilir soket sayısı min (net.core.somaxconn, net.ipv4.tcp_max_syn_backlog ve dinleme bloğunun maxconn) tarafından belirlenir.

Sayı 4000'i geçerse ne olacağı hakkında hiçbir fikrim yok.

Fazla bağlantılar kabul edilmeden önce başka birinin tamamlanmasını bekler. Ancak, çekirdeğin kuyruğu doygun olmadığı sürece, bağlantı TCP düzeyinde kabul edildiğinden ancak işlenmediğinden, istemci bunu fark etmez bile. Bu nedenle, müşteri yalnızca isteği işleme koymak için biraz gecikme olduğunu fark eder. Ancak pratikte, dinleme bloğunun maxconn'u çok daha önemlidir, çünkü varsayılan olarak global olandan daha küçüktür. Dinleyicinin maksimum bağlantısı, dinleyici başına bağlantı sayısını sınırlar. Genel olarak, hizmet için istediğiniz bağlantı sayısına göre yapılandırmak ve global maxconn'u haproxy işleminin işlemesine izin verdiğiniz maksimum bağlantı sayısına göre yapılandırmak akıllıca olacaktır. Yalnızca bir hizmetiniz olduğunda, her ikisi de aynı değere ayarlanabilir. Ancak birçok hizmetiniz olduğunda,

Ardından, sunucu maxconn özelliği 15 olarak ayarlandı. İlk olarak, bunu 15 olarak ayarladım çünkü php-fpm, bu ayrı bir sunucuya iletiyor, yalnızca kullanabileceği çok sayıda çocuk süreç var, bu yüzden ben istekleri php-fpm yerine burada havuzlamak. Bence daha hızlı.

Evet, sadece daha hızlı olması değil, aynı zamanda haproxy'nin mümkün olduğunda başka bir kullanılabilir sunucu bulmasına izin verir ve ayrıca istemci bağlantı sunucuya iletilmeden önce "durdur" tuşuna basarsa kuyruktaki isteği sonlandırmasına izin verir.

Ancak konuya geri dönersek, bu sayı hakkındaki teorim, bu bloktaki her sunucuya bir seferde yalnızca 15 bağlantı gönderilecek. Ve sonra bağlantılar açık bir sunucuyu bekleyecek. Çerezlerim olsaydı, bağlantılar DOĞRU açık sunucuyu beklerdi. Ama yapmıyorum.

Prensip tam olarak bu. Proxy başına bir sıra ve sunucu başına bir sıra vardır. Kalıcılık tanımlama bilgisine sahip bağlantılar sunucu kuyruğuna, diğer bağlantılar proxy kuyruğuna gider. Ancak sizin durumunuzda hiçbir tanımlama bilgisi yapılandırılmadığından, tüm bağlantılar proxy kuyruğuna gider. Dilerseniz haproxy kaynaklarında bulunan doc / queuing.fig diyagramına bakabilirsiniz, kararların nasıl / nerede alındığını açıklar.

Yani sorular:

  1. Küresel bağlantılar 4000'in üzerine çıkarsa ne olur? Ölürler mi? Veya bir şekilde Linux'ta havuz mu?

    Linux'ta sıraya girmişler. Çekirdeğin kuyruğunu bir kez alt ettiğinizde, çekirdek içinde bırakılır.

  2. Global bağlantı, globalden daha fazla toplam sunucu bağlantı sayısına sahip olamamanız dışında, sunucu bağlantılarıyla mı ilgili?

    Hayır, genel ve sunucu bağlantı ayarları bağımsızdır.

  3. Global bağlantıları bulurken, sunucu bölümünde eklenen bağlantıların miktarı artı havuzlama için belirli bir yüzde olması gerekmez mi? Ve tabii ki bağlantılarla ilgili başka kısıtlamalarınız var, ama gerçekten de vekillere kaç tane göndermek istiyorsunuz?

    Doğru anladın. Sunucunuzun yanıt süresi kısaysa, binlerce bağlantıyı bir seferde yalnızca birkaçına hizmet verecek şekilde sıraya koymanın yanlış bir yanı yoktur, çünkü istek işleme süresini önemli ölçüde azaltır. Pratik olarak, günümüzde bir gigabit LAN üzerinde bağlantı kurmak yaklaşık 5 mikrosaniye sürüyor. Bu yüzden haproxy'nin bağlantıları kuyruğundan çok küçük bir maxconn ile bir sunucuya olabildiğince hızlı dağıtmasına izin vermek çok mantıklı. 30000'den fazla eşzamanlı bağlantıyı sıraya koyan ve sunucu başına 30'luk bir sıra ile çalışan bir oyun sitesini hatırlıyorum! Bir apache sunucusuydu ve apache, az sayıda bağlantıyla büyük sayılardan çok daha hızlıdır. Ancak bunun için gerçekten hızlı bir sunucuya ihtiyacınız var çünkü Örneğin, sunucu bir veritabanı beklediği için tüm istemcilerinizin bir bağlantı yuvası için kuyruğa girmesini istemiyorum. Ayrıca çok iyi çalışan bir şey de sunucuları tahsis etmektir. Sitenizde çok sayıda statik varsa, statik istekleri bir sunucu havuzuna (veya önbelleklere) yönlendirebilirsiniz, böylece bunlar üzerinde statik istekleri sıraya koymazsınız ve statik istekler pahalı bağlantı yuvalarını tüketmez. Bunun yardımcı olacağını umuyorum, Willy


10
Bunu gönderdiğiniz için teşekkürler.
Tarantula

9
Yaklaşık 200 diğer arka uç için vekil olan bir haproksim var. Bir arka uç yaklaşık ~ 300.000 bağlantı / saniye ile DDOS'lu hale getirildiğinde, diğer tüm arka uç ölür. Arka uç sunucusunda (ddos altında) maxconn 2048 değeri ile haproxy'miz sorunsuz çalışır. Çok teşekkür ederim, beni bir gece kurtardın :)
hungnv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.