नेटवर्किंग डेटा नर्क की स्थिति से नरक
मैं एक नेटवर्किंग क्लाइंट / सर्वर (विंडोज एक्सपी / सी #) को किसी अन्य डेवलपर द्वारा लिखे गए वास्तव में पुराने (एनकोर 32/77) वर्कस्टेशन पर एक समान एप्लिकेशन के साथ काम करने के लिए लिख रहा था।
एप्लिकेशन ने अनिवार्य रूप से क्या किया था, हमारे फैंसी पीसी आधारित मल्टी-मॉनिटर टचस्क्रीन यूआई के साथ सिस्टम को चलाने वाली होस्ट प्रक्रिया को नियंत्रित करने के लिए होस्ट पर कुछ डेटा को साझा / हेरफेर कर रहा था।
इसने 3 स्तरित संरचना के साथ ऐसा किया। संचार प्रक्रिया ने होस्ट से / के लिए डेटा को पढ़ा / लिखा, सभी आवश्यक प्रारूप रूपांतरण (एंडियननेस, फ्लोटिंग पॉइंट फॉर्मेट, आदि) किया और एक डेटाबेस से / के लिए मूल्यों को लिखा / पढ़ा। डेटाबेस ने comms और टचस्क्रीन UI के बीच डेटा मध्यस्थ के रूप में काम किया। टचस्क्रीन यूआई के ऐप ने पीसी पर कितने मॉनिटर संलग्न थे (यह स्वचालित रूप से यह पता चला है) के आधार पर टच स्क्रीन इंटरफेस उत्पन्न किया।
समय सीमा में, मेजबान और हमारे पीसी के बीच मूल्यों का एक पैकेट दिया गया था, जो एक बार में अधिकतम 110 ~ प्रति चक्कर ट्रिप की अधिकतम विलंबता के साथ वायर पर 128 मान भेज सकता था (यूडीपी के बीच एक प्रत्यक्ष एक्स-ओवर ईथरनेट कनेक्शन के साथ उपयोग किया गया था कम्प्यूटर)। तो, संलग्न टचस्क्रीन की चर संख्या के आधार पर अनुमत चर की संख्या सख्त नियंत्रण में थी। इसके अलावा, होस्ट (हालांकि वास्तविक समय कंप्यूटिंग के लिए उपयोग की जाने वाली साझा मेमोरी बस के साथ एक बहुत ही जटिल मल्टी-प्रोसेसर आर्किटेक्चर है) मेरे सेल फोन की प्रसंस्करण शक्ति लगभग 1/100 थी, इसलिए इसे जितना संभव हो उतना कम प्रसंस्करण करने का काम सौंपा गया था और यह सर्वर है / क्लाइंट को यह सुनिश्चित करने के लिए असेंबली में लिखा जाना था (मेजबान एक पूर्ण वास्तविक समय सिमुलेशन चला रहा था जो हमारे कार्यक्रम से प्रभावित नहीं हो सकता)।
मुद्दा था टचस्क्रीन पर बदले जाने पर कुछ मान, सिर्फ नए दर्ज किए गए मूल्य को नहीं लेंगे, बल्कि उस मूल्य और पिछले मूल्य के बीच अनियमित रूप से चक्रित होंगे। वह और केवल कुछ विशिष्ट पृष्ठों पर कुछ विशिष्ट मूल्यों के साथ पृष्ठों के एक निश्चित संयोजन के साथ कभी भी लक्षण का प्रदर्शन होता है। हमने इस मुद्दे को पूरी तरह से याद किया जब तक कि हमने इसे प्रारंभिक ग्राहक स्वीकृति प्रक्रिया के माध्यम से चलाना शुरू नहीं किया
समस्या को सुलझाने के लिए मैंने दोलन मूल्यों में से एक को चुना:
- मैंने टचस्क्रीन ऐप को चेक किया, यह दोलन कर रहा था
- मैंने डेटाबेस की जाँच की, दोलन
- मैंने कॉम्स ऐप की जाँच की, दोलन
फिर मैंने वायरशर्क को तोड़ दिया और पैकेट कैप्चर को मैन्युअल रूप से डिकोड करना शुरू कर दिया। परिणाम:
- ऑसिलेटिंग नहीं, लेकिन पैकेट सही नहीं दिखे, बहुत अधिक डेटा था।
मैंने बिना किसी दोष / त्रुटि का पता लगाए कॉम्स कोड के हर विवरण के माध्यम से सौ बार कदम रखा।
अंत में मैंने अन्य देवों को ईमेल भेजना शुरू कर दिया और विस्तार से पूछा कि उनके अंत ने यह देखने के लिए कैसे काम किया कि क्या कुछ ऐसा है जो मैं गायब था। तब मैंने इसे पाया।
जाहिरा तौर पर, जब उसने डेटा भेजा तो वह ट्रांसमिशन से पहले डेटा की सरणी को फ्लश नहीं करता था, अनिवार्य रूप से, वह सिर्फ पुराने को अधिलेखित करने वाले नए मूल्यों के साथ उपयोग किए गए अंतिम बफर को ओवरराइट कर रहा था, लेकिन पुराने मान अभी भी हस्तांतरित नहीं किए जा रहे हैं।
इसलिए, यदि कोई मान डेटा सरणी 80 की स्थिति में था और अनुरोध किए गए मानों की सूची 80 से कम हो गई थी, लेकिन नई सूची में समान मान सम्मिलित था, तो दोनों मान किसी भी समय उस विशिष्ट बफ़र के लिए डेटा बफ़र में मौजूद होंगे दिया हुआ वक़्त।
डेटाबेस से पढ़ा जा रहा मूल्य उस समय के स्लाइस पर निर्भर करता है जब UI मान का अनुरोध कर रहा था।
फिक्स दर्द सरल था। डेटा बफर पर आने वाली वस्तुओं की संख्या में पढ़ें (यह वास्तव में पैकेट प्रोटोकॉल के हिस्से के रूप में निहित था) और उस आइटम की संख्या से परे बफर को न पढ़ें।
सीख सीखी:
दी गई गणना के लिए आधुनिक कंप्यूटिंग शक्ति न लें। एक समय था जब कंप्यूटर ईथरनेट का समर्थन नहीं करते थे और जब एक सरणी को फ्लश करना महंगा माना जा सकता था। यदि आप वास्तव में यह देखना चाहते हैं कि हम कितनी दूर आ गए हैं, तो एक ऐसी प्रणाली की कल्पना करें जिसका गतिशील मेमोरी आवंटन का कोई रूप नहीं है। IE, कार्यकारी प्रक्रिया को सभी कार्यक्रमों के लिए सभी मेमोरी को पूर्व-आवंटित करना था और कोई भी कार्यक्रम उस सीमा से आगे नहीं बढ़ सकता था। IE, पूरे सिस्टम को पुन: स्थापित किए बिना एक कार्यक्रम के लिए अधिक मेमोरी आवंटित करना एक बड़े पैमाने पर दुर्घटना का कारण बन सकता है। मुझे आश्चर्य है कि अगर लोग किसी दिन एक ही प्रकाश में कचरा संग्रहण दिनों के बारे में बात करेंगे।
कस्टम प्रोटोकॉल के साथ नेटवर्किंग करते समय (या सामान्य रूप से बाइनरी डेटा प्रतिनिधित्व को संभालना) सुनिश्चित करें कि जब तक आप पाइप के पार भेजे जाने वाले प्रत्येक मूल्य के प्रत्येक फ़ंक्शन को नहीं समझ लेते, तब तक आप कल्पना को पढ़ें। मेरा मतलब है, इसे तब तक पढ़ें जब तक आपकी आँखें चोट न करें। लोग व्यक्तिगत बिट्स या बाइट्स में हेरफेर करके डेटा को संभालते हैं और चीजों को करने के बहुत ही चतुर और कुशल तरीके हैं। सबसे नन्हा विस्तार गुम होने से सिस्टम टूट सकता है।
तय करने का कुल समय 2-3 दिनों के साथ था, जब मैंने इससे निराश होकर अन्य चीजों पर काम किया था।
साइडनोट: प्रश्न में होस्ट कंप्यूटर डिफ़ॉल्ट रूप से ईथरनेट का समर्थन नहीं करता था। यह ड्राइव करने के लिए कार्ड कस्टम मेड और रेट्रोफिटेड था और प्रोटोकॉल स्टैक लगभग मौजूद नहीं था। जिस डेवलपर के साथ मैं काम कर रहा था, वह एक प्रोग्रामर का एक नरक था, उसने न केवल यूडीपी का एक छीन लिया गया संस्करण लागू किया और इस परियोजना के लिए सिस्टम पर एक नकली नकली ईथरनेट स्टैक (प्रोसेसर एक पूर्ण ईथरनेट स्टैक को संभालने के लिए पर्याप्त शक्तिशाली नहीं था)। लेकिन उन्होंने इसे एक हफ्ते से भी कम समय में किया। वह मूल परियोजना टीम के नेताओं में से एक थे, जिन्होंने पहले स्थान पर ओएस को डिजाइन और प्रोग्राम किया था। आइए हम कहते हैं, कुछ भी वह कभी भी कंप्यूटर / प्रोग्रामिंग / आर्किटेक्चर के बारे में साझा करना पड़ता था, चाहे कितना भी लंबा हो या कितना भी पहले से नया हो, मैं हर शब्द को सुनता हूं।