สูตรการพิจารณาจำนวนซ็อกเก็ตหน่วยความจำที่ใช้ภายใต้ Linux คืออะไร


11

ฉันกำลังวางแผนกำลังการผลิตและฉันสงสัยว่ามีสูตรที่ฉันสามารถใช้ในการทำนาย (จากมุมมองหน่วยความจำ) จำนวนการเชื่อมต่อ TCP ที่ฉันสามารถจัดการกับเซิร์ฟเวอร์ของฉัน ในขณะนี้ฉันแค่กังวลเกี่ยวกับความต้องการของหน่วยความจำเท่านั้น

ตัวแปรบางตัวที่ฉันคิดว่าจะปรากฏในสูตรคือ:

  • sysctl's net.ipv4.tcp_wmem(นาทีหรือค่าเริ่มต้น)
  • sysctl's net.ipv4.tcp_rmem(นาทีหรือค่าเริ่มต้น)
  • ขนาดของ sock, sock_common, proto และโครงสร้างข้อมูลต่อซ็อกเก็ตอื่น ๆ

ฉันไม่แน่ใจว่ามีการจัดสรร tcp_wmem และ tcp_rmem มากเท่าใดและเมื่อจัดสรรหน่วยความจำแล้ว เมื่อถึงเวลาสร้างซ็อกเก็ต? ตามความต้องการ?

คำตอบ:


2

หากคุณสามารถแก้ไขซอร์สโค้ดได้ให้ใช้ข้อมูล rusage เพื่อวัดค่า RSS และบันทึกจำนวนการเชื่อมต่อ TCP ที่ใช้งานอยู่ในขณะที่ทำการวัด

ถ้ารหัสที่มาไม่สามารถเปลี่ยนแปลงได้แล้วใช้ RSS ของ app เครือข่ายตามการรายงานด้านบนหรือ PS lsof -iและได้รับจำนวนการเชื่อมต่อเครือข่ายในช่วงเวลาของการวัดจาก

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

แน่นอนว่ายังมีอีกหลายสิ่งที่คุณสามารถวัดได้โดยเฉพาะอย่างยิ่งคุณอาจต้องการวัดการใช้งานเคอร์เนล RAM แม้ว่าโครงสร้างข้อมูล tcp ควรคาดการณ์และคำนวณได้ล่วงหน้า ในกรณีใด ๆ ให้ดูที่คำถามนี้/server/10852/what-limits-the-maximum-number-of-connections-on-a-linux-serverสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปรับแต่ง TCP และ วิธีรับมุมมองที่ชัดเจนว่าเกิดอะไรขึ้นในสแต็กเครือข่าย


ขอบคุณสำหรับการวัดความเครียดและชี้ให้ฉันไปยังลิงก์ที่แสดงวิธีรวบรวมตัวชี้วัดเหล่านั้น!
Tim Stewart

8

tcp_mem มีความสำคัญมากกว่าเนื่องจากเป็นตัวกำหนดว่าสแต็ก tcp ควรทำงานอย่างไรเมื่อใช้งานหน่วยความจำ บัฟเฟอร์การส่งและรับ IMO ควรเป็น tcp_mem หลายตัว นี่คือการเชื่อมโยงไปสูตรสำหรับบัฟเฟอร์รับ: http://www.acc.umu.se/~maswan/linux-netperf.txt ในระยะสั้น:

ค่าใช้จ่ายคือ: window / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale ค่าเริ่มต้นคือ 2) ดังนั้นสำหรับพารามิเตอร์เริ่มต้นของ linux สำหรับหน้าต่าง recieve (tcp_rmem): 87380 - (87380/2 ^ 2) = 65536 ได้รับลิงค์ข้ามมหาสมุทรแอตแลนติก (150 ms RTT) ประสิทธิภาพสูงสุดสิ้นสุดที่: 65536 / 0.150 = 436906 bytes / s หรือประมาณ 400 kbyte / s ซึ่งช้ามากในวันนี้ ด้วยขนาดเริ่มต้นที่เพิ่มขึ้น: (873800 - 873800/2 ^ 2) /0.150 = 4369000 bytes / s หรือประมาณ 4Mbytes / s ซึ่งเป็นเครือข่ายที่ทันสมัย และโปรดทราบว่านี่เป็นค่าเริ่มต้นหากผู้ส่งได้รับการกำหนดค่าด้วยขนาดหน้าต่างที่ใหญ่ขึ้นมันจะขยายได้อย่างมีความสุขมากถึง 10 เท่า (8738000 * 0.75 / 0.150 = ~ 40Mbytes / s) ค่อนข้างดีสำหรับเครือข่ายที่ทันสมัย

นี่คือสิ่งที่บทความพูดเกี่ยวกับ tcp_mem:

สิ่งที่คุณลบคือขีด จำกัด เทียมสำหรับประสิทธิภาพการทำงานของ TCP โดยไม่ จำกัด ว่าคุณจะถูก จำกัด ด้วยแบนด์วิดท์และการสูญเสียแบบ end-to-end ที่มีอยู่ ดังนั้นคุณอาจสิ้นสุดการอัปลิงค์อัปลิงค์ได้อย่างมีประสิทธิภาพ แต่ tcp สามารถจัดการสิ่งนี้ได้ดี

IMO ค่า tcp_mem กลางที่ใหญ่กว่าจะเร่งความเร็วการเชื่อมต่อเมื่อสูญเสียความปลอดภัยน้อยลงและเพิ่มการใช้หน่วยความจำเล็กน้อย

คุณสามารถตรวจสอบเครือข่ายสแต็คด้วย:

grep skbuff /proc/slabinfo

1
ขอบคุณสำหรับการตอบสนองที่ให้ข้อมูล มันแสดงให้เห็นว่าฉันต้องเรียนรู้เกี่ยวกับเครือข่ายมากแค่ไหน
Tim Stewart

1

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

สำหรับการวางแผนความจุไม่มีสิ่งใดทดแทนการทดสอบเซิร์ฟเวอร์และคำนวณการถดถอยของการใช้หน่วยความจำด้วยการโหลด


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