2013-05-09 7 views
9

लिनक्स यूडीपी का अधिकतम आकार बफर प्राप्त करता है? मैंने सोचा कि यह केवल उपलब्ध रैम द्वारा सीमित है, लेकिन जब मैं rmem_max के लिएलिनक्स यूडीपी अधिकतम आकार प्राप्त बफर

5GB सेट:

gen_udp:listen(Port, [{recbuf, 4000000000}]) 

जब मैं उपाय: वास्तविक सॉकेट बफर (Erlang में) के लिए

echo 5000000000 > /proc/sys/net/core/rmem_max 

और 4GB बफर उपयोग, यह दिखाता है:

# netstat -u6anp | grep 5050 
udp6 1409995136  0 :::5050 :::*  13483/beam.smp 

मैं इस 1.4 जीबी से अधिक नहीं हो सकता। छोटे बफर आकारों के लिए, उदा। 500 एमबी, वास्तविक बफर आकार कॉन्फ़िगर किए गए मान से मेल खाता है। मेरा सिस्टम डेबियन 6.0 है, मशीन में 50 जीबी रैम उपलब्ध है।

+1

कहां कहता है कि यह केवल उपलब्ध रैम द्वारा ही सीमित है? और आपको क्यों लगता है कि आपको 4 जीबी बफर चाहिए? – EJP

+0

यह नहीं करता है। यह नहीं कहता कि यह किसी भी अन्य तरीके से सीमित है। मुझे लंबे समय तक नेटवर्क यातायात की चोटी के दौरान डेटा हानि से बचने के लिए ऐसे बफर की आवश्यकता है। इसके विपरीत –

+1

। यह कहता है कि कर्नेल आपके द्वारा ऊपर या नीचे दिए गए मूल्य को समायोजित कर सकता है, और आपको यह देखने के लिए 'getockopt()' को कॉल करने की सलाह देता है कि वास्तव में कौन सा मूल्य आवंटित किया गया था। मुझे विश्वास करना मुश्किल लगता है कि आपको ट्रैफिक चोटियों को संभालने के लिए 4 जीबी की जरूरत है। शायद आपको बस तेज़ी से पढ़ना चाहिए। – EJP

उत्तर

9

ऐसा लगता है कि लिनक्स में एक सीमा है। मैंने सफलता के साथ rmem_max को 2^32-1 पर सेट करने का प्रयास किया है।

[email protected]:/proc/sys/net/core# echo 2147483647 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    2147483647 

2^32 बहुत ज्यादा था:

[email protected]:/proc/sys/net/core# echo 2147483648 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    -18446744071562067968 

5000000000 पैदावार करने के लिए सेटिंग:

[email protected]:/proc/sys/net/core# echo 5000000000 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    705032704 

मैं अजगर में परीक्षण किया है कि स्थापित करने और सॉकेट हो रही

ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize) 
    print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) 
साथ बफ़र प्राप्त

यदि 'बफर आकार' 1024^3 प्रोग्राम प्रिंट्स को कम से कम 'बफर साइज़' से कम किया जाता है, अन्यथा यह 256 पर वापस आ जाता है।

मूल्य 705032704 * 2 = 1410065408 नेटस्टैट द्वारा प्राप्त 1409995136 के करीब है।

+0

दरअसल, मैंने rmem_max में वास्तविक मूल्य को सत्यापित नहीं किया है। धन्यवाद। ऐसा लगता है कि बफर आकार किसी स्पष्ट कारण के साथ हस्ताक्षरित int तक ही सीमित है। –

0

2^32-1 (2147483647, अधिकतम 32 बिट पर हस्ताक्षर किए पूर्णांक)

[email protected]@localhost:~# sysctl -w net.core.rmem_max=2147483647 
net.core.rmem_max = 2147483647 

[email protected]:~# sysctl -w net.core.rmem_max=2147483648 
sysctl: setting key "net.core.rmem_max": Invalid argument 
net.core.rmem_max = 2147483648 

/proc फाइल सिस्टम में गूंज जब बड़े मूल्यों को निर्धारित करने के लिए प्रयास से ऊपर जाने का प्रतीत होता है।

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