Thêm ram ảo (swap) trên Ubuntu 18.04

2020/10/16 09:38:25

Cách đơn giản nhất để tránh tràn bộ nhớ là thêm ram ảo (swap) vào máy chủ. Trong bài viết này, ta sẽ tìm hiểu làm sao để thêm ram ảo trên Ubuntu 18/04.

Bộ nhớ ảo/ram ảo/swap là gì?

Để đồng bộ khái niệm, ở đây ta sẽ gọi chung là bộ nhớ swap.

Bộ nhớ swap là một khu vực trên ổ đĩa được thiết kế để lưu trữ giá trị mà RAM không lưu trữ. Nói một cách dễ hiểu, nó cho phép bạn tạo nên một server có nhiều bộ nhớ RAM hơn mà không cần phải nâng cấp cấu hình.

Dữ liệu được lưu trữ trrong ổ đĩa thường có tốc độ truy xuất chậm hơn RAM, nhưng hệ điều hành vẫn sẽ ưu tiên chạy mọi thứ trên RAM và chỉ chuyển dữ laiệu cũ vào bộ nhớ swap.

Tóm lại, sở hữu bộ nhớ swap giúp giải quyết những vấn đề thiếu hụt về RAM khi các chương trình ứng dụng chạy mà không phát sinh lỗi trên các ổ cứng "không-phải-SSD".

Lưu ý: Vì dữ liệu được đọc ghi liên tục vào bộ nhớ swap, do đó, không nên cài đặt bộ nhớ swap trên các ổ đĩa SSD vì sẽ ảnh hưởng đến tuổi thọ của phần cứng.

Các bước thiết lập

Bước 1. Kiểm tra thông tin bộ nhớ swap

Trước khi bắt đầu, ta cần kiểm tra xem hệ thống có chứa chấp bộ nhớ swap nào không. Nếu có rồi thì bạn có thể thêm cái nữa cho nó nhiều nhưng theo khuyến cáo của các chuyên gia, chúng ta chỉ nên có 1 phân vùng swap.

Chúng ta có thể xem những gì hệ thống cấu hình cho bộ nhớ swap bằng cách:

$ sudo swapon --show

Nếu bạn không nhận được kết quả trả về nào thì hiện tại trên hệ thống chưa tồn tại bộ nhớ swap.

Bạn cũng có thể kiểm tra xem có bộ nhớ swap nào đang hoạt động không bằng lệnh.

$ free -h

Kết quả:

              total        used        free      shared  buff/cache   available
Mem:           985M         84M        222M        680K        678M        721M
Swap:            0B          0B          0B

Và kết quả trên cũng thể hiện rằng chưa có bộ nhớ swap nào đang hoạt động.

Bước 2. Kiểm tra dung lượng còn trống của ổ đĩa.

Trước khi tạo phân vùng swap, chúng ta cần kiểm tra xem có đủ bộ nhớ ổ đĩa để tạo thêm một cái nữa không.

df -h

Kết quả

Filesystem      Size  Used Avail Use% Mounted on
udev            481M     0  481M   0% /dev
tmpfs            99M  656K   98M   1% /run
/dev/vda1        25G  1.4G   23G   6% /
tmpfs           493M     0  493M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           493M     0  493M   0% /sys/fs/cgroup
/dev/vda15      105M  3.4M  102M   4% /boot/efi
tmpfs            99M     0   99M   0% /run/user/1000

Để ý cái có dung lượng nhiều nhất /dev/vda1, chúng ta còn có đến 23GB trống lận.

Có nhiều ý kiến về việc phân vùng swap để bao nhiêu dung lượng là đủ, nhưng thực sự thì, nó phụ thuộc vào nhu cầu của bạn và yêu cầu của các chương trình ứng dụng. Nhìn chung, thì phân vùng swap thường bằng hoặc gấp đôi bộ nhớ RAM hiện tại của hệ thống.

Bước 3. Tạo tập tin swap.

Chú ý rằng ở đây ta sẽ tạo một tập tin swap tên là swapfile trong thư mục gốc (root) và cấp dung lượng cho nó.

Ví dụ, ta có 1GB RAM nên ta tạo một tập tin 1 GB.

$ sudo fallocate -l 1G /swapfile

Kiểm tra lại xem tạo đúng chưa.

$ ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile

Vậy là ô kê rồi á.

Bước 4. Kích hoạt tập tin swap.

Ở trên, ta mới chỉ tạo 1 tập tin swap thôi, không khác tập tin bình thường là mấy, nên ở bước tay, ta cần biến nó thành một phân vùng bộ nhớ swap.

Đầu tiên, ta giới hạn quyền hạn cho tập tin swap rằng chỉ có người dùng có quyền root mới được đọc nội dung bên trong. Điều này giúp ngăn người khác truy cập tập tin nhằm đảm bảo an toàn thông tin.

$ sudo chmod 600 /swapfile

Xác nhận lại

$ ls -lh /swapfile
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

Tiếp theo, ta cần đánh dấu tập tin là một phân vùng swap.

$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

Sau đó, chúng ta kích hoạt swap và cho phép hệ thống sử dụng nó.

$ sudo swapon /swapfile

Xác nhận lại

$ sudo swapon --show
NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -2

Đồng thời ta cũng có thể kiểm tra lại bằng lệnh free

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           985M         84M        220M        680K        680M        722M
Swap:          1.0G          0B        1.0G

Vậy là ta đã tạo phân vùng swap thành công, hệ điều hành sẽ bắt đầu sử dụng nó khi cần thiết.

Bước 5. Duy trì tập tin swap lâu dài

Những hành động của chúng ta phía trên chỉ giúp tạo một tập tin swap hoạt động trong phiên làm việc hiện tại. Nói các khác, mọi thứ sẽ biến mất nếu hệ thống khởi động lại (reboot). Do đó, chúng ta cần thêm một số lệnh vào /etc/fstab để chúng có thể thực hiện lúc hệ điều hành khởi động.

Sao lưu lại file /etc/fstab

$ sudo cp /etc/fstab /etc/fstab.bak

Thực hiện lệnh sau để tự động thêm vào cuối file /etc/fstab.

$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Chúng ta có thể kiểm tra kết quả sau khi khởi động lại máy.

Bước 6. Tinh chỉnh cài đặt cho swap.

Có một vài thuộc tính ảnh hưởng đến cách mà bộ nhớ swap hoạt động.

Tinh chỉnh tỉ lệ chuyển đổi swap. (Swappiness Property)

Tỉ lệ chuyển đổi swap mang ý nghĩa "mức độ thường xuyên mà dữ liệu được chuyển từ RAM vào bộ nhớ swap". Giá trị của nó nằm giữa 0 đến 100 phần trăm.

Với giá trị càng gần tới 0, lõi hệ thống sẽ không sử dụng swap trừ khi thực sự cần thiết. (Vì bạn "phải trả giá khá đắt" khi sử dụng bộ nhớ này.

Còn nếu giá trị càng gần với 100, lõi hệ thống sẽ sử dụng bộ nhớ swap càng nhiều càng tốt để giữ cho RAM càng trống nhiều càng tốt. Trong một vài trường hợp, việc cấu hình như vậy có thể đem đến hiệu quả bất ngờ nào đấy.

Chúng ta có thể xem mức độ chuyển đổi bằng lệnh.

$ cat /proc/sys/vm/swappiness
60

Đối với môi trường cá nhân (desktop), 60 không phải là một con số tệ. Nhưng đối với máy chủ, chúng ta nên cho nó càng nhỏ càng tốt.

Ta cài đặt tỉ lệ chuyển đổi bằng lệnh. (Ở đây là sử dụng giá trị là 10)

$ sudo sysctl vm.swappiness=10
vm.swappiness = 10

Việc cài đặt này sẽ được biến mất vào lần khởi động lại tới.

Ta có thể tự động đặt giá trị này bằng cách thêm vào cuối tập tin /etc/sysctl.conf.

$ sudo nano /etc/sysctl.conf

Ở cuối tập tin, ta thêm dòng.

vm.swappiness=10

Lưu và đóng tập tin lại.

Mức độ nhớ đệm (Cache Pressure)

Một thông số khác mà ta cần tinh chỉnh là vfs_cache_pressure. Cái này là cái gì thì mình cũng không rõ nữa. Thôi cứ thêm vào cho chắc.

Xem cấu hình hiện tại.

$ cat /proc/sys/vm/vfs_cache_pressure
100

Đặt cấu hình mới

$ sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50

Tương tự như cái ở trên, ta cũng cần thêm vào /etc/sysctl.conf.

$ sudo nano /etc/sysctl.conf

Ở cuối tập tin thêm dòng sau.

vm.vfs_cache_pressure=50

Lưu vào đóng lại.

Kết luận

Những bước trên giúp ta "dễ thở" hơn khi gặp lỗi tràn bộ nhớ. Phân vùng swap thực sự hữu ích trong việc khắc phục những vấn đề liên quan.

Nhưng dù sao, vì lợi ích lâu dài, cách tốt nhất vẫn là nên nâng cấp máy chủ của bạn.

Quay lại trang chủ