2008-11-26 21 views
6

मैं एक Xbox 360 devkit (जो विंसॉक का उपयोग करता है) पर बड़ी संख्या में छोटी फ़ाइलों को डाउनलोड करने के लिए एक एफ़टीपी-जैसे प्रोग्राम विकसित कर रहा हूं, और इसे प्लेस्टेशन 3 (एक डेकिट, और लिनक्स का उपयोग करता है) पर पोर्ट कर रहा हूं AFAIK)। कार्यक्रम बीएसडी-शैली सॉकेट (टीसीपी) का उपयोग करता है। दोनों कार्यक्रम एक ही सर्वर के साथ संवाद करते हैं, उसी डेटा को डाउनलोड करते हैं। इस तरह एक पाश में सभी फ़ाइलों के माध्यम से कार्यक्रम दोहराता:विंसॉक और लिनक्स सॉकेट के बीच अंतर

for each file 
    send(retrieve command) 
    send(filename) 
    receive(response) 
    test response 
    receive(size) 
    receive(data) 

360 कार्यान्वयन पर, पूरे डाउनलोड 1:27 लेता है, और समय पिछले भेजने के बीच और पहले प्राप्त लगभग 14 सेकंड लेता है। यह मेरे लिए काफी उचित लगता है।

प्लेस्टेशन 3 कार्यान्वयन उसी डेटा के लिए 4:01 लेता है। बाधा आखिरी प्रेषण और पहली बार प्राप्त होती है, जो उस समय 3:43 लेती है। नेटवर्क और डिस्क टाइम्स दोनों Xbox 360 से काफी कम हैं।

ये दोनों devkits मेरे पीसी के समान स्विच पर हैं, जो फ़ाइल की सेवा करता है, और कहा स्विच पर कोई अन्य ट्रैफिक नहीं है।

मैंने TCP_NODELAY ध्वज सेट करने का प्रयास किया है, जिसने चीजों को महत्वपूर्ण रूप से नहीं बदला है। मैंने SO_SNDBUF/SO_RCVBUF से 625KB को सेट करने का भी प्रयास किया है, जिसने समय को महत्वपूर्ण रूप से प्रभावित नहीं किया है।

मुझे लगता है कि अंतर विंसॉक और लिनक्स के बीच टीसीपी/आईपी स्टैक कार्यान्वयन के बीच है; क्या कोई सॉकेट विकल्प है जिसे मैं लिनक्स कार्यान्वयन को विंसॉक की तरह व्यवहार करने के लिए सेट कर सकता हूं? क्या कोई और चीज है जिसके लिए मैं लेखांकन नहीं कर रहा हूं?

एकमात्र समाधान इसे फिर से लिखना प्रतीत होता है ताकि यह सभी फ़ाइल अनुरोधों को एक साथ भेज सके, फिर उन सभी को प्राप्त करता है।

दुर्भाग्यवश, सोनी के कार्यान्वयन में TCP_CORK विकल्प नहीं है, इसलिए मैं यह नहीं कह सकता कि यह अंतर है या नहीं।

+0

आप कौन से एफ़टीपी मोड का उपयोग कर रहे हैं, निष्क्रिय या सक्रिय? इसके अलावा, आप कहते हैं "अंतिम प्रेषण और पहली बार प्राप्त होने के बीच का समय लगभग 14 सेकंड लगता है। यह मेरे लिए काफी उचित लगता है।" मुझे आश्चर्य है कि आरईटीआर कमांड के जवाब के लिए 14 सेकंड का इंतजार उचित है, खासकर जब यह PS3 के लिए लंबा है। – Alexander

उत्तर

2

आप TCP_CORK चाहते हैं। यह आंशिक फ्रेम को बढ़ने के माध्यम से (विलंबता के खर्च पर) भेजने से रोक देगा - बस जीतने की तरह।

int v,vlen; 
v=1; vlen=sizeof(v); 
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen); 

सेट v=0 फ्रेम फ्लश करने से पहले प्राप्त करते हैं:

int v,vlen; 
v=0; vlen=sizeof(v); 
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen); 

सबसे Unixes पर आप writev() या sendfile() का उपयोग करके अपने प्रवाह क्षमता को और बेहतर बनाया जा सकता है ...

1

Wireshark अपने दोस्त, सूंघना है तार - पैकेट को देखें कि प्रत्येक को अनुक्रमित किया जा रहा है और देखें कि क्या आप अंतर/समस्या को नहीं देख सकते हैं।

उच्च विलंबता लिंक पर आप वास्तव में यह सुनिश्चित करना चाहते हैं कि आप प्रत्येक टीसीपी पैकेट को अधिकतम रखकर जितना संभव हो सके बफर करें।

कोलेसे भेजें भेजें एक अच्छा विचार है। यह केवल तभी ट्रिगर होता है जब भेजने के पक्ष में एक से अधिक अनजान फ्रेम होते हैं। आम तौर पर आपको केवल इस सुविधा को अक्षम कर सकते हैं यदि आप जानते हैं कि आपका क्या कर रहा है और आपका सिस्टम व्यापक बफरिंग प्रदान करता है अन्यथा यह अक्षम करना उच्च विलंबता नेटवर्क पर सिस्टम प्रदर्शन को नकारात्मक रूप से प्रभावित करने के लिए निश्चित है।

उच्चतम थ्रूपुट बफर डेमर्स के लिए पथ एमटीयू के सटीक कारक होना चाहिए।

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