Một trong những cách dễ nhất để tăng khả năng đáp ứng của máy chủ và bảo vệ chống lại lỗi hết bộ nhớ (Out Of Memory) trong các ứng dụng là thêm một số dung lượng swap. Trong hướng dẫn này, Chúng ta sẽ đề cập đến cách thêm tệp Swap vào máy chủ Ubuntu 18.04 (có thể áp dụng với các phiên bản ubuntu khác).
Mặc dù swap thường được khuyến nghị cho các hệ thống HDD truyền thống, sử dụng swap với SSD có thể gây ra sự cố với phần cứng xuống cấp theo thời gian. Do sự cân nhắc này, tôi không khuyên bạn nên bật swap trên bất kỳ nhà cung cấp cloud nào khác sử dụng bộ lưu trữ SSD. Làm như vậy có thể ảnh hưởng đến độ tin cậy của phần cứng bên dưới.
Swap là gì?
Swap là một khu vực trên ổ cứng đã được chỉ định là nơi hệ điều hành có thể lưu trữ tạm thời dữ liệu mà nó không còn có thể giữ trong RAM. Về cơ bản, điều này cung cấp cho bạn khả năng tăng lượng thông tin mà máy chủ của bạn có thể lưu trong bộ nhớ làm việc của nó, với một số cảnh báo. Không gian swap trên ổ cứng sẽ được sử dụng chủ yếu khi không còn đủ dung lượng trong RAM để chứa dữ liệu ứng dụng đang sử dụng.
Thông tin ghi vào đĩa sẽ chậm hơn đáng kể so với thông tin được lưu trong RAM, nhưng hệ điều hành sẽ thích giữ dữ liệu ứng dụng chạy trong bộ nhớ và sử dụng swap cho dữ liệu cũ hơn. Nhìn chung, việc có không gian Swap là dự phòng khi RAM của hệ thống bị cạn kiệt có thể là một cách an toàn tốt chống lại các trường hợp ngoại lệ ngoài bộ nhớ trên các hệ thống có bộ nhớ không có SSD.
Kiểm tra hệ thống để biết thông tin Swap
Trước khi bắt đầu, Chúng ta có thể kiểm tra xem hệ thống đã có sẵn dung lượng swap chưa. Có thể có nhiều tệp Swap hoặc phân vùng swap, nhưng nói chung một tệp là đủ.
Chúng ta có thể xem hệ thống có bất kỳ swap được cấu hình nào không bằng cách gõ:
sudo swapon --show
Nếu bạn không nhận lại bất kỳ đầu ra nào, điều này có nghĩa là hệ thống của bạn hiện không có không gian Swap.
Bạn có thể xác minh rằng không có swap hoạt động bằng cách sử dụng tool free
:
free -h
Output total used free shared buff/cache available Mem: 488M 36M 104M 652K 348M 426M Swap: 0B 0B 0B
Như bạn có thể thấy trong hàng đầu ra của Swap, đầu ra, không có swap nào được kích hoạt trên hệ thống.
Kiểm tra dung lượng trống trên phân vùng ổ cứng
Cách phân bổ không gian phổ biến nhất để swap là sử dụng một phân vùng riêng dành cho nhiệm vụ. Tuy nhiên, việc thay đổi sơ đồ phân vùng không phải lúc nào cũng có thể. Chúng ta có thể dễ dàng tạo một tệp Swap nằm trên một phân vùng hiện có.
Trước khi thực hiện việc này, chúng ta nên kiểm tra mức sử dụng ổ đĩa hiện tại bằng cách gõ:
df -h
OutputFilesystem Size Used Avail Use% Mounted on udev 238M 0 238M 0% /dev tmpfs 49M 624K 49M 2% /run /dev/vda1 20G 1.1G 18G 6% / tmpfs 245M 0 245M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 245M 0 245M 0% /sys/fs/cgroup tmpfs 49M 0 49M 0% /run/user/1001
Thiết bị dưới /dev
là đĩa của chúng ta trong trường hợp này. Chúng ta có nhiều không gian có sẵn trong ví dụ này (chỉ sử dụng 1.1G). Cách sử dụng của bạn có thể sẽ khác nhau.
Mặc dù có nhiều ý kiến về kích thước phù hợp của không gian Swap, nhưng nó thực sự phụ thuộc vào sở thích cá nhân và yêu cầu ứng dụng của bạn. Nói chung, một lượng bằng hoặc gấp đôi dung lượng RAM trên hệ thống của bạn là điểm khởi đầu tốt. Một nguyên tắc tốt khác là mọi thứ trên 4G có thể không cần thiết nếu bạn chỉ sử dụng nó làm dự phòng RAM.
Tạo một tập tin Swap
Bây giờ chúng ta đã biết dung lượng ổ cứng có sẵn, chúng ta có thể tạo một tệp Swap trong hệ thống tệp của mình. Chúng ta sẽ tạo một tệp có kích thước Swap mà Chúng ta muốn gọi swapfile
trong thư mục gốc (/).
Cách tốt nhất để tạo một tập tin swap là với chương trình fallocate
. Lệnh này tạo ra một tệp có kích thước preallocated ngay lập tức.
Vì máy chủ trong ví dụ của chúng ta có 512MB RAM, chúng ta sẽ tạo tệp 1 Gigabyte trong hướng dẫn này. Điều chỉnh điều này để đáp ứng nhu cầu của máy chủ của riêng bạn:
sudo fallocate -l 1G /swapfile
Chúng ta có thể xác minh rằng lượng không gian chính xác đã được bảo lưu bằng cách nhập:
ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
Tập tin của Chúng ta đã được tạo với số lượng không gian chính xác được đặt sang một bên.
Kích hoạt tệp Swap
Bây giờ chúng ta có một tệp có kích thước chính xác có sẵn, chúng ta cần thực sự biến nó thành không gian Swap.
Trước tiên, chúng ta cần khóa các quyền của tệp để chỉ những người dùng có đặc quyền root
mới có thể đọc nội dung. Điều này ngăn người dùng bình thường có thể truy cập tệp, điều này có ý nghĩa bảo mật quan trọng.
Làm cho tập tin chỉ có thể truy cập root
bằng cách gõ:
sudo chmod 600 /swapfile
Xác nhận thay đổi quyền bằng cách nhập:
ls -lh /swapfile
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Như bạn có thể thấy, chỉ người dùng root mới có cờ đọc và ghi.
Bây giờ chúng ta có thể đánh dấu tệp là không gian Swap bằng cách gõ:
sudo mkswap /swapfile
Output Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
Sau khi đánh dấu tệp, Chúng ta có thể kích hoạt tệp Swap, cho phép hệ thống của Chúng ta bắt đầu sử dụng tệp:
sudo swapon /swapfile
Chúng ta có thể xác minh rằng swap có sẵn bằng cách gõ:
sudo swapon --show
Output NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -1
Chúng ta có thể kiểm tra đầu ra free
một lần nữa để chứng thực những thay đổi của chúng ta:
free -h
Output total used free shared buff/cache available Mem: 488M 37M 96M 652K 354M 425M Swap: 1.0G 0B 1.0G
Swap của chúng ta đã được thiết lập thành công và hệ điều hành của Chúng ta sẽ bắt đầu sử dụng nó khi cần thiết.
Làm cho tập tin Swap vĩnh viễn
Những thay đổi gần đây của chúng ta đã kích hoạt tệp Swap cho phiên hiện tại. Tuy nhiên, nếu chúng ta khởi động lại, máy chủ sẽ không tự động giữ lại các cài đặt swap. Chúng ta có thể thay đổi điều này bằng cách thêm tệp Swap vào tệp /etc/fstab
.
Sao lưu /etc/fstab
tệp trong trường hợp có lỗi xảy ra:
sudo cp /etc/fstab /etc/fstab.bak
Bạn có thể thêm thông tin tệp Swap vào cuối tệp /etc/fstab
bằng cách nhập:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Tinh chỉnh cài đặt Swap của bạn
Có một vài tùy chọn mà bạn có thể định cấu hình sẽ có tác động đến hiệu suất hệ thống của bạn khi xử lý swap.
Điều chỉnh thuộc tính Swappiness
Các điều chỉnh swappiness
cấu hình thông số mức độ thường xuyên hệ thống của bạn sử dụng Swap dữ liệu trên RAM vào không gian Swap. Đây là một giá trị từ 0 đến 100 đại diện cho tỷ lệ phần trăm.
Với các giá trị gần bằng 0, kernel sẽ không swap dữ liệu vào đĩa trừ khi thực sự cần thiết. Hãy nhớ rằng, các tương tác với tập tin Swap là những thứ đắt đỏ, vì chúng mất nhiều thời gian hơn so với tương tác với RAM và chúng có thể làm giảm hiệu suất đáng kể. Nói rằng hệ thống không phụ thuộc nhiều vào swap thường sẽ làm cho hệ thống của bạn nhanh hơn.
Các giá trị gần hơn 100 sẽ cố gắng đưa thêm dữ liệu vào swap trong nỗ lực giữ nhiều không gian RAM hơn. Tùy thuộc vào bộ nhớ của ứng dụng của bạn hoặc những gì bạn đang sử dụng máy chủ của mình, điều này có thể tốt hơn trong một số trường hợp.
Chúng ta có thể thấy giá trị swap hiện tại bằng cách gõ:
cat /proc/sys/vm/swappiness
Output60
Đối với máy tính để bàn, cài đặt swappiness 60 không phải là một giá trị xấu. Đối với một máy chủ, bạn có thể muốn di chuyển nó gần hơn đến 0.
Chúng ta có thể đặt swappiness thành một giá trị khác bằng cách sử dụng lệnh sysctl
.
Chẳng hạn, để đặt swappiness thành 10, chúng ta có thể gõ:
sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
Cài đặt này sẽ tồn tại cho đến lần khởi động lại tiếp theo. Chúng ta có thể tự động đặt giá trị này khi khởi động lại bằng cách thêm dòng vào tệp /etc/sysctl.conf
của mình:
sudo nano /etc/sysctl.conf
Ở phía dưới, bạn có thể thêm: /etc/sysctl.conf
vm.swappiness=10
Lưu và đóng tệp khi bạn hoàn thành.
Điều chỉnh cài đặt áp suất bộ đệm
Một giá trị liên quan khác mà bạn có thể muốn sửa đổi là vfs_cache_pressure
. Cài đặt này định cấu hình hệ thống sẽ chọn bao nhiêu để lưu trữ thông tin inode và thông tin trên các dữ liệu khác.
Về cơ bản, đây là dữ liệu truy cập về hệ thống tập tin. Điều này thường rất tốn kém để tra cứu và rất thường xuyên được yêu cầu, vì vậy đây là một điều tuyệt vời cho hệ thống của bạn để lưu trữ. Bạn có thể thấy giá trị hiện tại bằng cách truy vấn lại proc
hệ thống tập tin:
cat /proc/sys/vm/vfs_cache_pressure
Output100
Vì hiện tại nó được cấu hình, hệ thống của Chúng ta loại bỏ thông tin inode khỏi bộ đệm quá nhanh. Chúng ta có thể đặt cài đặt này thành cài đặt thủ công hơn như 50 bằng cách nhập:
sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
Một lần nữa, điều này chỉ hợp lệ cho phiên làm việc hiện tại của chúng ta. Chúng ta có thể thay đổi điều đó bằng cách thêm nó vào tệp cấu hình như chúng ta đã làm với cài đặt swappiness của mình:
sudo nano /etc/sysctl.conf
Ở dưới cùng, thêm dòng chỉ định giá trị mới của bạn: /etc/sysctl.conf
vm.vfs_cache_pressure=50
Lưu và đóng tệp khi bạn hoàn thành.
Phần kết luận
Thực hiện theo các bước trong hướng dẫn này sẽ cung cấp cho bạn một số phòng thở trong trường hợp có thể dẫn đến ngoại lệ hết bộ nhớ (OOM). Swap không gian có thể cực kỳ hữu ích trong việc tránh một số vấn đề phổ biến.
Nếu bạn đang gặp phải lỗi OOM (hết bộ nhớ) hoặc nếu bạn thấy rằng hệ thống của bạn không thể sử dụng các ứng dụng bạn cần, giải pháp tốt nhất là tối ưu hóa cấu hình ứng dụng hoặc nâng cấp máy chủ của bạn.