रैम में स्वैप स्पेस से सभी रनिंग एप्लिकेशन को फिर से कैसे लोड करें?


20

यदि मेरा डेस्कटॉप मेमोरी से बाहर चला जाता है और बहुत स्वैप हो जाता है तो मैं अपनी रैम को बर्बाद करने वाले एप्लिकेशन को मुफ्त या मार देता हूं। लेकिन, उसके बाद, मेरे सभी डेस्कटॉप / एप्लिकेशन को स्वैप किया गया है और बहुत धीमी गति से हो रहा है, क्या आपको "अनस्वाप" (रैम में स्वैप स्पेस से पुनः लोड) मेरे डेस्कटॉप / एप्लिकेशन का एक तरीका पता है?


का उपयोग करके पूरे सिस्टम को अनवाप करने के बजाय swapon/ / swapoff(वर्तमान में स्वीकृत जवाब के रूप में सुझाव देता है), आप अपने डिस्प्ले मैनेजर और उसके सभी बच्चों को उनकी प्रक्रिया की यादों (जो अनसैप्सिंग को मजबूर करते हैं) को डंप करने से अनसैप करना चाह सकते हैं। यह भी देखें "कैसे में स्वैप करने के लिए एक बदली-आउट zsh प्रक्रिया के लिए मजबूर करने?" Stackoverflow पर।
zrajm

जवाबों:


16

यदि आपके पास वास्तव में पर्याप्त रैम उपलब्ध है तो आप इस अनुक्रम का उपयोग कर सकते हैं (रूट के रूप में):

$ swapoff -a
$ swapon -a

(अपने सभी अनुप्रयोगों के स्पष्ट स्वैप-इन को लागू करने के लिए)

(यह मानते हुए कि आप लिनक्स का उपयोग कर रहे हैं)


यहां तक ​​कि अगर आप IIRC नहीं करते हैं, तो यह जितना संभव हो उतना डेटा स्थानांतरित करेगा। जबकि यह कैश और सह को नुकसान पहुंचा सकता है। यह कभी-कभी उपयोगी होता है।
मैकीज पीचोटका

19

निम्नलिखित त्वरित और गंदे अजगर स्क्रिप्ट एक प्रक्रिया की स्मृति को रोक देती है। यह किसी भी स्वैप किए गए पृष्ठ या मैप की गई फ़ाइल को लोड करने का दुष्प्रभाव है। इसे उस तरह से कॉल करें cat_proc_mem 123 456 789जहां तर्क प्रक्रिया आईडी हैं।

यह स्क्रिप्ट पूरी तरह से लिनक्स के लिए विशिष्ट है। यह एक समान /procसंरचना (सोलारिस?) के साथ अन्य प्रणालियों के लिए अनुकूल हो सकता है , लेकिन इसे * बीएसडी पर चलाने के बारे में भूल जाएं। यहां तक कि लिनक्स पर, आप की परिभाषा को बदलने की आवश्यकता हो सकती है c_pid_tऔर के मूल्यों PTRACE_ATTACHऔर PTRACE_DETACH। यह एक प्रूफ-ऑफ-थ्योरी स्क्रिप्ट है, जिसका अर्थ अच्छी प्रोग्रामिंग प्रथाओं के उदाहरण के रूप में नहीं है। अपने जोखिम पार इस्तेमाल करें।

लिनक्स एक प्रक्रिया की स्मृति को उपलब्ध कराता है /proc/$pid/mem। केवल कुछ पता रेंज पठनीय हैं। इन सीमाओं को पाठ फ़ाइल से मेमोरी मैपिंग जानकारी को पढ़कर पाया जा सकता है /proc/$pid/maps। छद्म फ़ाइल /proc/$pid/memको उन सभी प्रक्रियाओं द्वारा नहीं पढ़ा जा सकता है, जिन्हें इसे पढ़ने की अनुमति है: पाठक प्रक्रिया को बुलाया जाना चाहिए ptrace(PTRACE_ATTACH, $pid)

#!/usr/bin/env python
import ctypes, re, sys

## Partial interface to ptrace(2), only for PTRACE_ATTACH and PTRACE_DETACH.
c_ptrace = ctypes.CDLL("libc.so.6").ptrace
c_pid_t = ctypes.c_int32 # This assumes pid_t is int32_t
c_ptrace.argtypes = [ctypes.c_int, c_pid_t, ctypes.c_void_p, ctypes.c_void_p]
def ptrace(attach, pid):
    op = ctypes.c_int(16 if attach else 17) #PTRACE_ATTACH or PTRACE_DETACH
    c_pid = c_pid_t(pid)
    null = ctypes.c_void_p()
    err = c_ptrace(op, c_pid, null, null)
    if err != 0: raise SysError, 'ptrace', err

## Parse a line in /proc/$pid/maps. Return the boundaries of the chunk
## the read permission character.
def maps_line_range(line):
    m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
    return [int(m.group(1), 16), int(m.group(2), 16), m.group(3)]

## Dump the readable chunks of memory mapped by a process
def cat_proc_mem(pid):
    ## Apparently we need to ptrace(PTRACE_ATTACH, $pid) to read /proc/$pid/mem
    ptrace(True, int(pid))
    ## Read the memory maps to see what address ranges are readable
    maps_file = open("/proc/" + pid + "/maps", 'r')
    ranges = map(maps_line_range, maps_file.readlines())
    maps_file.close()
    ## Read the readable mapped ranges
    mem_file = open("/proc/" + pid + "/mem", 'r', 0)
    for r in ranges:
        if r[2] == 'r':
            mem_file.seek(r[0])
            chunk = mem_file.read(r[1] - r[0])
            print chunk,
    mem_file.close()
    ## Cleanup
    ptrace(False, int(pid))

if __name__ == "__main__":
    for pid in sys.argv[1:]:
        cat_proc_mem(pid)

पर/proc/$pid/mem भी अधिक जानकारी देखें ।

unswap () {
  cat_proc_mem "$@" >/dev/null
}

2
यह गंभीरता से सबसे अच्छे चीजों में से एक है जिसे मैंने स्टैक एक्सचेंज पर कभी देखा है। इस पोस्टिंग के लिए यश! इससे खींचने के लिए कई अच्छे डला हैं।
डैन

बेवजह मैं इस स्क्रिप्ट को काम करने में सक्षम नहीं था। अजगर 2 के साथ यह त्रुटि दिखाता है कि मूल्य r [0] बहुत बड़ा है। अजगर 3 पर (कुछ मामूली मुद्दों को ठीक करने के बाद) मुझे OSError मिलती है: [Errno 5] इनपुट / आउटपुट त्रुटि chunk = mem_file.read (r [1] - r [0]) और प्रोग्राम ने दोनों में हैंग होने पर इसका इस्तेमाल किया। मामलों।
barteks2x

@ Barteks2x मुझे क्षमा करें, इस स्क्रिप्ट को त्रुटि-प्रूफ बनाने के लिए मेरे पास अभी समय नहीं है। यह मेरे लिए काम करता है, कम से कम मशीनों पर जिनके पास बहुत अधिक सुरक्षा प्रतिबंध नहीं हैं (तकनीक कुछ डिबगिंग इंटरफेस का उपयोग करती है जो कठोर सेटअप पर अक्षम हैं)। इसे ट्रेस किए जाने के दौरान प्रोग्राम को निलंबित कर दिया गया है, इसे kill -CONT 1234फिर से शुरू करने के लिए इसे एक SIGCONT ( जहां 1234 PID है) भेजें ।
गिल्स एसओ- बुराई को रोकना '

@ Barteks2x: मैंने यहाँ कुछ त्रुटि जाँच जोड़ी है । यह स्क्रिप्ट को I /Errors पर भी / dev / dri / card0 और OverflowErrors से [vsyscall] बनाता है। (यह भी बताता है कि समस्या क्षेत्र क्या था)।
हैकरबी

6

पूर्णता के लिए, GDB प्रक्रिया छवि को डंप कर सकता है। मैंने जांच नहीं की कि यह इसे खोल देता है, लेकिन इसके लिए --- पूरी प्रक्रिया मेमोरी पढ़ने का कोई अन्य तरीका नहीं है:
gdb -p $mypid
इसके बाद
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core


3
gcore $pidgdb के बाहर भी उपलब्ध है (एक छोटे आवरण की लिपि के रूप में)
तोबू

gcore के पास / dev / null को लिखने का कोई तरीका नहीं है, यदि आप स्मृति में वापस प्रक्रिया को लागू करने की कोशिश कर रहे हैं तो आप क्या चाहते हैं। हालाँकि, आप इसे एक ही कमांड में कर सकते हैं जैसे: gdb --batch -p $pid -ex "gcore /dev/null" 2>/dev/null
Hackerb9

0

swapon / swapoff आपके स्वैप स्थान को पूरी तरह से साफ़ कर देगा, लेकिन आप इसे / proc फ़ाइल सिस्टम के माध्यम से भी मुक्त कर सकते हैं। आप पहले वाला चाहते हैं:

# To free pagecache
echo 1 > /proc/sys/vm/drop_caches

# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches

# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches

http://linux-mm.org/Drop_Caches के माध्यम से


3
स्वैप मेमोरी है, परिभाषा के अनुसार, कैश नहीं। स्वैप में कुछ भी बदलने के लिए कैश को छोड़ने की संभावना बहुत कम है। इसके अलावा, खरीद फाइल सिस्टम में फाइलों पर सीधे लिखने के बजाय sysctl का उपयोग करना बेहतर होता है। sysctl vm.drop_caches=X। इसके अलावा, sysctl sudo के लिए आसान है।
पीटर

@ जूलियन वर्चुअल मेमोरी = ram + swap iirc। एप्लिकेशन और कैश दोनों वर्चुअल मेमोरी का उपयोग करते हैं। हालांकि मुझे लगता है कि ऑप को सब कुछ साफ करने की जरूरत है लेकिन स्वैप से कैश है, क्योंकि मुझे संदेह है कि वास्तव में वे क्या प्रभाव डाल रहे हैं।
xenoterracide

@xenoterracide: कैश केवल वास्तविक, रैम मेमोरी में समझ में आता है। स्वैप में कैश स्टोर करना व्यर्थ है, वे पूर्ण विपरीत हैं। भौतिक रैम पर सिस्टम की कमी होने पर स्वैप धीमी मेमोरी का उपयोग किया जाता है ; कैश तेज मेमोरी है जिसका उपयोग तब किया जाता है जब सिस्टम में अप्रयुक्त भौतिक रैम हो
जूलियानो

@ जुलियानो हां मुझे पता है, लेकिन मेरा मानना ​​है कि वे दोनों वर्चुअल मेमोरी का उपयोग करके संग्रहीत हैं, हालांकि यह संभव है कि कैश केवल रैम में संग्रहीत हो। ईमानदारी से कैश छोड़ने से यहाँ कोई मतलब नहीं है, इमो।
xenoterracide
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.