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