web-dev-qa-db-ja.com

実行中のすべてのアプリケーションをスワップ領域からRAMに再ロードする方法は?

デスクトップでメモリが不足し、頻繁にスワップする場合、RAMを浪費しているアプリケーションを解放または強制終了します。しかし、その後、すべてのデスクトップ/アプリケーションがスワップされてひどく遅いのですが、私のデスクトップ/アプリケーションを「スワップ解除」(スワップ領域からRAMにリロード)する方法を知っていますか?

20
profy

本当に十分なRAMが再び利用できる場合は、このシーケンスを(ルートとして)使用できます:

$ swapoff -a
$ swapon -a

(すべてのアプリケーションの明示的なスワップインを強制するため)

(Linuxを使用していると想定)

16
maxschlepzig

次のクイックアンドダーティpythonスクリプトは、プロセスのメモリをstdoutにダンプします。これには、スワップアウトされたページまたはマップされたファイルをロードするという副作用があります。これを_cat_proc_mem 123 456 789_として呼び出します。ここで、引数はプロセスIDです。

このスクリプトは完全にLinuxに固有です。同様の_/proc_構造(Solaris?)を持つ他のシステムに適応可能かもしれませんが、それを実行することを忘れてください。 * BSD。 Linuxでも、_c_pid_t_の定義と、_PTRACE_ATTACH_および_PTRACE_DETACH_の値を変更する必要がある場合があります。これは原理を証明するスクリプトであり、優れたプログラミング手法の例を示すものではありません。自己責任。

Linuxは、プロセスのメモリを_/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
}
_

完全を期すために、GDBはプロセスイメージをダンプできます。スワップが解除されることを確認しませんでしたが、プロセスメモリ全体を読み取る方法は他にありません。
gdb -p $mypid
に続く
(gdb) gcore /tmp/myprocess-core
Saved corefile /tmp/myprocess-core

7
przemek

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 経由

0
Mark McKinstry