2010-01-19 9 views
26

में कार्यावधि में बफर आकार प्राप्त लिनक्स में, एक सिस्टम डिफ़ॉल्ट नेटवर्क पैकेट के लिए बफर आकार प्राप्त निर्दिष्ट कर सकते हैं, निम्न कमांड का प्रयोग यूडीपी कहते हैं,:निर्दिष्ट यूडीपी लिनक्स

sysctl -w net.core.rmem_max=<value> 
sysctl -w net.core.rmem_default=<value> 

लेकिन मुझे आश्चर्य है कि, यह संभव है किसी अनुप्रयोग के लिए (कहें, c में) रनटाइम में प्रति यूडीपी सॉकेट प्राप्त बफर आकार निर्दिष्ट करके सिस्टम के डिफ़ॉल्ट ओवरराइड करने के लिए?

उत्तर

28

आप डिफ़ॉल्ट से मान बढ़ा सकते हैं, लेकिन आप इसे अधिकतम मूल्य से अधिक नहीं बढ़ा सकते हैं। SO_RCVBUF विकल्प बदलने के लिए setsockopt का उपयोग करें:

int n = 1024 * 1024; 
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) { 
    // deal with failure, or ignore if you can live with the default size 
} 

ध्यान दें कि यह पोर्टेबल समाधान है; यह प्राप्त बफर आकार बढ़ाने के लिए किसी भी POSIX मंच पर काम करना चाहिए। लिनक्स के पास कुछ समय के लिए autotuning है (2.6.7 के बाद से, और reasonable maximum buffer sizes 2.6.17 के बाद से), जो स्वचालित रूप से भार के आधार पर प्राप्त बफर आकार समायोजित करता है। ऑटोट्यूनिंग के साथ कर्नेल पर, यह अनुशंसा की जाती है कि आप setsockopt का उपयोग करके प्राप्त बफर आकार सेट न करें, क्योंकि यह कर्नेल के ऑटोोट्यूनिंग को अक्षम कर देगा। हालांकि, बफर आकार को समायोजित करने के लिए setsockopt का उपयोग करना अन्य प्लेटफार्मों पर अभी भी आवश्यक हो सकता है।

+0

बस जो मैं देख रहा था :) मुझे आश्चर्य है, अगर मैंने बफर आकार को एक छोटे से मूल्य पर निर्दिष्ट किया है, तो यह स्थिर होगा? या क्या सिस्टम यातायात दबाव को संभालने के लिए गतिशील रूप से बफर का आकार बदल देगा, यदि कोई है? –

+0

मैंने लिनक्स टीसीपी ऑटोोट्यूनिंग का उल्लेख करने के लिए थोड़ा सा जवाब दिया है; लिनक्स पर, यदि ऑटोट्यूनिंग सक्षम है, तो आपको शायद 'सेटॉकटॉप' का उपयोग करके बफर आकार को समायोजित नहीं करना चाहिए; लेकिन अन्य प्रणालियों पर, आप अभी भी चाह सकते हैं। –

+4

ऑटोट्यूनिंग केवल टीसीपी पर लागू होता है या यह टीसीपी और यूडीपी दोनों पर लागू होता है? – kumar

संबंधित मुद्दे