Raspberry Pi 效能改善 – 使用 ZRAM
「少年,你渴望力量嗎?」
「不,我渴望記憶體!」
對於一個小型的網站來說,使用 Raspberry Pi 作為伺服器,其實是一個相當方便的練習對象,因為它實在是很便宜,你可以一次買下 2 塊 Raspberry Pi,一台當作 Production 機器,一台用來做各種實驗;完全不用擔心硬體不同有時後會造成麻煩。
但是(嘆氣),它的記憶體實在是太小了… 1 GB 的記憶體實在不適合跑太複雜的網站(像是 WordPress)
為什麼不使用 SWAP
為了解決這個問題,我們可以使用 SWAP 換置記憶體,來維持記憶體,像是下面這樣:
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/mmcblk0p3 partition 442364 239380 -2
但是我們要解決的並不單純是記憶體容量的問題,而是流暢度的問題。使用 SD 卡當作 SWAP 只會消耗更多,原本就很吃緊的 I/O 資源。
OK,那為什麼 ZRAM 會比較好?
zram, formerly called compcache, is a Linux kernel module for creating a compressed block device in RAM, i.e. a RAM disk, but with on-the-fly “disk” compression.
根據 Wiki 上的敘述, ZRAM 是一種 RAM Disk 工具,會即時壓縮放進去的資料,來節省記憶體消耗。以我們的情況來說,把一些比較少用的資料壓縮起來,可能比透過緩慢又短命的 SD 卡,來的更加有效率。
我們要做的是:使用 ZRAM 做出一個壓縮過的記憶體空間,然後配合 SWAP 機制,把暫時不會用到的程式,通通放到 ZRAM 之中壓縮起來。
逐步設定
首先檢查一下 zram
核心模駔有沒有載入
$ sudo lsmod | grep zram
zram 32768 1
如果沒有的話就使用 modprobe
將它載入(如果出現錯誤訊息的話,你可能需要重編譯 Kernel)
$ sudo modprobe zram
接下來確認沒有使用中的 ZRAM
$ zramctl
(應該是空的)
設定 ZRAM 大小(先用 free
查出記憶體大小,然後乘 1024)
$ free -k
total used free shared buff/cache available
Mem: 934788 532312 85336 93268 317140 218832
$ echo $(( 934788 * 1024 )) | sudo tee /sys/block/zram0/disksize
957222912
建立 SWAP
$ sudo mkswap /dev/zram0
Setting up swapspace version 1, size = 912.9 MiB (957218816 bytes)
no label, UUID=ac05098f-124b-4aa7-bf9a-e91e6132a2b5
啟用剛才建立的 SWAP(這邊使用 -p 10
參數是為了優先使用 ZRAM)
sudo swapon -p 10 /dev/zram0
成功!
$ free -h
total used free shared buff/cache available
Mem: 912M 442M 76M 83M 393M 298M
Swap: 1.3G 237M 1.1G
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/zram0 partition 934784 160952 10
開機自動設定
首先建立一個 Script,把建立 ZRAM 這件事情打包成一個檔案,放在 /usr/local/sbin/zram_setup.sh
。
#!/bin/bash
memsize=free | grep -e "^Mem:" | awk '{print $2}'
echo $(( $memsize * 1024 )) | sudo tee /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 10 /dev/zram0
為了在每次開機時都能自動設定,我們要在 Systemd 裡面設定一個服務,放在 /etc/systemd/system/zram_setup.service
。
[Service]
Type=simple
ExecStart=/usr/local/sbin/zram_setup.sh
[Install]
WantedBy=default.target
然後,為了確保每次都會自動載入 zram
模組,請編輯 /etc/modules
,加入以下的文字:
zram
重新載入 Systemd 模組
sudo systemctl daemon-reload
試著啟動看看:
sudo systemctl start zram_setup.service
檢查一下結果:
➜ ~ sudo systemctl status zram_setup.service
● zram_setup.service
Loaded: loaded (/etc/systemd/system/zram_setup.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Jun 25 20:51:02 VPC systemd[1]: Started zram_setup.service.
Jun 25 20:51:02 VPC sudo[1627]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/tee /sys/block/zram0/disksize
Jun 25 20:51:02 VPC sudo[1627]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 25 20:51:02 VPC zram_setup.sh[1617]: 3147227136
Jun 25 20:51:02 VPC sudo[1627]: pam_unix(sudo:session): session closed for user root
Jun 25 20:51:02 VPC zram_setup.sh[1617]: Setting up swapspace version 1, size = 3 GiB (3147223040 bytes)
Jun 25 20:51:02 VPC zram_setup.sh[1617]: no label, UUID=2778a31a-a747-4139-8d28-c44ecf98d82b
➜ ~ cat /proc/swaps
Filename Type Size Used Priority
/dev/zram0 partition 3073460 0 10
沒問題的話就設定成自動啟動
➜ ~ sudo systemctl enable zram_setup.service
Created symlink from /etc/systemd/system/default.target.wants/zram_setup.service to /etc/systemd/system/zram_setup.service.