Enable zRAM as swap in Linux
The problem with swap on SD boot OS, such as Raspberry Pi 4, is slow and increase SD write counts, in fact, SD card is slower than hard disk and expensive. For Raspberry Pi 4, it has 8 GB ram, enough for normal operation, but if don't turn on swap, there is no visibility of current memory usage whether causing memory swapping.
Traditional swap space
Fixed swap partition is rquired if use traditional swap space. Some facts as below
- Fixed swap partition is rquired
- Hard to resize or move
- Waste storage space if it is not using most of time
Loopback device as swap
To have dynamic swap device, create a regular file and make it as loopback block device for swap, is a solution to have no fixed partition. The steps as below.
- Create a file with fixed size using
dd
or some other commands - Create loopback device on newly created file
- Init swap on loopback device using
mkswap
command - Change
/etc/fstab
to point to the new device
Issue as below
- The loopback device needs to be initialized everytime after reboot
File as swap
In fact, swap can be directly created on file as below.
- Create a file with fixed size using
dd
or some other commands - Init swap on file using
mkswap
command - Change
/etc/fstab
to point to the that file
Issue as below
- Still wasting space if swap is not using
- Hard to adjust size
- Manual tasks involved
dphys-swapfile
The dphys-swapfile package can be installed to automate the tasks described above. It is not an entry in /etc/fstab
, but a service.
- Install dphys-swapfile package
- Adjust config in
/etc/dphys-swapfile
- Enable dphys-swapfile service
- Can run
dphys-swapfile <swapon|swapoff>
command
Issue as below
- Still wasting space if swap is not using
zRAM
The zRAM module is installed by default, service is using systemd.
- Check zram module available
modprobe zram
lsmod | grep zram
- Add module and set module options
echo zram > /etc/modules-load.d/zram.conf
echo "options zram num_devices=1" > /etc/modprobe.d/zram.conf
- Create zram0 device when booting by adding following line in
/etc/udev/rules.d/99-zram.rules
KERNEL=="zram0", ATTR{disksize}="512M",TAG+="systemd"
- Create systemd service file
/etc/systemd/system/zram.service
[Unit]
Description=Swap with zram
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/sbin/mkswap /dev/zram0
ExecStart=/sbin/swapon /dev/zram0
ExecStop=/sbin/swapoff /dev/zram0
[Install]
WantedBy=multi-user.target
- Enable service, then reboot
sudo systemctl enable zram
- Check swaps
cat /proc/swaps
swapon -s
Issue with zram
- When memory not enough, then use swap space, but swap uses ram
- It is the same solution as compress ram