ความแตกต่างระหว่าง global maxconn และ server maxconn haproxy


91

ฉันมีคำถามเกี่ยวกับการกำหนดค่า haproxy ของฉัน:

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

อย่างที่คุณเห็นมันตรงไปตรงมา แต่ฉันสับสนเล็กน้อยเกี่ยวกับคุณสมบัติของ maxconn ทำงานอย่างไร

มี global one และ maxconn บนเซิร์ฟเวอร์ในบล็อกการฟัง ความคิดของฉันคือคนทั่วโลกจัดการจำนวนการเชื่อมต่อทั้งหมดที่ haproxy ในฐานะบริการจะจัดคิวหรือประมวลผลในครั้งเดียว หากตัวเลขสูงกว่านั้นมันจะฆ่าการเชื่อมต่อหรือพูลในซ็อกเก็ต linux บางตัว? ฉันไม่รู้ว่าจะเกิดอะไรขึ้นถ้าตัวเลขสูงกว่า 4000

จากนั้นคุณตั้งค่าคุณสมบัติเซิร์ฟเวอร์ maxconn ไว้ที่ 15 ก่อนอื่นฉันตั้งค่าที่ 15 เนื่องจาก php-fpm ของฉันกำลังส่งต่อไปยังเซิร์ฟเวอร์แยกต่างหากมีเพียงกระบวนการย่อยจำนวนมากเท่านั้นที่สามารถใช้ได้ดังนั้นฉันจึงแน่ใจว่าฉันเป็น รวบรวมคำขอที่นี่แทนที่จะเป็น php-fpm ซึ่งผมคิดว่าเร็วกว่า.

แต่กลับไปที่หัวข้อทฤษฎีของฉันเกี่ยวกับจำนวนนี้คือแต่ละเซิร์ฟเวอร์ในบล็อกนี้จะส่งการเชื่อมต่อครั้งละ 15 ครั้งเท่านั้น จากนั้นการเชื่อมต่อจะรอให้เซิร์ฟเวอร์เปิด หากฉันเปิดคุกกี้การเชื่อมต่อจะรอให้เซิร์ฟเวอร์เปิด CORRECT แต่ฉันไม่ทำ

คำถามคือ:

  1. จะเกิดอะไรขึ้นถ้าการเชื่อมต่อทั่วโลกสูงกว่า 4000? พวกเขาตาย? หรือพูลใน Linux อย่างใด?
  2. การเชื่อมต่อทั่วโลกเกี่ยวข้องกับการเชื่อมต่อเซิร์ฟเวอร์หรือไม่นอกเหนือจากข้อเท็จจริงที่ว่าคุณไม่สามารถมีจำนวนการเชื่อมต่อเซิร์ฟเวอร์ทั้งหมดที่มากกว่าโกลบอล
  3. เมื่อค้นหาการเชื่อมต่อทั่วโลกไม่ควรเป็นจำนวนการเชื่อมต่อที่เพิ่มในส่วนเซิร์ฟเวอร์บวกเปอร์เซ็นต์ที่แน่นอนสำหรับการรวมกลุ่มหรือไม่? และเห็นได้ชัดว่าคุณมีข้อ จำกัด อื่น ๆ ในการเชื่อมต่อ แต่จริงๆแล้วคุณต้องการส่งไปยังผู้รับมอบฉันทะเป็นจำนวนเท่าใด

ขอบคุณล่วงหน้า.

คำตอบ:


167

วิลลี่ได้รับคำตอบทางอีเมล ฉันคิดว่าฉันจะแบ่งปันมัน คำตอบของเขาเป็นตัวหนา

ฉันมีคำถามเกี่ยวกับการกำหนดค่า haproxy ของฉัน:

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

อย่างที่คุณเห็นมันตรงไปตรงมา แต่ฉันสับสนเล็กน้อยเกี่ยวกับคุณสมบัติของ maxconn ทำงานอย่างไร

มี global one และ maxconn บนเซิร์ฟเวอร์ในบล็อกการฟัง

และยังมีอีกรายการหนึ่งในบล็อกการฟังซึ่งมีค่าเริ่มต้นเป็นปี 2000

ความคิดของฉันคือคนทั่วโลกจัดการจำนวนการเชื่อมต่อทั้งหมดที่ haproxy ในฐานะบริการจะจัดคิวหรือประมวลผลในครั้งเดียว

แก้ไข. เป็นจำนวนการเชื่อมต่อพร้อมกันสูงสุดต่อกระบวนการ

หากตัวเลขสูงกว่านั้นมันจะฆ่าการเชื่อมต่อหรือพูลในซ็อกเก็ต linux บางตัว?

หลังจากนั้นก็หยุดรับการเชื่อมต่อใหม่และยังคงอยู่ในคิวซ็อกเก็ตในเคอร์เนล จำนวนซ็อกเก็ตที่จัดคิวได้ถูกกำหนดโดยค่าต่ำสุดของ (net.core.somaxconn, net.ipv4.tcp_max_syn_backlog และ maxconn ของบล็อกการฟัง)

ฉันไม่รู้ว่าจะเกิดอะไรขึ้นถ้าตัวเลขสูงกว่า 4000

การเชื่อมต่อส่วนเกินรอให้การเชื่อมต่ออื่นเสร็จสมบูรณ์ก่อนที่จะได้รับการยอมรับ อย่างไรก็ตามตราบใดที่คิวของเคอร์เนลยังไม่อิ่มตัวไคลเอ็นต์จะไม่สังเกตเห็นสิ่งนี้ด้วยซ้ำเนื่องจากการเชื่อมต่อได้รับการยอมรับในระดับ TCP แต่ไม่ได้รับการประมวลผล ดังนั้นลูกค้าจะสังเกตเห็นความล่าช้าในการดำเนินการตามคำขอเท่านั้น แต่ในทางปฏิบัติ maxconn ของ listen block มีความสำคัญมากกว่าเนื่องจากโดยค่าเริ่มต้นจะมีขนาดเล็กกว่า global maxconn ของฟัง จำกัด จำนวนการเชื่อมต่อต่อผู้ฟัง โดยทั่วไปควรกำหนดค่าตามจำนวนการเชื่อมต่อที่คุณต้องการสำหรับบริการและกำหนดค่า maxconn ทั่วโลกเป็นจำนวนการเชื่อมต่อสูงสุดที่คุณปล่อยให้กระบวนการ haproxy จัดการ เมื่อคุณมีบริการเดียวคุณสามารถตั้งค่าทั้งสองเป็นค่าเดียวกันได้ แต่เมื่อคุณมีบริการมากมาย

จากนั้นคุณตั้งค่าคุณสมบัติเซิร์ฟเวอร์ maxconn ไว้ที่ 15 ก่อนอื่นฉันตั้งค่าที่ 15 เนื่องจาก php-fpm ของฉันกำลังส่งต่อไปยังเซิร์ฟเวอร์แยกต่างหากมีเพียงกระบวนการย่อยจำนวนมากเท่านั้นที่สามารถใช้ได้ดังนั้นฉันจึงแน่ใจว่าฉันเป็น รวบรวมคำขอที่นี่แทนที่จะเป็น php-fpm ซึ่งผมคิดว่าเร็วกว่า.

ใช่ไม่เพียง แต่ควรเร็วขึ้นเท่านั้น แต่ยังช่วยให้ haproxy ค้นหาเซิร์ฟเวอร์อื่นที่พร้อมใช้งานได้ทุกเมื่อที่เป็นไปได้และยังช่วยให้สามารถฆ่าคำขอในคิวได้หากไคลเอนต์กด "หยุด" ก่อนที่การเชื่อมต่อจะถูกส่งต่อไปยังเซิร์ฟเวอร์

แต่กลับไปที่หัวข้อทฤษฎีของฉันเกี่ยวกับจำนวนนี้คือแต่ละเซิร์ฟเวอร์ในบล็อกนี้จะส่งการเชื่อมต่อครั้งละ 15 ครั้งเท่านั้น จากนั้นการเชื่อมต่อจะรอให้เซิร์ฟเวอร์เปิด หากฉันเปิดคุกกี้การเชื่อมต่อจะรอให้เซิร์ฟเวอร์เปิด CORRECT แต่ฉันไม่ทำ

นั่นคือหลักการ มีคิวต่อพร็อกซีและคิวต่อเซิร์ฟเวอร์ การเชื่อมต่อกับคุกกี้คงอยู่ไปที่คิวเซิร์ฟเวอร์และการเชื่อมต่ออื่น ๆ ไปที่คิวพร็อกซี อย่างไรก็ตามเนื่องจากในกรณีของคุณไม่มีการกำหนดค่าคุกกี้การเชื่อมต่อทั้งหมดจึงไปที่คิวพร็อกซี คุณสามารถดูไดอะแกรม doc / queuing.fig ในแหล่งที่มาของ haproxy ได้หากต้องการซึ่งจะอธิบายวิธีการ / สถานที่ตัดสินใจ

คำถามคือ:

  1. จะเกิดอะไรขึ้นถ้าการเชื่อมต่อทั่วโลกสูงกว่า 4000? พวกเขาตาย? หรือพูลใน Linux อย่างใด?

    พวกเขาอยู่ในคิวใน linux เมื่อคุณครอบงำคิวของเคอร์เนลแล้วก็จะถูกทิ้งในเคอร์เนล

  2. การเชื่อมต่อทั่วโลกเกี่ยวข้องกับการเชื่อมต่อเซิร์ฟเวอร์หรือไม่นอกเหนือจากข้อเท็จจริงที่ว่าคุณไม่สามารถมีจำนวนการเชื่อมต่อเซิร์ฟเวอร์ทั้งหมดที่มากกว่าโกลบอล

    ไม่การตั้งค่าการเชื่อมต่อทั่วโลกและเซิร์ฟเวอร์เป็นอิสระจากกัน

  3. เมื่อค้นหาการเชื่อมต่อทั่วโลกไม่ควรเป็นจำนวนการเชื่อมต่อที่เพิ่มในส่วนเซิร์ฟเวอร์บวกเปอร์เซ็นต์ที่แน่นอนสำหรับการรวมกลุ่มหรือไม่? และเห็นได้ชัดว่าคุณมีข้อ จำกัด อื่น ๆ ในการเชื่อมต่อ แต่จริงๆแล้วคุณต้องการส่งไปยังผู้รับมอบฉันทะเป็นจำนวนเท่าใด

    คุณเข้าใจถูกแล้ว หากเวลาตอบสนองของเซิร์ฟเวอร์ของคุณสั้นไม่มีอะไรผิดปกติกับการจัดคิวการเชื่อมต่อหลายพันครั้งเพื่อให้บริการเพียงไม่กี่ครั้งต่อครั้งเนื่องจากจะช่วยลดเวลาในการประมวลผลคำขอได้อย่างมาก ในทางปฏิบัติการสร้างการเชื่อมต่อในปัจจุบันใช้เวลาประมาณ 5 ไมโครวินาทีบนระบบ LAN กิกะบิต ดังนั้นจึงสมเหตุสมผลมากที่จะให้ haproxy กระจายการเชื่อมต่อให้เร็วที่สุดจากคิวไปยังเซิร์ฟเวอร์ที่มี maxconn ขนาดเล็กมาก ฉันจำได้ว่าไซต์เกมแห่งหนึ่งเข้าคิวมากกว่า 30000 การเชื่อมต่อพร้อมกันและทำงานด้วยคิว 30 ต่อเซิร์ฟเวอร์! มันเป็นเซิร์ฟเวอร์ apache และ apache นั้นเร็วกว่ามากด้วยการเชื่อมต่อจำนวนน้อยกว่าการเชื่อมต่อจำนวนมาก แต่สำหรับสิ่งนี้คุณต้องมีเซิร์ฟเวอร์ที่รวดเร็วเพราะคุณไม่ได้ ไม่ต้องการให้ไคลเอนต์ทั้งหมดของคุณเข้าคิวรอช่องเชื่อมต่อเนื่องจากเซิร์ฟเวอร์กำลังรอฐานข้อมูลเช่น นอกจากนี้สิ่งที่ทำงานได้ดีคือการอุทิศเซิร์ฟเวอร์ หากไซต์ของคุณมีสถิติจำนวนมากคุณสามารถส่งคำขอแบบคงที่ไปยังกลุ่มเซิร์ฟเวอร์ (หรือแคช) เพื่อที่คุณจะไม่จัดคิวคำขอแบบคงที่และคำขอแบบคงที่จะไม่กินช่องการเชื่อมต่อที่มีราคาแพง หวังว่านี่จะช่วยได้ Willy


10
ขอบคุณสำหรับการโพสต์สิ่งนี้
Tarantula

9
ฉันมีแฮพร็อกซี่หนึ่งตัวซึ่งพร็อกซีสำหรับแบ็กเอนด์อื่น ๆ ประมาณ 200 รายการ เมื่อแบ็กเอนด์ถูก DDOS-ed โดยมีคอนเนตันประมาณ ~ 300k / วินาทีแบ็กเอนด์อื่น ๆ ทั้งหมดจะตาย ด้วยค่า maxconn 2048 บนเซิร์ฟเวอร์แบ็กเอนด์ (ภายใต้ ddos) haproxy ของเราทำงานได้ดี ขอบคุณมากคุณช่วยฉันคืนหนึ่ง :)
hungnv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.