修复了stop时提示顺序异常的问题
原版地址:https://wiki.debian.org/ZRam
FRACTION改为200%.
因为zram.txt提示压缩率的期望是50%
所以应该zram的大小应该为物理内存的200%,而非小于物理内存
但如果存储的数据对象压缩率极端不可预测,新版Linux内核的zram也是支持限制占用内存大小(mem_limit文件)
但如果您的配置文件中没有mem_limit,数据存储的压缩率又极端不可预测,则只能设置一个小于内存总容量的zram了
另外,实际情况下zram的出现低于50%的压缩率也是很常见的,但考虑到内存中还有一些压缩效果不佳的页面会拉高压缩率,所以我觉得仍应该期望压缩率为50%.
注:在本文中压缩率越低表示压缩效果越好
Tue Sep 6 17:33:27 CST 2016 更新:
增加了compact
compact的用法就是执行Debian Wiki的操作步骤后用命令:"service zram compact"来调用即可(已不适用于Debian Stretch)
"zram compact" 这样直接调用就好,记得像Debian Wiki上说的一样加上执行权限
compact的作用是通过重新排列内存中数据来降低内存碎片,增加连续的可用空间
zram(zsmalloc)的compact则通过重新排列自己的数据避免因不恰当的碎片浪费内存空间
此外如果使用zram不建议开启任何其它swap设备,如果zram实在不够用,那么您应该启动zswap配合传统swap,而非使用zram
理由是如果直接让zram和普通swap设备一起使用,会出现LRU倒置的情况
值得注意的是zswap在写缓存未填满时就会因为大量reject_compress_poor(还有其它各种原因的拒绝存储)导致写缓存远未填满就大量读写后端swap设备
如果被zswap拒绝的页面是热页面,就会类似于zram的LRU倒置.
所以zram能满足需要的情况下我不推荐使用zswap.
单独使用zram应该把swappiness设置为100
https://lists.ubuntu.com/archives/lubun ... 05831.html
Letting the swappiness at default (60) or even set it higher to 100
would help avoid this bottleneck as swapping early would avoid
RAM running full too fast.
然而在只开启zram作为交换设备的情况下,swappiness=100(较早交换冷页面)的副作用微乎其微,并不存在交换到外部设备那样的可怕延迟Setting swappiness higher here would be also only work until ZRAM is
filled and than would lead to bottleneck 1 again.
而如果swappiness=1之类,当发生交换时因为没能提前进行冷页面交换,交换过度集中,即使是在内存中完成,也有相当可怕的延迟
swappiness=100的另一个好处系统可以通过压缩内存中的冷页面来更少的抛弃高价值页缓存.
并且也只应该在单纯开启zram的情况下开启它,否则因为上述的LRU倒置的问题,应该使用zswap+普通swap设备
脚本里注释掉的行是我不确定应该怎么做的部分
此脚本的更多描述见2楼
代码: 全选
#!/bin/sh
### BEGIN INIT INFO
# Provides: zram
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 1 6
# Short-Description: Use compressed RAM as in-memory swap
# Description: Use compressed RAM as in-memory swap
### END INIT INFO
# Author: Antonio Galea <antonio.galea@gmail.com>
# Thanks to Przemysław Tomczyk for suggesting swapoff parallelization
# Distributed under the GPL version 3 or above, see terms at
# https://gnu.org/licenses/gpl-3.0.txt
FRACTION=200
MEMORY=`perl -ne'/^MemTotal:\s+(\d+)/ && print $1*1024;' </proc/meminfo`
#CPUS=`grep -c processor /proc/cpuinfo`
#swap_cache_pressure=29
#max_swap_priority=32767
#CPUS=$swap_cache_pressure
CPUS=1
SIZE=$(( MEMORY * FRACTION / 100 / CPUS ))
case "$1" in
"start")
echo 100 >/proc/sys/vm/swappiness
echo 0 >/proc/sys/vm/page-cluster
echo 0 >/proc/sys/vm/extfrag_threshold
echo 1 >/proc/sys/vm/watermark_scale_factor
#echo 1 > /sys/kernel/mm/ksm/run
param=`modinfo zram|grep num_devices|cut -f2 -d:|tr -d ' '`
modprobe zram $param=$CPUS
for n in `seq $CPUS`; do
i=$((n - 1))
#echo 2 >/sys/block/zram$i/max_comp_streams
#echo $2 >/sys/block/zram$i/comp_algorithm
echo deflate >/sys/block/zram$i/comp_algorithm
echo $SIZE >/sys/block/zram$i/disksize
echo 0 >/sys/block/zram$i/queue/read_ahead_kb
echo 2 >/sys/block/zram$i/queue/nomerges
echo 2 >/sys/block/zram$i/queue/rq_affinity
mkswap /dev/zram$i
swapon -p 10 /dev/zram$i
#swapon /dev/zram$i -d -p $((max_swap_priority-i))
done
#echo 32767 >/proc/sys/vm/vfs_cache_pressure
echo 1 >/proc/sys/vm/compact_memory
#echo 0 >/proc/sys/vm/min_free_kbytes
#echo 1 >/proc/sys/vm/lowmem_reserve_ratio
#echo 0 >/proc/sys/vm/admin_reserve_kbytes
;;
"stop")
echo 60 >/proc/sys/vm/swappiness
echo 3 >/proc/sys/vm/page-cluster
echo 500 >/proc/sys/vm/extfrag_threshold
echo 10 >/proc/sys/vm/watermark_scale_factor
#echo 0 > /sys/kernel/mm/ksm/run
#echo 100 >/proc/sys/vm/vfs_cache_pressure
#echo 42980 >/proc/sys/vm/min_free_kbytes
#echo 256 >/proc/sys/vm/lowmem_reserve_ratio
#echo 8192 >/proc/sys/vm/admin_reserve_kbytes
for n in `seq $CPUS`; do
i=$((n - 1))
swapoff /dev/zram$i && echo "disabled disk $n of $CPUS"
done
wait
sleep .5
modprobe -r zram
;;
"compact")
for n in `seq $CPUS`; do
i=$((n - 1))
echo 1 >/sys/block/zram$i/compact
done
echo 1 >/proc/sys/vm/compact_memory
;;
*)
echo "Usage: `basename $0` (start | stop | compact)"
exit 1
;;
esac