2009-05-07 11 views
6

हमारी सेवा हमारे क्लाइंट के सर्वर पर रात के दौरान सोती है, और उसके बाद जागने में मुश्किल होती है। ऐसा लगता है कि प्रक्रिया ढेर, जो कभी-कभी कई सैकड़ों एमबी है, को स्वैप फ़ाइल में ले जाया जाता है। यह रात में होता है, जब हमारी सेवा का उपयोग नहीं किया जाता है, और अन्य चलाने के लिए निर्धारित होते हैं (डीबी बैकअप, एवी स्कैन इत्यादि)। जब ऐसा होता है, निष्क्रियता के कुछ घंटों के बाद सेवा के लिए पहली कॉल कुछ मिनट तक लगती है (परिणामी कॉल सेकंड लेते हैं)।स्वैप फ़ाइल में डुबकी से भारी प्रक्रिया को रोकना

मुझे यकीन है कि यह वर्चुअल मेमोरी प्रबंधन का मुद्दा है, और मैं वास्तव में ओएस को भौतिक स्मृति में हमारी सेवा रखने के लिए मजबूर करने के विचार से नफरत करता हूं। मुझे पता है कि सर्वर पर अन्य प्रक्रियाओं को नुकसान पहुंचाएगा, और समग्र सर्वर थ्रूपुट कम करेगा। ऐसा करने के बाद, हमारे ग्राहक सिर्फ हमारे ऐप को उत्तरदायी होना चाहते हैं। अगर रात की नौकरियां अधिक समय लेती हैं तो उन्हें परवाह नहीं है।

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

मुझे इस तरह की समस्या के लिए कोई टिप्पणी, सिफारिशें और सामान्य समाधान सुनना अच्छा लगेगा। सेवा वीसी2005 में लिखी गई है और विंडोज सर्वर पर चलता है।

उत्तर

8

जैसा कि आपने बताया है, ऐप को मेमोरी में रहने के लिए मजबूर करना मशीन पर संसाधनों को साझा करने का सबसे अच्छा तरीका नहीं है। एक त्वरित समाधान जो आपको मिल सकता है जो अच्छी तरह से काम करता है वह केवल उस कार्यक्रम को शेड्यूल करना है जो आपके ग्राहकों द्वारा इसका उपयोग शुरू करने से पहले प्रत्येक दिन एक विशिष्ट समय पर आपकी सेवा को जगाता है। आप इसे एक साधारण स्क्रिप्ट या EXE कॉल के साथ विंडोज़ कार्य शेड्यूलर में बस शेड्यूल कर सकते हैं।

0

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

+0

यह सच होगा अगर केवल मेरी सेवा सर्वर पर चल रही हो। हालांकि, यह एक वेब सर्वर, डेटाबेस, एंटीवायरस और अन्य सेवाएं भी चलाता है। पेज फ़ाइल की आवश्यकता को खत्म करने के लिए प्रत्येक प्रक्रिया के लिए 4 जीबी की आवश्यकता होगी, है ना? ऐसा कहकर, अधिक रैम जोड़ना एक अच्छा समाधान है, लेकिन यह ग्राहक पर निर्भर है, और मैं एक बार विकास नौकरी की तलाश में हूं जो कई ग्राहकों को अधिक पैसा खर्च करने के लिए मजबूर नहीं करेगा। – eran

+0

"पृष्ठ फ़ाइल की आवश्यकता को खत्म करने के लिए प्रत्येक प्रक्रिया के लिए 4 जीबी की आवश्यकता होगी, है ना?" जैसा कि मैं इसे समझता हूं। 32-बिट विंडोज़ के लिए, 4 जीबी सब कुछ के लिए ग्रैंड कुल है, और यदि आप सभी चार गीगाबाइट प्राप्त करते हैं तो आप भाग्यशाली हैं। उदाहरण के लिए, इस मशीन में 4 जीबी की भौतिक मेमोरी है, लेकिन कार्यक्रमों के लिए केवल 2.75 जीबी उपलब्ध है, क्योंकि अन्य सामान पता स्थान खाते हैं। – kquinn

+1

लेकिन प्रत्येक प्रक्रिया को अपना/4 जीबी पता स्थान मिलता है (कर्नेल जो भी लेता है उसे गिनता नहीं है), इसलिए यदि आपके पास 30 प्रक्रियाएं हैं तो उनमें से प्रत्येक 1 जीबी रैम का उपयोग कर सकती है और बस इसमें से अधिकतर इसे बदल दिया गया है, इस मामले में आप अभी भी पेज फ़ाइल को अक्षम करने की सिफारिश करने के लिए पृष्ठ फ़ाइल की आवश्यकता है ... –

1

आपकी सेवा एक धागा चलाने के लिए एक तीसरा दृष्टिकोण हो सकता है जो काउंटर को बढ़ाने की तरह कुछ छोटा करता है और फिर काफी लंबी अवधि के लिए सोता है, 10 सेकंड कहें। थियोस के अन्य अनुप्रयोगों पर कम से कम प्रभाव होना चाहिए, लेकिन कम से कम अपने कुछ पेज उपलब्ध रखें।

+0

मुझे लगता है कि यह उन पृष्ठों को रखेगा जो कोड के इस टुकड़े को स्मृति में रखते हैं, लेकिन ढेर अभी भी बदल दिया जाएगा। चूंकि ढेर से अधिक स्मृति का उपयोग किया जाता है, इसलिए समस्या शायद इसके हिस्से पर है। मैं काउंटर को बढ़ाने के बजाय ढेर चल सकता था, लेकिन इसका न्यूनतम प्रभाव नहीं होगा ... – eran

2

मैं यह नहीं कह रहा हूं कि आप ऐसा करना चाहते हैं, या यह सर्वोत्तम अभ्यास है, लेकिन आप पाते हैं कि यह आपके लिए काफी अच्छा काम करता है। ऐसा लगता है कि आपने जो पूछा है उससे मेल खाता है।

सारांश: नियमित रूप से एक समय में, पृष्ठ पर प्रक्रिया में प्रत्येक पृष्ठ को स्पर्श करें।

पृष्ठभूमि में चलने वाले धागे के बारे में क्या है और हर एन सेकंड में एक बार उठता है। प्रत्येक बार जब पृष्ठ उठता है, तो यह पता एक्स से पढ़ने का प्रयास करता है। यदि आप एक बुरा पता पढ़ते हैं तो प्रयास अपवाद हैंडलर से सुरक्षित होता है। फिर एक पृष्ठ के आकार से एक्स बढ़ाएं।

4 जीबी में 65536 पृष्ठ, 3 जीबी में 49152 पेज, 2 जीबी में 32768 पेज हैं। अपने निष्क्रिय समय (रातोंरात मृत समय) को विभाजित करें कि आप प्रत्येक पृष्ठ को कितनी बार मारना चाहते हैं (प्रयास)।

BYTE *ptr; 

ptr = NULL; 
while(TRUE) 
{ 
    __try 
    { 
     BYTE b; 

     b = *ptr; 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
     // ignore, some pages won't be accessible 
    } 

    ptr += sizeofVMPage; 

    Sleep(N * 1000); 
} 

आप GetSystemInfo से लौटे परिणाम में dwPageSize मूल्य से sizeOfVMPage मूल्य प्राप्त कर सकते हैं()।

अपवाद हैंडलर से बचने की कोशिश न करें अगर (!IsBadReadPtr (पीआरटी)) क्योंकि ऐप में अन्य थ्रेड एक ही समय में स्मृति सुरक्षा को संशोधित कर सकते हैं। यदि आप इस वजह से अनस्टक हो जाते हैं तो यह पहचानना लगभग असंभव होगा कि क्यों (यह संभवतः एक गैर-दोहराने योग्य दौड़ की स्थिति होगी), इसलिए इसके साथ समय बर्बाद न करें।

बेशक, आप दिन के दौरान इस धागे को बंद करना चाहते हैं और केवल अपने मृत समय के दौरान इसे चलाने के लिए चाहते हैं।

1

यह सुनिश्चित करने के लिए दूसरी बात यह है कि आपका डेटा स्थानीयकृत है।

दूसरे शब्दों में: क्या आपको कुछ भी करने से पहले स्मृति के सभी 300 एमआईबी की ज़रूरत है? क्या आपके द्वारा उपयोग की जाने वाली डेटा संरचनाओं को पुन: व्यवस्थित किया जा सकता है ताकि कोई विशेष अनुरोध केवल कुछ मेगाबाइट से संतुष्ट हो सके?

उदाहरण

  • अगर ढेर स्मृति के अपने 300 MiB चेहरे की पहचान के लिए डेटा शामिल

    । क्या डेटा आंतरिक रूप से व्यवस्थित किया जा सकता है ताकि नर और मादा चेहरा डेटा एक साथ संग्रहीत किया जा सके? या बड़े-नोस छोटे नाक से अलग हैं?

  • यदि इसमें कुछ प्रकार की तार्किक संरचना है तो इसे हल किया जा सकता है? ताकि बहुत से पृष्ठों को छोड़ने के लिए एक द्विआधारी खोज का उपयोग किया जा सके?

  • यदि यह एक प्रोप्रायटरी, इन-मेमोरी, डेटाबेस इंजन है, तो डेटा को बेहतर इंडेक्स/क्लस्टर किया जा सकता है ताकि बहुत मेमोरी पेज हिट की आवश्यकता न हो?

  • यदि वे छवि बनावट हैं, तो आमतौर पर बनावट बनाम एक-दूसरे के पास स्थित हो सकती हैं?

क्या आपको कुछ भी करने से पहले स्मृति के सभी 300 एमआईबी की ज़रूरत है? आप बिना सभी के बिना सेवा अनुरोध नहीं कर सकते हैं कि डेटा मेमोरी में वापस है?


अन्यथा: इसे उठाने के लिए 6 ᴀᴍ पर निर्धारित कार्य।

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