2011-12-01 13 views
5

कृपया, लिनक्स कर्नेल हैकर्स, सॉकेट या फ़ाइलों के लिए write(2) syscall के लिए उचित बफर आकार क्या है, प्रदर्शन-वार? यह स्पष्ट है कि यह कुछ पेजिज़ेज़ एकाधिक है, लेकिन कौन सा? फर्क पड़ता है क्या? "बहुत छोटा" और "बहुत बड़ा" क्या है?दोनों सॉकेट और फ़ाइल की सिफारिश की गई बफर आकार

+0

128 किलोबाइट से कम कुछ भी है, क्योंकि है कि क्या डिफ़ॉल्ट रूप से भेजने कतार में फिट बैठता है (जब तक आप सेटॉकटॉप के साथ खेलना नहीं चाहते) । – Damon

+1

@ डैमन: मुझे यकीन नहीं है कि "कुछ भी" सही जवाब है। बफर को कम से कम गठबंधन किया जाना चाहिए। – Cartesius00

+0

अधिकांश लोगों के लिए अधिकांश समय डिफ़ॉल्ट कार्य (यह मानना ​​उचित है कि नेटवर्क स्टैक लिखने वाले लोग पूर्ण बेवकूफ नहीं हैं)। जब तक आपको नियमित रूप से बड़ी मात्रा में डेटा (वास्तव में विशाल) भेजने की आवश्यकता नहीं होती है और विलंबता पर कुछ सख्त बाधाएं होती हैं, तो आमतौर पर परेशान करने का कोई कारण नहीं होता है। कुछ भी जो "उचित" आकार है, उसे केवल प्रेषण बफर में कॉपी किया जाता है और भेजा जाता है, इससे कोई फर्क नहीं पड़ता कि यह कितना है। यदि यह सब ठीक नहीं होता है, तो 'लिखने' आपके द्वारा पूछे जाने वाले कार्यों से कम लिखेंगे (राशि वापस कर रहा है)। किसी भी मामले में, यह सिर्फ काम करता है। – Damon

उत्तर

7

कितना बड़ा सहकर्मी के लिए अपने देरी, मान लीजिए कि आप एक 100MBps कनेक्शन, और 50ms की देरी है चलो है पर निर्भर करता है, तो आप की गणना कर सकते

100MBps * 0.050 sec/8 = 0.625MB = 625KB 

लेकिन लिनक्स 2.6 में डिफ़ॉल्ट विंडो आकार के आसपास है 110kb, जो आपके सोचा 2.2MBps (110kb/0.050) हां, तो चारों ओर के लिए बाहर तक सीमित कर देगा तय करने के लिए कि आप कर सकते हैं आप setsockopt

int ret, sock, buf_size; 
sock = socket(AF_INET, SOCK_STREAM, 0); 
buf_size = 625*1024; 
ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size)); 
ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size)); 
संबंधित मुद्दे