GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memuat ulang semua aplikasi yang sedang berjalan dari ruang swap ke dalam RAM?

Skrip python cepat-dan-kotor berikut membuang memori proses ke stdout. Ini memiliki efek samping memuat halaman yang ditukar atau file yang dipetakan. Sebut saja sebagai cat_proc_mem 123 456 789 di mana argumennya adalah ID proses.

Skrip ini sepenuhnya khusus untuk Linux. Ini mungkin dapat diadaptasi ke sistem lain dengan /proc yang serupa structure (Solaris?), tetapi lupakan tentang menjalankannya di mis. *BSD. Bahkan di Linux, Anda mungkin perlu mengubah definisi c_pid_t dan nilai PTRACE_ATTACH dan PTRACE_DETACH . Ini adalah skrip proof-of-principle, tidak dimaksudkan sebagai contoh praktik pemrograman yang baik. Gunakan dengan risiko Anda sendiri.

Linux membuat memori suatu proses tersedia sebagai /proc/$pid/mem . Hanya rentang alamat tertentu yang dapat dibaca. Kisaran ini dapat ditemukan dengan membaca informasi pemetaan memori dari file teks /proc/$pid/maps . File palsu /proc/$pid/mem tidak dapat dibaca oleh semua proses yang memiliki izin untuk membacanya:proses pembaca harus memanggil 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)

Lihat juga informasi lebih lanjut tentang /proc/$pid/mem .

unswap () {
  cat_proc_mem "[email protected]" >/dev/null
}

Jika Anda benar-benar memiliki cukup RAM lagi, Anda dapat menggunakan urutan ini (sebagai root):

$ swapoff -a
$ swapon -a

(untuk memaksa swap-in eksplisit semua aplikasi Anda)

(dengan asumsi Anda menggunakan linux)


Hanya untuk kelengkapan, GDB dapat membuang gambar proses. Saya tidak memeriksa apakah itu membatalkan pertukarannya, tetapi harus --- tidak ada cara lain untuk membaca seluruh memori proses:
gdb -p $mypid
diikuti oleh
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core


Linux
  1. Cara Menambahkan Ruang Swap di Ubuntu 22.04

  2. Bagaimana cara menambahkan ruang swap di linux

  3. Bagaimana cara menempelkan ke nano dari clipboard?

  1. Pengantar ruang swap pada sistem Linux

  2. Cara Membuat Atau Menambah Ruang Swap Di Linux

  3. Seberapa besar seharusnya partisi swap?

  1. Cara Menambahkan Ruang Swap di Debian 11

  2. Cara menambah ruang swap di Linux

  3. Bagaimana Cara Mengalokasikan Lebih Banyak Ruang untuk Bertukar dan Meningkatkan Ukurannya Lebih Besar dari Ram?