วิธีตรวจสอบ rx ring, max_backlog และขนาด max_syn_backlog


41

บ่อยครั้งในการแก้ไขปัญหาและปรับแต่งสิ่งที่ฉันคิดว่าตัวเองคิดเกี่ยวกับการตั้งค่าเคอร์เนล Linux ต่อไปนี้:

net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn

อื่น ๆ กว่าfs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmemและnet.ipv4.tcp_wmemพวกเขาน่าจะเป็นลูกบิดสิ่งสำคัญที่จะยุ่งกับเมื่อคุณได้รับการปรับจูนกล่องสำหรับระดับสูงของการเห็นพ้อง

คำถามของฉัน: ฉันจะตรวจสอบเพื่อดูว่ามีรายการกี่รายการในแต่ละคิวเหล่านั้นได้อย่างไร โดยทั่วไปแล้วคนมักจะตั้งค่าให้พวกเขาสูง แต่ฉันต้องการที่จะเข้าสู่ระบบขนาดคิวเหล่านั้นเพื่อช่วยทำนายความล้มเหลวในอนาคตและจับปัญหาก่อนที่พวกเขาจะปรากฏในทางที่ผู้ใช้เห็นได้ชัด


นี่เป็นคำถามที่ยอดเยี่ยม ฉันสนใจในปัญหา incast และการส่งผ่าน TCP ความละเอียดสูงอีกครั้ง
dhchdhd

คำตอบ:


29

ฉันก็สงสัยเช่นนี้และได้รับแรงบันดาลใจจากคำถามของคุณ!

ฉันได้รวบรวมว่าฉันจะเข้ามาใกล้คิวแต่ละรายการที่คุณระบุด้วยข้อมูลบางอย่างที่เกี่ยวข้องกับแต่ละรายการได้อย่างไร ฉันยินดีรับฟังความคิดเห็น / ข้อเสนอแนะการปรับปรุงการตรวจสอบใด ๆ ทำให้การจัดการง่ายขึ้น!

net.core.somaxconn

net.ipv4.tcp_max_syn_backlog

net.core.netdev_max_backlog

$ netstat -an | grep -c SYN_RECV 

จะแสดงจำนวนการเชื่อมต่อโกลบอลปัจจุบันในคิวคุณสามารถแยกค่านี้ต่อพอร์ตและใส่ไว้ในคำสั่ง exec ใน snmpd.conf หากคุณต้องการโพลจากแอพพลิเคชั่นการตรวจสอบ

จาก:

netstat -s

สิ่งเหล่านี้จะแสดงให้เห็นว่าคุณเห็นคำขอจากคิวบ่อยเพียงใด:

146533724 packets directly received from backlog
TCPBacklogDrop: 1029
3805 packets collapsed in receive queue due to low socket buffer

fs.file สูงสุด

จาก:

http://linux.die.net/man/5/proc

$ cat /proc/sys/fs/file-nr
2720    0       197774

ไฟล์นี้ (อ่านอย่างเดียว) ให้จำนวนไฟล์ที่เปิดในปัจจุบัน มันมีสามหมายเลข: จำนวนของการจัดการไฟล์ที่จัดสรรจำนวนการจัดการไฟล์ฟรีและจำนวนสูงสุดของการจัดการไฟล์

net.ipv4.ip_local_port_range

หากคุณสามารถสร้างรายการยกเว้นของบริการ (netstat -an | grep LISTEN) จากนั้นคุณสามารถอนุมานจำนวนการเชื่อมต่อที่ใช้สำหรับกิจกรรมชั่วคราว:

netstat -an | egrep -v "MYIP.(PORTS|IN|LISTEN)"  | wc -l

ควรตรวจสอบ (จาก SNMP):

TCP-MIB::tcpCurrEstab.0

มันอาจเป็นที่น่าสนใจในการรวบรวมสถิติเกี่ยวกับสถานะทั้งหมดที่เห็นในแผนภูมินี้ (สร้างขึ้น / time_wait / fin_wait / ฯลฯ ):

TCP-MIB::tcpConnState.*

net.core.rmem_max

net.core.wmem_max

คุณต้อง dtrace / strace ระบบของคุณสำหรับคำขอ setsockopt ฉันไม่คิดว่าสถิติสำหรับคำขอเหล่านี้มีการติดตามเป็นอย่างอื่น นี่ไม่ใช่คุณค่าที่เปลี่ยนแปลงจากความเข้าใจของฉัน แอปพลิเคชันที่คุณปรับใช้อาจจะถามจำนวนมาตรฐาน ฉันคิดว่าคุณสามารถ 'โปรไฟล์' แอปพลิเคชันของคุณด้วย strace และกำหนดค่านี้ตามนั้น (หารือเกี่ยว?)

net.ipv4.tcp_rmem

net.ipv4.tcp_wmem

ในการติดตามว่าคุณใกล้ถึงขีด จำกัด สูงสุดเท่าไรคุณจะต้องดูค่าเฉลี่ยและค่าสูงสุดจากฟิลด์ tx_queue และ rx_queue จาก (เป็นประจำ):

# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0FB1 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262030037 1 ffff810759630d80 3000 0 0 2 -1                
   1: 00000000:A133 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262029925 1 ffff81076d1958c0 3000 0 0 2 -1                

ในการติดตามข้อผิดพลาดที่เกี่ยวข้องกับสิ่งนี้:

# netstat -s
    40 packets pruned from receive queue because of socket buffer overrun

ควรตรวจสอบพูล 'บัฟเฟอร์' ทั่วโลก (ผ่าน SNMP) ด้วย:

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 74172456
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 51629704

2

ฉันคิดว่าคุณอาจได้รับข้อมูลนั้นด้วย SystemTap นี่คือคู่มืออ้างอิง Redhat (PDF) นอกจากนี้ยังมีคำแนะนำเริ่มต้น (PDF)

เครื่องมือมีลักษณะเอนกประสงค์พอที่จะให้คุณได้รับข้อมูลโดยเฉพาะอย่างยิ่งprobe::netdev.rxดูเหมือนสิ่งที่จะให้ข้อมูลเกี่ยวกับรายการที่เข้ามาตอนนี้คุณ "เพียง" ต้องค้นหาขนาดสุทธิของคิวในบัฟเฟอร์หรือสิ่งที่นับสิ่ง ออกจากคิว ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.