Một cách để bảo vệ chống lỗi hết bộ nhớ trong các ứng dụng là thêm một số swap space vào máy chủ của bạn. Trong hướng dẫn này, chúng tôi sẽ giới thiệu cách thêm tệp swap vào máy chủ Ubuntu 20.04.
Swap là một phần dung lượng lưu trữ trên ổ cứng đã được dành riêng cho hệ điều hành để lưu trữ tạm thời dữ liệu mà nó không còn có thể giữ trong RAM. Điều này cho phép bạn tăng lượng thông tin mà máy chủ của bạn có thể lưu giữ trong bộ nhớ làm việc của nó, với một số lưu ý. Swap space 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 được 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ẽ ưu tiên tiếp tục chạy dữ liệu ứng dụng trong bộ nhớ và sử dụng swap cho dữ liệu cũ hơn. Nhìn chung, việc sử dụng swap space làm phương án dự phòng khi RAM của hệ thống cạn kiệt có thể là một mạng lưới an toàn tốt chống lại các trường hợp ngoại lệ hết bộ nhớ trên các hệ thống có sẵn bộ lưu trữ không phải SSD.
Trước khi bắt đầu, chúng ta có thể kiểm tra xem hệ thống đã có sẵn một số swap space chưa. Có thể có nhiều tệp swap hoặc phân vùng swap, nhưng nhìn chung một tệp là đủ.
Chúng ta có thể xem liệu hệ thống có bất kỳ swap được cấu hình nào hay không bằng cách gõ:
- sudo swapon --show
Nếu bạn không nhận được 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ó swap space.
Bạn có thể xác minh rằng không có swap đang hoạt động nào bằng tiện ích free
:
- free -h
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
Như bạn có thể thấy trong hàng Swap của đầu ra, không có swap nào đang hoạt động trên hệ thống.
Trước khi chúng tôi tạo tệp swap của mình, chúng tôi sẽ kiểm tra mức sử dụng đĩa hiện tại của mình để đảm bảo rằng chúng tôi có đủ dung lượng. Làm điều này bằng cách nhập:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000
Thiết bị có /
trong cột Mounted on
là đĩa của chúng ta trong trường hợp này. Chúng tôi có rất nhiều không gian có sẵn trong ví dụ này (chỉ sử dụng 1,4G). Cách sử dụng của bạn có thể sẽ khác.
Mặc dù có nhiều ý kiến về kích thước phù hợp của một swap space, 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, dung 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 nhỏ khác là mọi thứ trên 4G trao đổi có thể là không cần thiết nếu bạn chỉ sử dụng nó làm dự phòng RAM.
Bây giờ chúng tôi đã biết dung lượng ổ cứng khả dụng của mình, chúng tôi có thể tạo một tệp swap trên hệ thống tệp của mình. Chúng tôi sẽ phân bổ một tệp có kích thước mà chúng tôi muốn gọi là swapfile
trong thư mục gốc (/
) của chúng tôi.
Cách tốt nhất để tạo một tệp swap là sử dụng chương trình fallocate
. Lệnh này ngay lập tức tạo một tệp có kích thước được chỉ định.
Vì máy chủ trong ví dụ của chúng tôi có 1G RAM nên chúng tôi sẽ tạo tệp 1G 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 tôi có thể xác minh rằng dung lượng chính xác đã được đặt trước bằng cách nhập:
- ls -lh /swapfile
- -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
Tệp của chúng tôi đã được tạo với dung lượng chính xác được đặt sang một bên.
Bây giờ chúng tôi có sẵn một tệp có kích thước chính xác, chúng tôi thực sự cần biến tệp này thành swap space.
Trước tiên, chúng ta cần khóa quyền của tệp để chỉ người dùng 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 không thể truy cập tệp, điều này sẽ có ý nghĩa bảo mật quan trọng.
Làm cho tệp chỉ có thể truy cập vào root bằng cách gõ:
- sudo chmod 600 /swapfile
Xác minh thay đổi quyền bằng cách gõ:
- ls -lh /swapfile
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Như bạn có thể thấy, chỉ root user mới bật cờ đọc và ghi.
Bây giờ chúng ta có thể đánh dấu tệp là swap space bằng cách nhập:
- sudo mkswap /swapfile
OutputSetting 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 tôi có thể kích hoạt tệp swap, cho phép hệ thống của chúng tôi bắt đầu sử dụng tệp đó:
- sudo swapon /swapfile
Xác minh rằng swap có sẵn bằng cách gõ:
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
Chúng tôi có thể kiểm tra lại đầu ra của tiện ích free
để chứng thực những phát hiện của mình:
- free -h
Output total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi
Swap của chúng tôi đã được thiết lập thành công và hệ điều hành của chúng tôi sẽ bắt đầu sử dụng nó khi cần thiết.
Những thay đổi gần đây của chúng tôi đã kích hoạt tệp swap cho phiên hiện tại. Tuy nhiên, nếu chúng tôi khởi động lại, máy chủ sẽ không tự động giữ lại cài đặt swap. Chúng tôi có thể thay đổi điều này bằng cách thêm tệp swap vào tệp /etc/fstab
của chúng tôi.
Sao lưu tệp /etc/fstab
phòng trường hợp xảy ra sự cố:
- sudo cp /etc/fstab /etc/fstab.bak
Thêm thông tin tệp swap vào cuối tệp /etc/fstab
của bạn bằng cách nhập:
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Tiếp theo, chúng tôi sẽ xem xét một số cài đặt mà chúng tôi có thể cập nhật để điều chỉnh swap space của mình.
Có một số tùy chọn mà bạn có thể thiết lập cấu hình sẽ ảnh hưởng đến hiệu suất hệ thống của bạn khi xử lý trao đổi.
Tham số swappiness
thiết lập cấu hình tần suất hệ thống của bạn hoán đổi dữ liệu từ RAM sang swap space. Đây là một giá trị từ 0 đến 100 đại diện cho một tỷ lệ phần trăm.
Với các giá trị gần bằng 0, kernel sẽ không hoán đổi dữ liệu sang đĩ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 swap là "expensive" ở chỗ 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 đáng kể hiệu suất. Yêu cầu 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 100 sẽ cố gắng đưa nhiều dữ liệu hơn vào swap nhằm nỗ lực giữ thêm dung lượng RAM trống. Tùy thuộc vào cấu hình bộ nhớ của ứng dụng hoặc mục đích bạn đang sử dụng máy chủ, đ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ị swappiness 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 là 60 không phải là một giá trị tồi. Đối với máy chủ, bạn có thể muốn di chuyển nó về gần 0 hơn.
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
- vm.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 tôi có thể đặt giá trị này tự động khi khởi động lại bằng cách thêm dòng vào tệp /etc/sysctl.conf
của chúng tôi:
- sudo nano /etc/sysctl.conf
Ở dưới cùng, bạn có thể thêm:
vm.swappiness=10
Lưu và đóng tệp khi bạn hoàn tất.
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 thiết lập cấu hình số lượng hệ thống sẽ chọn để lưu trữ thông tin inode và dentry trên 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à được yêu cầu rất thường xuyên, do đó, đây là một điều tuyệt vời để hệ thống của bạn lưu vào bộ đệm. Bạn có thể thấy giá trị hiện tại bằng cách truy vấn lại hệ thống tệp proc
:
- cat /proc/sys/vm/vfs_cache_pressure
Output100
Vì nó hiện được thiết lập cấu hình, hệ thống của chúng tôi xóa thông tin inode khỏi bộ đệm quá nhanh. Chúng tôi có thể đặt cài đặt này thành cài đặt thận trọ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 hiện tại của chúng tôi. Chúng tôi có thể thay đổi điều đó bằng cách thêm nó vào tệp cấu hình của mình giống như chúng tôi đã 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:
vm.vfs_cache_pressure=50
Lưu và đóng tệp khi bạn hoàn tất.
Thực hiện theo các bước trong hướng dẫn này sẽ giúp bạn dễ thở hơn trong các trường hợp nếu không sẽ dẫn đến ngoại lệ hết bộ nhớ. Swap space có thể cực kỳ hữu ích trong việc tránh một số vấn đề phổ biến này.
Nếu bạn đang gặp phải lỗi OOM (out of memory - hết bộ nhớ) hoặc nếu bạn thấy rằng hệ thống của mình không thể sử dụng các ứng dụng bạn cần, thì 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.