系统相关
首页 > 系统相关> > 使Linux读取交换回内存

使Linux读取交换回内存

作者:互联网

当我运行使用大部分16GB物理内存的应用程序时,Linux内核会从内存中交换掉大多数页面.应用程序完成后,每个操作(键入命令,切换工作区,打开新网页等)都需要很长时间才能完成,因为首先需要从交换中读回相关页面.

有没有办法告诉Linux内核将交换页面复制回物理内存而无需手动触摸(和等待)每个应用程序?我运行了很多应用程序,所以等待总是很痛苦.

我经常使用swapoff -a&& swapon -a使系统再次响应,但这会清除swap中的页面,因此下次运行脚本时需要再次写入.

是否有一个内核接口,可能使用sysfs,指示内核从swap读取所有页面?

编辑:我确实在寻找一种方法来使所有的swap swapcached. (谢谢德罗伯特!)

[附注:
serverfault.com/questions/153946/…serverfault.com/questions/100448/…是相关主题,但没有解决如何让Linux内核在不清除交换的情况下将页面从交换复制回内存的问题.

解决方法:

根据最初发现的memdump program here,我创建了一个脚本,有选择地将指定的应用程序读回内存.记得:

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

用法:类似的东西

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

它会快速跳过非交换内存(每秒千兆字节),并在需要交换时减慢速度.

标签:linux,memory,kernel,swap,sysfs
来源: https://codeday.me/bug/20190808/1623734.html