অদলবদল স্থান থেকে সমস্ত চলমান অ্যাপ্লিকেশন কীভাবে পুনরায় লোড করবেন?


20

যদি আমার ডেস্কটপটি মেমরির বাইরে চলে যায় এবং প্রচুর পরিমাণে অদলবদল করে তবে আমি আমার র‌্যাম নষ্ট করে দেওয়া অ্যাপ্লিকেশনটি মুক্ত করি বা হত্যা করি। তবে, এর পরে, আমার সমস্ত ডেস্কটপ / অ্যাপ্লিকেশনগুলি অদলবদল হয়ে গেছে এবং মারাত্মক ধীর গতিতে চলছে, আপনি কি আমার ডেস্কটপ / অ্যাপ্লিকেশনগুলিকে "আনসপআপ" (অদলবদল স্থান থেকে পুনরায় লোড) করার কোনও উপায় জানেন?


swapon/ swapoff(বর্তমানে স্বীকৃত উত্তর হিসাবে বোঝা যাচ্ছে) ব্যবহার করে পুরো সিস্টেমটিকে আনপ্প করার পরিবর্তে , আপনি আপনার ডিসপ্লে ম্যানেজার এবং তার সমস্ত শিশুদের প্রক্রিয়া স্মৃতিগুলি (যা স্বেচ্ছাসেবী চাপানোর জন্য) ডাম্প করে আনটপআপ করতে চাইতে পারেন। আরও দেখুন "কিভাবে swap- র জন্য একটি অদলবদল-আউট zsh প্রক্রিয়া বলপূর্বক?" Stackoverflow উপর।
zrajm

উত্তর:


16

আপনার যদি সত্যিই পর্যাপ্ত পরিমাণে র্যাম পাওয়া যায় তবে আপনি এই ক্রমটি (রুট হিসাবে) ব্যবহার করতে পারেন:

$ swapoff -a
$ swapon -a

(আপনার সমস্ত অ্যাপ্লিকেশনগুলির স্পষ্টত সোয়াপ-ইনকে বাধ্য করতে)

(ধরে নিবেন যে আপনি লিনাক্স ব্যবহার করছেন)


আপনি আইআইআরসি না করলেও এটি যতটা সম্ভব ডেটা সরিয়ে ফেলবে। যদিও এটি ক্যাশে ও কো ক্ষতি করতে পারে। এটি কখনও কখনও দরকারী।
ম্যাকিয়েজ পাইচোতকা

19

নিম্নলিখিত দ্রুত এবং নোংরা অজগর স্ক্রিপ্ট stdout একটি প্রক্রিয়া স্মৃতি ডাম্প। এটি কোনও অদলবদল পৃষ্ঠা বা ম্যাপ করা ফাইল লোড করার পার্শ্ব প্রতিক্রিয়া রয়েছে। 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
এটি স্ট্যাক এক্সচেঞ্জে আমি দেখেছি এমন দুর্দান্ততম জিনিসগুলির মধ্যে একটি seriously এই পোস্ট করার জন্য কুডোস! এটি থেকে টানতে অনেকগুলি ভাল ন্যগেটস রয়েছে।
ড্যান

দুর্ভাগ্যক্রমে আমি এই স্ক্রিপ্টটি কাজ করতে সক্ষম হইনি। পাইথন 2 দিয়ে এটি ত্রুটি দেখায় যে r [0] মানটি খুব বড়। অজগর 3 এ (কয়েকটি ছোটখাটো সমস্যা সমাধানের পরে) আমি ওএসআরআর পেয়েছি: [এর্নো 5] ইনপুট / আউটপুট ত্রুটি = মেম_ফাইল.আরড (আর [1] - আর [0]) এবং আমি যে প্রোগ্রামটি এটিকে উভয়ে স্তব্ধ করে দিয়েছি মামলা।
বারটেক 2 এক্স

@ বারটেক্স ২ এক্স আমি দুঃখিত, এই স্ক্রিপ্টটিকে ত্রুটি-প্রমাণ করার জন্য আমার কাছে এখনই সময় নেই। এটি আমার পক্ষে কাজ করে, কমপক্ষে এমন মেশিনে যেগুলিতে খুব বেশি সুরক্ষা বিধিনিষেধ নেই (কৌশলটি কিছু ডিবাগিং ইন্টারফেসগুলি ব্যবহার করে যা শক্ত সেটআপগুলিতে অক্ষম থাকে)। প্রোগ্রামটি সনাক্ত করার সময় স্থগিত করা হয়েছে, এটি আবার চালু করার জন্য এটি একটি সাইনকন্ট ( kill -CONT 1234যেখানে 1234 পিআইডি) প্রেরণ করুন ।
গিলস

@ বারটেক্স ২ এক্স: আমি এখানে পরীক্ষা করে কিছু ত্রুটি যুক্ত করেছি । এটি স্ক্রিপ্টটিকে এমনকি / ডিভ / ড্রাই / কার্ড0 থেকে আইওআরফারিজ এবং [ভিস্কাল] থেকে ওভারফ্লো এরিয়ার্সে কাজ করে। (সমস্যা ক্ষেত্রটি কী ছিল তা এটিও মুদ্রণ করে)।
হ্যাকারব 9

6

কেবল সম্পূর্ণতার জন্য, জিডিবি প্রক্রিয়া চিত্র ডাম্প করতে পারে। আমি এটি পরীক্ষা করে দেখিনি যে এটি এটি আনপাপ করে না, তবে এটি করতে হবে --- পুরো প্রক্রিয়া স্মৃতিটি পড়ার অন্য কোনও উপায় নেই:
gdb -p $mypid
তারপরে
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core


3
gcore $pidgdb এর বাইরেও পাওয়া যায় (একটি ছোট মোড়ক স্ক্রিপ্ট হিসাবে)
টুবু

gcore এর কাছে / dev / নালকে লেখার কোনও উপায় নেই, আপনি যদি কোনও প্রক্রিয়াটিকে মেমোরিতে ফিরিয়ে আনার চেষ্টা করছিলেন তবে আপনি যা চান তা হ'ল core তবে আপনি এটির মতো একটি একক কমান্ডে এটি করতে পারেন: 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/ ড্রপ_ক্যাচের মাধ্যমে


3
অদলবদল মেমরি, সংজ্ঞা অনুসারে, ক্যাশে নয়। ক্যাশে ফেলে দেওয়ার ফলে অদলবদলে কোনও পরিবর্তন হওয়ার খুব কমই সম্ভাবনা। এছাড়াও, প্রোক ফাইল সিস্টেমে সরাসরি ফাইলের উপর লেখার পরিবর্তে সিস্কিটল ব্যবহার করা ভাল। sysctl vm.drop_caches=X। এছাড়াও, সিস্টেলটি সুডো করা সহজ।
জুলিয়ানো

@ জুলিয়ান ভার্চুয়াল মেমরি = ম্যাম + অদলবদল। অ্যাপ্লিকেশন এবং ক্যাশে উভয়ই ভার্চুয়াল মেমরি ব্যবহার করে। তবে আমি মনে করি যে অপ স্পষ্ট সবকিছু করতে হবে কিন্তু , swap 'র থেকে ক্যাশে যেমন আমার সন্দেহ যারা সত্যিই কি তাকে effecting এর হয়।
xenoterracide

@ এক্সেনোটেরাকাইড: ক্যাশে কেবল বাস্তব, র‌্যাম মেমরির মধ্যে অর্থবোধ করে। অদলবদলে ক্যাশে সংরক্ষণ করা অর্থহীন, এগুলি সম্পূর্ণ বিপরীত। যখন সিস্টেমটি শারীরিক র‍্যামে সংক্ষিপ্ত থাকে তখন অদলবদল ধীর মেমরি ব্যবহৃত হয় ; সিস্টেমে প্রচুর অব্যবহৃত শারীরিক র‍্যাম থাকা অবস্থায় ক্যাশে দ্রুত মেমরি ব্যবহৃত হয় ।
জুলিয়ানো

@ জুলিয়ানো হ্যাঁ আমি জানি, তবে আমি বিশ্বাস করি যে তারা উভয়ই ভার্চুয়াল মেমরি ব্যবহার করে সংরক্ষণ করা হয়েছে, যদিও ক্যাশে কেবল র‌্যামে সঞ্চয় করা সম্ভব। সততার সাথে এখানে ক্যাচগুলি ফেলে দেওয়া কোনও অর্থবোধ করে না, তবে।
xenoterracide
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.