Использование zRam для оптимизации swap процессов

Опубликовано:

Cуть вкратце сводится к тому, что в систему до дискового свопа добавляется сжимаемый налету своп, размещенный в оперативной памяти (коэфициент сжатия при броузинге, если верить автору статьи, доходит до 1:10)
Для современного дистрибутива достаточно сделать

 sudo apt-get install zram-config

И все настраивается автоматически.

:~$ free

 total used free shared buffers cached
 Память: 4038764 3802184 236580 576944 10392 819764
 -/+ буферы/кэш: 2972028 1066736
 Swap: 8429272 236476 8192796

:~$ cat /proc/swaps

 Filename Type Size Used Priority
 /dev/sda7 partition 6409896 229180 -1
 /dev/zram0 partition 1009688 3656 5
 /dev/zram1 partition 1009688 3640 5

Для Debian все чуть сложнее, но как обычно достаточно просто решаемо. Дело в том что модуль zram собран и доступен по умолчанию. В этом легко убедиться выполнив

modprobe -nv zram

Единственное чего я не нашел в Debian так это скрипта автозапуска для этого модуля с передачей ему нужных параметров. (Аналог zram-config в ubuntu) Это не значит что его нет вовсе, но в репозиториях Debian я его отчего то найти не смог. А это значит, что мы напишем этот скрипт сами.

/etc/init.d/zram

 #!/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

  FRACTION=75

  MEMORY=`perl -ne'/^MemTotal:s+(d+)/ && print $1*1024;'  < /proc/meminfo`
  CPUS=`grep -c processor /proc/cpuinfo`
  SIZE=$(( MEMORY * FRACTION / 100 / CPUS ))

  start(){
  param=`modinfo zram|grep num_devices|cut -f2 -d:|tr -d ' '`
  #modprobe zram $param=$CPUS
# load dependency modules
 # kernels 3.4 onwards
 # if ! modprobe zram num_devices=$CPUS
 # kernels 3.1 - 3.3
 if ! modprobe zram $param=$CPUS
then
 echo -e "Your Kernel needs to be compiled with ZRAM support:"
 "nnDevice Drivers --> Staging Drivers --> Compressed RAM block device support (M)"
 "nDevice Drivers --> Staging Drivers --> Dynamic compression of swap pages and clean pagecache pages (*)"
 "nnThe Liquorix Kernel (http://liquorix.net) has ZRAM support built in."
 exit 1
 fi
 echo "zram devices probed successfully"
  for n in `seq $CPUS`;   do
   i=$((n - 1)) 
   echo $SIZE > /sys/block/zram$i/disksize
   mkswap /dev/zram$i
   swapon /dev/zram$i -p 10
   done
   }
 stop(){
   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
   }
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
  stop
  sleep 3
  start
  ;;
  *)
  echo "Usage: `basename $0` (start | stop| restart)"
  exit 1
  ;;
   esac

Как вы можете видеть, у ядер версии выше 3.4 немного изменилась опция указания количества ядер, так что я вписал в скрипт обе, что бы была возможность раскоментировать нужную строку в будущем. Итак теперь остается добавить скрипт в автозагрузку

chmod 755 /etc/init.d/zram
chmod +x /etc/init.d/zram
sudo update-rc.d zram defaults
sudo service zram start

Все теперь мы активировали модуль zram и можем почивать на лаврах.

Понравилась статья, расскажи о ней друзьям, нажми кнопку!