2009-09-08 13 views
11

पर बेगीन रिसीव प्रदर्शन मैं सी # में एक सर्वर विकसित कर रहा हूं। यह सर्वर बैकअप सेवा के लिए डेटा सर्वर के रूप में कार्य करेगा: एक क्लाइंट डेटा भेज देगा, बहुत सारे डेटा, लगातार, एक ही टीसीपी चैनल में, फाइलों के डेटा खंड को पांच तक भेज देगा। मैं धीरे-धीरे सर्वर को डेटा भेजूंगा, मैं ग्राहक बैंडविड्थ को मारना नहीं चाहता, इसलिए मुझे अधिकतम डेटा भेजने की गति की आवश्यकता नहीं थी और, इस कारण से, मैं सब कुछ के लिए एक एकल टीसीपी चैनल का उपयोग कर सकता हूं।सॉकेट। मोनो

ने कहा, वास्तव में सर्वर क्लाइंट से डेटा प्राप्त करने के लिए BeginReceive विधि का उपयोग करता है, और विंडोज़ पर, इसका मतलब आईओसीपी है। मेरे प्रश्न यह है कि कैसे BeginReceive linux/freebsd कठिन मोनो पर प्रदर्शन करेगा? खिड़कियों पर, मैंने बहुत सी चीजें पढ़ी हैं, बहुत अच्छी तरह से प्रदर्शन करेंगे लेकिन यह सॉफ्टवेयर, सर्वर भाग, लिनक्स या फ्रीब्सड ट्रफ मोनो पर चलाएगा और मुझे नहीं पता कि इन तरीकों को कैसे लागू किया गया है!

अधिक, (एसिंक स्टेट ऑब्जेक्ट) के लिए एसिंक स्टेट ऑब्जेक्ट के आवंटन को कम करने की कोशिश करने के लिए, विधि प्राप्त करें, मैं टीसीपी कनेक्शन के लिए एक प्राप्त करता हूं और BeginReceive कॉलबैक में मैं इसे पुन: उपयोग करने से पहले डेटा कॉपी करता हूं (स्वाभाविक रूप से मैं डॉन ' डेटा साफ़ करने के लिए क्योंकि मुझे पता है कि कितना मुश्किल अंतराल वापसी मूल्य)। बफर 8kb पर सेट है, इसलिए मैं 8kb डेटा की अधिकतम प्रतिलिपि बनाउंगा, इसे पुनरुत्थान नहीं करना चाहिए।

मेरा लक्ष्य अधिकतम पर 400/500 कनेक्शन प्राप्त करना है। यह इतना नहीं है, लेकिन सर्वर (मशीन), इस बीच, फाइलों को एक फाइल सिस्टम को संभाल लेगा (सी # में पहले फ्यूज का उपयोग करके विकसित किया गया था और बाद में सी में) LVM + Linux सॉफ़्टवेयर RAID मिरर और एंटीवायरस चेक क्लैमव का उपयोग करके चेक करेगा सॉफ्टवेयर के रूप में प्रकाश होना चाहिए!

संपादित करें: मैं यह कहना भूल गया था कि मशीन (संभवतः) इंटेल कोर 2 डुओ 2.66+ गीगा (3 एमबी एल 2 - एफएसबी 1066 मेगाहर्ट्ज) 2 जीबी रैम और एसओ 64 बिट्स का उपयोग कर होगी।

मोनो एपोल (libevent) या kqueue (freebsd पर) का उपयोग कर है? और मुझे प्रदर्शन को अधिकतम करने की कोशिश करने के लिए कुछ विशिष्ट करना चाहिए? क्या मैं डेटा पैकेट प्राप्त करने वाले संसाधनों को मारने के लिए कुछ और नहीं कर सकता?

+1

समुदाय में आपका स्वागत है! – JoshJordan

उत्तर

2

मैं जानता हूँ कि यह एक छोटे देर हो चुकी है, लेकिन मैं सिर्फ यह सवाल ...

मोनो कनेक्शन है कि आप की जरूरत है और भी बहुत कुछ की संख्या को संभालने में सक्षम है पाया। मैं नियमित रूप से 1k एक साथ कनेक्शन के साथ xsp2 (मोनो एएसपी.नेट स्टैंडअलोन सर्वर) का परीक्षण करता हूं .. यदि यह एक उच्च लोड स्थिति होने जा रहा है, तो आपको MONO_THREADS_PER_CPU सेट करने के साथ थोड़ा सा खेलना चाहिए जब तक आपको थ्रेडपूल के लिए सही संख्या में थ्रेड नहीं मिल जाते ।

लिनक्स पर, मोनो उपलब्ध होने पर एपोल का उपयोग करता है (जो हमेशा इन दिनों होता है)।

+0

उत्तर कभी देर नहीं हुए :) वास्तव में धन्यवाद! –

+0

यह epoll_ctl का उपयोग कब करता है?मैंने मोनो के पूरे कोडबेस के माध्यम से grep'ed किया है और mono.posix –

+1

@AndriusBentkus के कोड में इसकी परिभाषा केवल कक्षा के पुस्तकालयों में नहीं है: https://github.com/mono/ मोनो/ब्लॉब/मास्टर/मोनो/मेटाडाटा/tpool-epoll.c – Gonzalo

1

मैं मोनो पर उस एक समारोह के प्रदर्शन के बारे में विशेष रूप से बात नहीं कर सकता, लेकिन आम तौर पर मोनो इन दिनों बहुत अच्छा प्रदर्शन करता है। 4-500 कनेक्शन जैसा कि आप कहते हैं, बहुत ज्यादा नहीं, इसलिए मुझे संदेह है कि आपको कोई समस्या होगी।

यह कहकर कि, इस तरह की चीज के लिए परीक्षण सेट करना बहुत कठिन नहीं होना चाहिए। मुझे लगता है कि शायद यही एकमात्र तरीका है जिससे आपको अपनी स्थिति के लिए एक निर्णायक उत्तर मिलेगा।

+1

आपके सुझाव के लिए धन्यवाद! मैंने एक साधारण तनाव सॉफ्टवेयर लिखा है जो डेटा भेजते समय कनेक्शन का एक सेट सेट करने में सक्षम है, यह वास्तव में सरल है। 3000 एक साथ कनेक्शन वाले विंडोज़ पर मेरे सर्वर का परीक्षण करने से पता चला है कि मेरा सर्वर लगभग 250 कनेक्शन संभाल लेगा, लेकिन मुझे लगता है कि यह मेरी क्लाइंट मशीन (जो तनाव सॉफ्टवेयर चला रहा है) पर निर्भर करता है क्योंकि 1 जीबी मेमोरी वाला एक पुराना सेंट्रिनो 2ghz है (= समय पर केवल एक धागा निष्पादित कर सकते हैं)। मुझे कुछ फिक्स करने की ज़रूरत है, लेकिन आज दोपहर मैं इस लिनक्स टेस्ट मशीन पर इस सामान को आजमाउंगा! –