如何正确设置 zram 和 swap

如何正确设置 zram 和 swap

我正在配置和编译新的 3.0 内核。我计划使用一段时间(通过修补)并合并到 3.0 中的好东西之一是 zram。

是否可以同时设置 hdd 交换和 zram 交换,以便首先使用 zram 并且仅将溢出的页面放入实际交换中?

答案1

swapon-p设置优先级的开关。我可以设置:

swapon -p 32767 /dev/zram0
swapon -p 0 /dev/my-lvm-volume/swap

或者在 /etc/fstab 中:

/dev/zram0              none swap sw,pri=32767 0 0
/dev/my-lvm-volume/swap none swap sw,pri=0     0 0

编辑:只是为了完整的解决方案 - 这样的行可能会作为 udev 规则有所帮助:

KERNEL=="zram0", ACTION=="add", ATTR{disksize}="1073741824", RUN="/sbin/mkswap /$root/$name"

答案2

旁注:由于每个 cpu 锁定,因此重要的是与 CPU 数量一样多的 zram 交换(modprobe zram_num_devices=n zram) 而不是一个大的。实时调频!

答案3

由于某种原因,似乎有很多误解https://www.kernel.org/doc/Documentation/blockdev/zram.txt

它明确指出:

2) 设置压缩流的最大数量
无论传递给该属性的值如何,ZRAM 将始终分配多个压缩流(每个在线 CPU 一个),从而允许多个并发压缩操作。当某些 CPU 离线时,分配的压缩流数量会减少。不再有单压缩流模式,除非您正在运行 UP 系统或只有 1 个 CPU 在线。

要了解当前有多少个流可用:

cat /sys/block/zram0/max_comp_streams

但有一个普遍且持久的城市神话:最大流量为 1。

这显然不是真的。

zram 已证明 Chrome 操作系统和 Android 两种操作系统在单一设备上有效。他们还调整了page-cluster

page-cluster控制单次尝试从交换区读入连续页的页数。这是页面缓存预读的交换对应项。
提到的连续性不是指虚拟/物理地址,而是交换空间上的连续性——这意味着它们被一起交换出去。

它是一个对数值 - 将其设置为零表示“1 页”,将其设置为 1 表示“2 页”,将其设置为 2 表示“4 页”等。零会完全禁用交换预读。

默认值为三(一次八页)。如果您的工作负载是交换密集型的,则将其调整为不同的值可能会带来一些小好处。

较低的值意味着初始故障的延迟较低,但同时会出现额外的故障和后续故障的 I/O 延迟(如果它们是预读的连续页的一部分)。

                - 从内核文档/proc/sys/vm/*

所以使用echo "0" > /proc/sys/vm/page-cluster强制单页。

大部分内容似乎源自 debian/ubuntu 软件包的 zram_config,由于某种原因,该软件包似乎与 zram 的内核文档几乎没有相关性,并且产生了一系列本质上可能完全错误的中文谣言。

通过文件交换,您是否为每个核心创建一个交换驱动器?也许这可以回答你的问题。另外,为了支持这一点,谷歌的 Chrome 操作系统和 Android 成功地与上述页面集群一起使用,因为它与磁盘不匹配,因此可以改善单个设备的延迟。

另外,对于系统管理员来说,实际内存使用情况或虚拟机内存使用情况有何重要意义?大多数示例显示通过 disk_size 创建并完全忽略 mem_limit。 disk_size=未压缩的虚拟机大小。 mem_limit=实际内存占用空间限制。

它使 disk_size 选择变得令人困惑,因为它的虚拟最大大小取决于 comp_alg 比率以及不使用时磁盘大小的 0.1% 的开销,并且实际上是节俭与 mem_limit *(大约 2 - 4)的猜测乐观。

zram_config 甚至不检查以前的服务使用情况并进行覆盖,而对 zram sys 类进行简单检查(如下所示)即可。

createZramSwaps () {
        totalmem=$(free|awk '/^Mem:/{print $2}')
        mem=$((( totalmem * MEM_FACTOR / 100 / BIG_CORES ) * 1024))

        # Check Zram Class created
        ZRAM_SYS_DIR='/sys/class/zram-control'
        if [ ! -d "${ZRAM_SYS_DIR}" ]; then
                modprobe zram
                RAM_DEV='0'
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        else
                RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        fi

        if [ "$BIG_CORES" -gt 1 ];then
                for i in $(seq $((BIG_CORES - 1))); do
                        RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                        echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                        echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                        mkswap /dev/zram${RAM_DEV}
                        swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
                done
        fi
}

答案4

当您启用zram时,它将自动具有优先权。

对于 ubuntu 16.04:/usr/bin/init-zram-swapping

您可以编辑该文件(首先进行备份),为了降低使用的真实内存,我将 mem 行更改为:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))

相关内容