Haproxy

HaProxy stick-table 和 nbproc 高於 1

  • April 27, 2021

我已經使用帶有 HaProxy 的stick-table 根據 IP 連接數配置了一條規則,如下所示:

global
   log /dev/log    local0
   log /dev/log    local1 notice
   chroot /var/lib/haproxy
   user haproxy
   group haproxy
   daemon

   # Default SSL material locations
   ca-base /etc/ssl/certs
   crt-base /etc/ssl/private

   maxconn 60000

backend connectionstablev4
  stick-table type ip size 1m expire 60s store conn_cur

frontend smtpv4
   bind :25

   tcp-request connection track-sc0 src table connectionstablev4
   acl connabuse sc_conn_cur(0,connectionstablev4) gt 5
   
  tcp-request connection reject if connabuse

   # Reject any client that speak before the aloha
   tcp-request inspect-delay 1s
   acl content_present req_len gt 0
   tcp-request content reject if content_present

   default_backend smtp_backend

backend smtp_backend
   mode tcp
   timeout server 1m
   timeout connect 5s

   # Health check
   option smtpchk HELO mx1.improvmx.com

   server srv1 127.0.0.1:2525 check send-proxy maxconn 500

而且效果很好。

但是一旦我添加更多程序,就像這樣(在全域部分):

global
   # ... same as above

   nbproc  6
   cpu-map  1 1
   cpu-map  2 2
   cpu-map  3 3
   cpu-map  4 4
   cpu-map  5 5
   cpu-map  6 6

每個 IP 的最大連接數停止工作。

我懷疑棒表是基於每個程序而不是全域的,但我找不到任何關於這件事的資訊。

問題顯然出在 nbproc/cpu-map 上,因為只要我刪除這部分,其他一切都正常。

是否有一些規則或配置要設置以指示 HaProxy 對所有程序使用相同的棒表?

提前致謝。

使用執行緒而不是程序。文件中直接提到了您的流程問題。

https://cbonte.github.io/haproxy-dconv/2.2/configuration.html#3.1-nbthread

此設置僅在內置支持執行緒時可用。它使 haproxy 線上程上執行。這是“nbproc”獨有的。雖然“nbproc”在歷史上曾經是使用多個處理器的唯一方式,但它也存在與程序之間缺乏同步相關的許多缺點(執行狀況檢查、對等點、stick-tables、stats ……)不影響執行緒。因此,強烈建議任何現代配置從“nbproc”遷移到“nbthread”。當 HAProxy 在前台啟動時,“nbthread”也可以工作。在某些支持 CPU 親和性的平台上,當不使用 nbproc 時,預設的“nbthread”值會自動設置為程序在啟動時綁定的 CPU 數。這意味著可以使用“taskset”或“cpuset”等命令輕鬆地從呼叫程序中調整執行緒數。否則,此值預設為 1。預設值在“haproxy -vv”的輸出中報告。另請參見“nbproc”。

引用自:https://serverfault.com/questions/1061702