Score:3

ปรับแต่ง Linux & Nignx เพื่อจัดการการเชื่อมต่อ 10k @10Gbps Server

ธง br

ฉันเพิ่งได้เซิร์ฟเวอร์ 10Gbps ใหม่ที่มี 8 CPU Cores, 64GB RAM และ 1TB NVMe

เคอร์เนล OS Centos 7.9 3.10.0-1160.36.2.el7.x86_64 ยังลองใช้ kernel-ml 5.13
SELinux ถูกปิดใช้งาน
firewalld และ irqbalance หยุดทำงาน

ฉันได้ทำการทดสอบเครือข่ายโดยใช้ iperf3 แล้ว ได้รับการยืนยันความเร็วประมาณ 9.5 Gbps

จากนั้นทดสอบอีกครั้งโดยใช้เซิร์ฟเวอร์ 10 x 1Gbps เพื่อดาวน์โหลดไฟล์แบบคงที่จากเซิร์ฟเวอร์ เซิร์ฟเวอร์สามารถส่งเกือบเต็ม 10Gbps ไปยังเซิร์ฟเวอร์ 10 เครื่องได้อย่างง่ายดาย

ดังนั้นเราจึงนำเซิร์ฟเวอร์ไปสู่การผลิตเพื่อให้บริการลูกค้าที่ดาวน์โหลดไฟล์คงที่โดยใช้ Nginx สามารถให้ประสิทธิภาพที่เสถียรจนถึงการเชื่อมต่อ ~2,000 จากนั้นประสิทธิภาพจะเริ่มลดลงอย่างมาก ฉันเห็นว่าการรับส่งข้อมูลลดลงเมื่อการเชื่อมต่อเพิ่มขึ้น ดังนั้นการให้บริการมากกว่า 4,000 การเชื่อมต่อจึงให้ความเร็วเพียง 2Gbps!

ภาพที่ 1 แสดงการรับส่งข้อมูลและ HTTP

ความสับสนที่สุดคือ CPU เกือบจะไม่ได้ใช้งาน, RAM ว่าง, การใช้งาน IO ต่ำเนื่องจาก NVMe และ RAM ขนาดใหญ่ แต่เมื่อเซิร์ฟเวอร์มีการเชื่อมต่อนับพัน ความเร็วจะช้าลงในทุกบริการ HTTP, FTP, SSH แม้แต่การอัปเดต yum ใช้เวลานานมาก เวลาตอบสนอง ดูเหมือนว่าความแออัดในเครือข่ายหรือแพ็กเก็ตหรือการควบคุมปริมาณในเคอร์เนลหรือนิค

ท็อป สูงสุด โหลด

ฉันลองใช้เคล็ดลับการปรับแต่งส่วนใหญ่แล้ว

ifconfig eth0 txqueuelen 20,000
ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        อีเธอร์ 00:16:3e:c2:f5:21 txqueuelen 20000 (อีเธอร์เน็ต)
        แพ็กเก็ต RX 26012067560 ไบต์ 1665662731749 (1.5 TiB)
        ข้อผิดพลาด RX 0 หลุด 0 โอเวอร์รัน 0 เฟรม 0
        แพ็กเก็ต TX 30684216747 ไบต์ 79033055227212 (71.8 TiB)
        ข้อผิดพลาด TX 0 หลุด 0 โอเวอร์รัน 0 พาหะ 0 ชนกัน 0

tc -s -d qdisc แสดง dev eth0

qdisc mq 1: ราก
    ส่ง 7733649086021 ไบต์ 1012203012 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 169567)
    งานค้าง 4107556b 2803p รีคิว 169567
qdisc pfifo_fast 0: พาเรนต์ 1:8 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 2503685906926 ไบต์ 1714686297 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 1447)
    งานค้าง 4107556b 2803p รีคิว 1447
qdisc pfifo_fast 0: พาเรนต์ 1:7 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 532876060762 ไบต์ 366663805 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 7790)
    งานในมือ 0b 0p รีคิว 7790
qdisc pfifo_fast 0: พาเรนต์ 1:6 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 563510390106 ไบต์ 387948990 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 9694)
    งานค้าง 0b 0p รีคิว 9694
qdisc pfifo_fast 0: พาเรนต์ 1:5 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 563033712946 ไบต์ 387564038 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 10259)
    งานค้าง 0b 0p รีคิว 10259
qdisc pfifo_fast 0: พาเรนต์ 1:4 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 562982455659 ไบต์ 387451904 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 10706)
    งานค้าง 0b 0p รีคิว 10706
qdisc pfifo_fast 0: พาเรนต์ 1:3 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 559557988260 ไบต์ 385263948 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 9983)
    งานค้าง 0b 0p รีคิว 9983
qdisc pfifo_fast 0: พาเรนต์ 1:2 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 528903326344 ไบต์ 364105031 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 7718)
    งานในมือ 0b 0p ร้องขอ 7718
qdisc pfifo_fast 0: พาเรนต์ 1:1 แบนด์ 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1
    ส่ง 1919099245018 ไบต์ 1313486295 pkt (ลดลง 0, เกินขีดจำกัด 0 รีคิว 111970)
    งานค้าง 0b 0p รีคิว 111970

ethtool -k eth0

คุณสมบัติสำหรับ eth0:
rx-checksumming: บน [แก้ไข]
tx-checksumming: เปิด
        tx-checksum-ipv4: ปิด [แก้ไข]
        tx-checksum-ip-generic: เปิด
        tx-checksum-ipv6: ปิด [แก้ไข]
        tx-checksum-fcoe-crc: ปิด [แก้ไข]
        tx-checksum-sctp: ปิด [แก้ไข]
กระจายรวบรวม: เปิด
        tx-scatter-รวบรวม: เปิด
        tx-scatter-gather-fraglist: ปิด [แก้ไข]
tcp-segmentation-offload: ปิด
        การแบ่งส่วน tx-tcp: ปิด
        การแบ่งส่วน tx-tcp-ecn: ปิด
        การแบ่งส่วน tx-tcp6: ปิด
        การแบ่งส่วน tx-tcp-mangleid: ปิด
UDP-Fragmentation-offload: เปิด
แบ่งส่วนทั่วไป offload: ปิด
รับทั่วไป offload: ปิด
รับขนาดใหญ่ offload: ปิด [คงที่]
rx-vlan-offload: ปิด [แก้ไข]
tx-vlan-offload: ปิด [แก้ไข]
ntuple-filters: ปิด [แก้ไข]
รับแฮช: ปิด [แก้ไข]
highdma: บน [แก้ไข]
rx-vlan-filter: บน [แก้ไข]
vlan-challenge: ปิด [แก้ไข]
tx-lockless: ปิด [แก้ไข]
netns-local: ปิด [แก้ไข]
tx-gso-robust: ปิด [แก้ไข]
การแบ่งส่วน tx-fcoe: ปิด [แก้ไข]
tx-gre-segmentation: ปิด [แก้ไข]
การแบ่งส่วน tx-ipip: ปิด [แก้ไข]
tx-sit-segmentation: ปิด [แก้ไข]
tx-udp_tnl-segmentation: ปิด [แก้ไข]
fcoe-mtu: ปิด [แก้ไข]
tx-nocache-สำเนา: ปิด
ย้อนกลับ: ปิด [คงที่]
rx-fcs: ปิด [แก้ไข]
rx-all: ปิด [แก้ไข]
tx-vlan-stag-hw-insert: ปิด [แก้ไข]
rx-vlan-stag-hw-parse: ปิด [แก้ไข]
rx-vlan-stag-filter: ปิด [แก้ไข]
โพลล์ไม่ว่าง: ปิด [แก้ไข]
การแบ่งส่วน tx-gre-csum: ปิด [แก้ไข]
tx-udp_tnl-csum-segmentation: ปิด [แก้ไข]
tx-gso-partial: ปิด [แก้ไข]
tx-sctp-segmentation: ปิด [แก้ไข]
rx-gro-hw: ปิด [แก้ไข]
l2-fwd-offload: ปิด [แก้ไข]
hw-tc-offload: ปิด [แก้ไข]
rx-udp_tunnel-port-offload: ปิด [แก้ไข]

sysctl -p

vm.max_map_count = 1048575
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_syncookies = 0
net.ipv4.conf.all.log_martians = 1
vm.swappiness = 10
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog=65536
net.core.netdev_max_backlog = 250000
fs.file-max = 100,000
net.ipv4.ip_local_port_range = 13000 65000
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.core.rmem_max = 2147483647
net.core.rmem_default = 2147483647
net.core.wmem_max = 2147483647
net.core.wmem_default = 2147483647
net.core.optmem_max = 2147483647
net.ipv4.tcp_rmem = 4096 87380 2147483647
net.ipv4.tcp_wmem = 4096 65536 2147483647
net.ipv4.tcp_low_latency = 1
net.ipv4.tcp_adv_win_scale = 1
net.ipv4.tcp_keepalive_time = 60
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 5
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes = 5
net.netfilter.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 10800
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

ยูลิมิต -a

ขนาดไฟล์หลัก (บล็อก, -c) 0
ขนาด data seg (kbytes, -d) ไม่จำกัด
การจัดลำดับความสำคัญ (-e) 0
ขนาดไฟล์ (บล็อก, -f) ไม่จำกัด
สัญญาณที่รอดำเนินการ (-i) 256680
หน่วยความจำสูงสุดที่ล็อคไว้ (kbytes, -l) ไม่จำกัด
ขนาดหน่วยความจำสูงสุด (kbytes, -m) ไม่จำกัด
เปิดไฟล์ (-n) 100,000
ขนาดไปป์ (512 ไบต์, -p) 8
คิวข้อความ POSIX (ไบต์, -q) 819200
ลำดับความสำคัญตามเวลาจริง (-r) 0
ขนาดสแต็ก (kbytes, -s) 100,000
เวลาซีพียู (วินาที, -t) ไม่จำกัด
กระบวนการของผู้ใช้สูงสุด (-u) 100,000
หน่วยความจำเสมือน (kbytes, -v) ไม่จำกัด
ล็อคไฟล์ (-x) ไม่จำกัด

nginx.conf

worker_processes อัตโนมัติ
ผู้ปฏิบัติงาน_rlimit_nofile 100000;

thread_pool เธรดเริ่มต้น = 256 max_queue = 65536;

เหตุการณ์ {
    worker_connections 65536;
    worker_aio_requests 65536;
    เปิด multi_accept;
    ยอมรับ_mutex บน;
    ใช้ epol;
}

http {
    ปิด server_tokens;
    server_names_hash_max_size 4096;
    server_names_hash_bucket_size 128;

    tcp_nopush บน;
    tcp_nodelay บน;
    client_body_timeout 12;
    client_header_timeout 12;
    keepalive_timeout 15;
    Keepalive_requests 1,000;
    send_timeout 10;

    เธรด aio=ค่าเริ่มต้น;
    ส่งไฟล์บน;
    sendfile_max_chunk 512k;
    open_file_cache สูงสุด = 100,000 ไม่ใช้งาน = 10m;
    open_file_cache_valid 10m;
    open_file_cache_min_uses 10;
    open_file_cache_errors บน;

    gzip ปิด;
}

ดังนั้นคำถามคือ: จะให้บริการการเชื่อมต่อ 10k ด้วยทราฟฟิก 10Gbps ที่ดาวน์โหลดไฟล์สแตติกได้อย่างไร เป็นปัญหาของ linux หรือ nginx หรือฮาร์ดแวร์หรือไม่

Brandon Xavier avatar
us flag
มีคำแนะนำเฉพาะที่คุณปฏิบัติตามสำหรับการปรับแต่งของคุณหรือไม่? โดยเฉพาะอย่างยิ่ง ฉันอยากรู้เกี่ยวกับ: A) ตัวเลือกที่จะไม่เปิดใช้งานเฟรมจัมโบ้ B) ความสัมพันธ์ของ IRQ/การปักหมุด - ฉันเห็นว่าคุณปิดใช้งาน irqbalance แต่ไม่มีการกล่าวถึงการตรึง IRQ ของ NIC กับ CPU เฉพาะ C) พารามิเตอร์ต่างๆ ที่เปลี่ยนไป จากค่าเริ่มต้น (ขออภัย แต่การพิจารณาสิ่งนี้จากการกำหนดค่าการทำงานของคุณไม่ได้เป็นการใช้เวลาที่ดีของใครเลย ;-)
JonS avatar
br flag
ฉันได้อ่านบทความออนไลน์มากมาย https://www.kernel.org/doc/ols/2009/ols2009-pages-169-184.pdf https://fasterdata.es.net/host-tuning/linux/ https://darksideclouds.wordpress.com/2016/10/10/tuning-10gb-nics-highway-to-hell/ A) เนื่องจากฉันรู้ว่าต้องเปิดใช้งานบนสวิตช์ อุปกรณ์เครือข่าย และไคลเอนต์ที่เชื่อมต่อทั้งหมด ดังนั้นจึงมีประโยชน์สำหรับการถ่ายโอนข้อมูลระหว่างเซิร์ฟเวอร์ความเร็วสูงเท่านั้น B) ไม่ได้ตั้งค่าความสัมพันธ์เนื่องจากเป็นเครื่องเสมือน ฉันจะตั้งค่าได้หรือไม่ C) ฉันเดาว่าทุกคนรู้จักพารามิเตอร์เริ่มต้นที่ใช้ช่วงเวลาดีๆ ใน linux และ nginx และสามารถพบได้ทางออนไลน์
JonS avatar
br flag
แน่นอนว่าการขัดจังหวะ NIC ทั้งหมดจะไปที่ CPU เดียวเท่านั้น https://pastebin.com/9JTbgt5J ดังนั้นจึงเป็นคอขวด จะตั้งค่าความสัมพันธ์ irq บน VM virtio ได้อย่างไร
Score:3
ธง br
Joe

แบรนดอนตอบไปแล้ว เปิด irqbalance เรียกใช้ numad และปรับแต่ง หยุดพยายามปรับแต่งเว้นแต่คุณจะมีภาระงานที่จำเป็นต้องใช้ผลการทดสอบ wrk ของคุณจากการทดสอบคำขอ 2,000-10,000 รายการก่อนที่คุณจะปรับใช้อยู่ที่ไหน ปัญหานี้ไม่ควรเกิดขึ้นในการผลิต มันจะถูกระบุอย่างชัดเจนโดยการทดสอบ การใช้งานในโลกแห่งความเป็นจริงมักจะพบจุดบกพร่องที่ผิดปกติ แต่จุดบกพร่องการกำหนดค่าและแอปพลิเคชันจำนวนมาก/ส่วนใหญ่สามารถระบุและแก้ไขได้ในระหว่างการทดสอบ มีเอกสารมากมายเกี่ยวกับความสัมพันธ์ไอคิว ฉันสงสัยว่ากรณีการใช้งานของคุณสามารถทำได้ดีกว่าการใช้เครื่องมือปรับแต่งในตัว เป็นไปได้มากว่าการปรับแต่งด้วยมือของคุณจะทำงานแย่ลง

JonS avatar
br flag
ฉันเปิดใช้งาน irqbalance แล้ว ตอนนี้การขัดจังหวะมีความสมดุลใน 8 แกน CPU แต่ปัญหายังคงมีอยู่ ดูเหมือนว่าปัญหาในการจัดการแพ็กเก็ตอย่างถูกต้อง ฉันเปิดใช้งานการรับส่งข้อมูลขนาดใหญ่และ tcp-segmentation-offload แต่ไม่แตกต่างกันมากนัก
Brandon Xavier avatar
us flag
หวังว่าคุณจะทำงานกับโฮสต์ก่อนที่จะปรับแขก
Score:1

ผลผลิตจาก สูงสุด ระบุว่าเคอร์เนลของคุณถูกขัดจังหวะอย่างนุ่มนวลจากการเชื่อมต่อขาเข้าทั้งหมด การเชื่อมต่อเข้ามาอย่างรวดเร็วจนการขัดจังหวะฮาร์ดแวร์ที่ทริกเกอร์โดยการ์ดเครือข่ายเข้าคิวการขัดจังหวะแบบนุ่มนวลเร็วกว่าที่เคอร์เนลจะรับมือได้นี่คือสาเหตุที่การใช้งาน CPU, RAM และ IO ของคุณต่ำมาก ระบบยังคงถูกขัดจังหวะด้วยการเชื่อมต่อที่เข้ามา สิ่งที่คุณต้องการที่นี่คือโหลดบาลานเซอร์

JonS avatar
br flag
เราใช้ load-balancer เพื่อส่งทราฟฟิกไปยัง 2 เซิร์ฟเวอร์ที่มีการกำหนดค่าเดียวกันอยู่แล้ว ดังนั้นฉันจึงต้องการให้ทุกเซิร์ฟเวอร์จัดการการเชื่อมต่อจำนวนมากด้วยแบนด์วิธสูง การเพิ่ม CPU Cores ช่วยแก้ปัญหาการขัดจังหวะแบบนุ่มนวลหรือไม่?
JonS avatar
br flag
แน่นอนว่าการขัดจังหวะ NIC ทั้งหมดจะไปที่ CPU เดียวเท่านั้น https://pastebin.com/9JTbgt5J ดังนั้นจึงเป็นคอขวด จะตั้งค่าความสัมพันธ์ irq บน VM virtio ได้อย่างไร

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา