यह निर्धारित करने का सूत्र क्या है कि लिनक्स के तहत सॉकेट की कितनी मेमोरी है?


11

मैं कुछ क्षमता योजना बना रहा हूं और मैं सोच रहा था कि क्या कोई ऐसा फॉर्मूला है जिसका उपयोग मैं भविष्यवाणी करने के लिए कर सकता हूं (मेमोरी के दृष्टिकोण से) मैं अपने सर्वर पर कितने टीसीपी कनेक्शन संभाल सकता हूं। फिलहाल, मैं केवल स्मृति आवश्यकताओं के बारे में चिंतित हूं।

कुछ चर जो मुझे लगता है कि सूत्र में दिखाई देंगे:

  • sysctl की net.ipv4.tcp_wmemन्यूनतम (न्यूनतम या डिफ़ॉल्ट मान)
  • sysctl की net.ipv4.tcp_rmemन्यूनतम (न्यूनतम या डिफ़ॉल्ट मान)
  • जुर्राब, sock_common, प्रोटो और अन्य प्रति सॉकेट डेटा संरचनाओं का आकार।

मुझे यकीन नहीं है कि tcp_wmem और tcp_rmem में से कितने वास्तव में आवंटित किए गए हैं और कब उस मेमोरी को आवंटित किया गया है। सॉकेट निर्माण समय पर? मांग पर?

जवाबों:


2

यदि आप स्रोत कोड को संशोधित कर सकते हैं, तो आरएसएस को मापने के लिए rusage डेटा का उपयोग करें और रिकॉर्ड करें कि माप के समय कितने टीसीपी कनेक्शन हैं।

यदि सोर्स कोड नहीं बदला जा सकता है, तो ऊपर या ps द्वारा रिपोर्ट किए गए नेटवर्क ऐप के RSS का उपयोग करें और माप के समय नेटवर्क कनेक्शन की संख्या प्राप्त करें lsof -i

जब आपका एप्लिकेशन पीक लोड के माध्यम से आगे बढ़ता है, तो हर मिनट यह डेटा एकत्र करें और उस डेटा से आप एक सूत्र के साथ आ सकते हैं जो रैम उपयोग के लिए कनेक्शन की संख्या से संबंधित है।

बेशक बहुत कुछ और चीजें हैं जिन्हें आप माप सकते हैं, विशेष रूप से आप कर्नेल रैम उपयोग को मापना चाह सकते हैं, हालांकि टीसीपी डेटा संरचनाओं को अग्रिम में अनुमानित और गणना योग्य होना चाहिए। किसी भी मामले में, इस प्रश्न पर एक नज़र डालें https://cverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server टीसीपी ट्यूनिंग और अधिक जानकारी के लिए नेटवर्क स्टैक में क्या हो रहा है, इसका स्पष्ट दृश्य कैसे प्राप्त करें।


तनाव को मापने के लिए और मुझे उन लिंक की ओर इशारा करने के लिए धन्यवाद जो दिखाते हैं कि उन मैट्रिक्स को कैसे इकट्ठा किया जाए!
टिम स्टीवर्ट

8

tcp_mem अधिक महत्वपूर्ण है क्योंकि यह परिभाषित करता है कि मेमोरी उपयोग के लिए tcp स्टैक को कैसे व्यवहार करना चाहिए। IMO भेजने और प्राप्त करने वाला बफर tcp_mem का एक बहु होना चाहिए। यहाँ बफर प्राप्त करने के लिए एक सूत्र का लिंक दिया गया है: http://www.acc.umu.se/~maswan/linux-netperf.txt । संक्षेप में:

ओवरहेड है: विंडो / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale डिफ़ॉल्ट 2 है) इसलिए रिसीव विंडो (tcp_rmem) के लिए लिनक्स डिफॉल्ट मापदंडों के लिए: 87380 - (87380/2 ^ 2) = 65536. एक ट्रांसअटलांटिक लिंक को देखते हुए (150 टीटी) अधिकतम प्रदर्शन यहां समाप्त होता है: 65536 / 0.150 = 436906 बाइट्स / s या लगभग 400 kbyte / s, जो आज वास्तव में धीमा है। बढ़े हुए डिफ़ॉल्ट आकार के साथ: (873800 - 873800/2 ^ 2) / 0.150 = 4369000 बाइट्स / s, या लगभग 4Mbytes / s, जो एक आधुनिक नेटवर्क के लिए प्रतिध्वनि है। और ध्यान दें कि यह डिफ़ॉल्ट है, अगर प्रेषक को एक बड़े विंडो आकार के साथ कॉन्फ़िगर किया गया है, तो यह खुशी से 10 गुना (8738000 * 0.75 / 0.150 = ~ 40Mbytes / s) तक स्केल करेगा, एक आधुनिक नेटवर्क के लिए बहुत अच्छा है।

यहाँ लेख tcp_mem के बारे में क्या कहता है:

आप जो निकालते हैं वह tcp प्रदर्शन की एक कृत्रिम सीमा है, उस सीमा के बिना आप उपलब्ध एंड-टू-एंड बैंडविड्थ और हानि से बंधे होते हैं। इसलिए आप अपने अपलिंक को अधिक प्रभावी ढंग से संतृप्त कर सकते हैं, लेकिन इसे संभालने में tcp अच्छा है।

IMO एक बड़ा मध्य tcp_mem मूल्य कम सुरक्षा के नुकसान पर कनेक्शन को गति देता है और मेमोरी यूसेज को थोड़ा बढ़ाता है।

आप नेटवर्क स्टैक की निगरानी कर सकते हैं:

grep skbuff /proc/slabinfo

1
जानकारीपूर्ण प्रतिक्रिया के लिए धन्यवाद। यह दिखाता है कि मुझे नेटवर्किंग के बारे में जानने की कितनी जरूरत है।
टिम स्टीवर्ट

1

डेविड ने पूछे गए सवाल का बहुत अच्छा जवाब दिया है, हालांकि जब तक आप विशेष रूप से एलएफएन का उपयोग नहीं कर रहे हैं , तब भी एक घटना-आधारित सर्वर पर, टीसीपी बफ़र्स प्रति-कनेक्शन पदचिह्न का केवल एक छोटा सा हिस्सा होने की संभावना है।

क्षमता योजना के लिए सर्वर का परीक्षण करने और लोड द्वारा मेमोरी उपयोग के प्रतिगमन की गणना करने के लिए कोई विकल्प नहीं है।


धन्यवाद, यह बहुत अच्छा है जब एक सरल सूत्र करेंगे, लेकिन ऐसे समय होते हैं जब आपको बस मापना होता है।
टिम स्टीवर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.