स्वैप विभाजन का परीक्षण कैसे करें


23

मैं एक हेडलेस सर्वर पर कुछ यादृच्छिक segfaults का निदान करने की कोशिश कर रहा हूं और एक चीज जो उत्सुक लगती है, वह यह है कि वे केवल स्मृति दबाव में होते हैं और मेरे स्वैप का आकार 0 से ऊपर नहीं जाएगा।

मैं अपनी मशीन को स्वैप करने के लिए कैसे सुनिश्चित कर सकता हूं कि यह ठीक से काम कर रहा है?

orca ~ # free
             total       used       free     shared    buffers     cached
Mem:       1551140    1472392      78748          0     333920    1046368
-/+ buffers/cache:      92104    1459036
Swap:      1060280          0    1060280

orca ~ # swapon -s
Filename                                Type            Size    Used    Priority
/dev/sdb2                               partition       1060280 0       -1

क्या kern.logसेगफ़ॉल्ट के समय कोई संदेश है ? के बारे में एक संदेश oom-killerयह दर्शाता है कि आपके सिस्टम में पर्याप्त वर्चुअल मेमोरी नहीं है, जिसका अर्थ यह हो सकता है कि स्वैप का उपयोग नहीं किया जा रहा है। क्या यह एक वर्चुअलाइज्ड सर्वर (और किस तरह का) है?
गिल्स एसओ- बुराई को रोकना '

लॉग में कोई ओम-किलर प्रविष्टियाँ नहीं हैं, जैसे segfault at 54 ip b7619ba8 sp bf9c3380 error 4मैं सोच रहा हूँ कि यह एक हार्डवेयर समस्या है जो नीचे ट्रैक करने के लिए एक दर्द होने वाला है। यह डुअल ऐथलॉन MP 2000+ प्रोसेसर और 1.5GB रैम वाला फिजिकल सर्वर है। यह संकलन के दौरान काफी स्थिर लेकिन अलग-अलग चलता है।
joshperry

1
खैर, यह पता चला कि मामले के प्रशंसकों को प्लग नहीं किया गया था, जिसमें समस्याएं पैदा हो रही थीं जब सर्वर कुछ भी प्रोसेसर को गहन करना शुरू कर देगा, जिससे यह ज़्यादा गरम हो जाएगा।
joshperry

जवाबों:


30

क्या यह linux है? यदि ऐसा है तो आप निम्नलिखित प्रयास कर सकते हैं:

# sysctl vm.swappiness=100

और फिर या तो एक प्रोग्राम (एस) का उपयोग करें जो बहुत सारे रैम का उपयोग करता है या एक छोटा अनुप्रयोग लिखता है जो सिर्फ राम खाता है। निम्नलिखित ऐसा करेंगे (स्रोत: http://www.linuxatemyram.com/play.html ):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1024*1024);
        mb++;
        printf("Allocated %d MB\n", mb);
        sleep(1);
    }      
return 0;
}

मैंने नींद को जोड़ा (1) ताकि आप प्रक्रियाओं को देखने के लिए अधिक समय दे सकें क्योंकि यह राम और अदला-बदली करती है। जब आप RAM और SWAP से बाहर निकलते हैं, तो OOM किलर को इसे मार देना चाहिए। आप इसे संकलित कर सकते हैं

gcc filename.c -o memeater

फ़ाइल नाम। वह फ़ाइल है जिसमें आप उपरोक्त प्रोग्राम को सहेजते हैं। फिर आप इसे ./emeater के साथ चला सकते हैं।

मैं ऐसा किसी प्रोडक्शन मशीन पर नहीं करूंगा।


धन्यवाद, कि अच्छी तरह से काम करने के लिए स्मृति और गमागमन शुरू करते हैं। मुझे लगता है कि मेरे segfaults कुछ और के कारण होते हैं ... शायद हार्डवेयर: /
joshperry

लिनक्स के लिए, यह /proc/self/oom_score_adjसुनिश्चित करने के लिए लिखना शुरू करना उपयोगी हो सकता है कि यह सबसे अधिक संभावना वाला OOM- हत्यारा शिकार है ...
Gert van den Berg

2
<unistd.h>नींद के लिए शामिल करने की आवश्यकता है , अन्यथा यह एक चेतावनी फेंकता हैwarning: implicit declaration of function ‘sleep’;
देबंजन बसु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.