Quản lý không gian hoán đổi swap trong Linux

Tác giả sysadmin, T.M.Hai 28, 2022, 02:05:16 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Quản lý không gian hoán đổi swap trong Linux


Không gian hoán đổi là một vùng đĩa được sử dụng để lưu trữ bộ nhớ. Ở đây chúng ta sẽ xem xét việc quản lý không gian hoán đổi trong Linux bằng cách xác định cái gì đang thực sự sử dụng không gian hoán đổi, kiểm soát tần suất ghi vào không gian hoán đổi và cuối cùng là bổ sung thêm không gian hoán đổi nếu cần.

1. Sử dụng không gian hoán đổi là gì?

Có một vài điều chúng ta có thể làm để kiểm tra bộ nhớ và mức sử dụng hoán đổi của mình, tuy nhiên, việc xem những gì thực sự sử dụng không gian hoán đổi lại là một câu hỏi khác.

Công cụ yêu thích của tôi để nhận loại thông tin này là 'smem'.

Trước tiên, chúng tôi sẽ cài đặt smem trong máy chủ CentOS 7 của chúng tôi, máy chủ này đến từ kho lưu trữ EPEL.

Mã nguồn [Chọn]
[root@centos7 ~]# yum install epel-release -y

[root@centos7 ~]# yum install smem -y

Gói smem cũng có sẵn để cài đặt trong các bản phân phối Linux dựa trên Debian.

Mã nguồn [Chọn]
root@debian8:~# apt-get install smem -y
Bây giờ chúng ta có thể sử dụng smem, thứ sẽ cho chúng ta biết lượng không gian trao đổi mà các quy trình của chúng ta đang sử dụng.

Mã nguồn [Chọn]
[root@centos7 ~]# smem -p -t
  PID User     Command                         Swap      USS      PSS      RSS
  896 root     /sbin/agetty --noclear tty1    0.00%    0.00%    0.00%    0.02%
  889 root     /usr/sbin/irqbalance --fore    0.00%    0.01%    0.01%    0.03%
 2699 apache   /usr/sbin/httpd -DFOREGROUN    0.00%    0.00%    0.01%    0.09%
 2703 apache   /usr/sbin/httpd -DFOREGROUN    0.00%    0.00%    0.01%    0.10%
 2704 apache   /usr/sbin/httpd -DFOREGROUN    0.00%    0.00%    0.01%    0.10%
 2702 apache   /usr/sbin/httpd -DFOREGROUN    0.00%    0.01%    0.01%    0.10%
  855 root     /sbin/auditd -n                0.00%    0.01%    0.02%    0.05%
  892 root     /usr/sbin/crond -n             0.00%    0.02%    0.02%    0.04%
  890 root     /usr/lib/systemd/systemd-lo    0.00%    0.02%    0.02%    0.04%
 2700 apache   /usr/sbin/httpd -DFOREGROUN    0.00%    0.01%    0.02%    0.13%
  881 dbus     /bin/dbus-daemon --system -    0.00%    0.02%    0.02%    0.05%
 1153 root     /usr/sbin/wpa_supplicant -u    0.00%    0.02%    0.03%    0.07%
 2701 apache   /usr/sbin/httpd -DFOREGROUN    0.00%    0.01%    0.03%    0.14%
 2608 root     /usr/libexec/postfix/master    0.00%    0.03%    0.03%    0.06%
 1461 root     /usr/sbin/sshd -D              0.00%    0.02%    0.03%    0.09%
 2636 root     -bash                          0.00%    0.03%    0.04%    0.06%
 2898 postfix  pickup -l -t unix -u           0.00%    0.03%    0.04%    0.10%
 2611 postfix  qmgr -l -t unix -u             0.00%    0.03%    0.04%    0.10%
  725 root     /usr/lib/systemd/systemd-jo    0.00%    0.03%    0.05%    0.09%
 2632 root     sshd: root@pts/0               0.00%    0.06%    0.07%    0.15%
 2698 root     /usr/sbin/httpd -DFOREGROUN    0.00%    0.06%    0.08%    0.22%
  753 root     /usr/lib/systemd/systemd-ud    0.00%    0.08%    0.09%    0.11%
  742 root     /usr/sbin/lvmetad -f           0.00%    0.09%    0.09%    0.12%
  880 root     /usr/sbin/rsyslogd -n          0.00%    0.10%    0.11%    0.15%
  950 root     /usr/sbin/NetworkManager --    0.00%    0.11%    0.14%    0.21%
    1 root     /usr/lib/systemd/systemd --    0.00%    0.15%    0.15%    0.18%
 3126 root     python /usr/bin/smem -p -t     0.00%    0.17%    0.18%    0.23%
 1154 polkitd  /usr/lib/polkit-1/polkitd -    0.00%    0.25%    0.27%    0.34%
 1462 root     /usr/bin/python -Es /usr/sb    0.00%    0.28%    0.32%    0.42%
 1273 root     /sbin/dhclient -d -q -sf /u    0.00%    0.35%    0.35%    0.41%
  891 root     /usr/bin/python -Es /usr/sb    0.00%    0.45%    0.49%    0.60%
-------------------------------------------------------------------------------
   31 5                                       0.00%    2.48%    2.81%    4.61%

Trong ví dụ này, toàn bộ cột hoán đổi là 0 vì hiện tại chúng tôi không sử dụng cột nào. Ở đây, chúng tôi sử dụng tùy chọn -t để hiển thị tổng số ở dưới cùng và tùy chọn -p để hiển thị mức sử dụng không gian hoán đổi dưới dạng phần trăm.

Chúng ta cũng có thể sử dụng cờ -u để xem người dùng nào đang sử dụng bộ nhớ và không gian trao đổi trên hệ thống Linux.

Mã nguồn [Chọn]
[root@centos7 ~]# smem -p -t -u
User     Count     Swap      USS      PSS      RSS
dbus         1    0.00%    0.02%    0.02%    0.05%
postfix      2    0.00%    0.06%    0.08%    0.20%
apache       6    0.00%    0.04%    0.10%    0.65%
polkitd      1    0.00%    0.25%    0.27%    0.34%
root        21    0.00%    2.15%    2.37%    3.41%
---------------------------------------------------

Nếu chúng tôi cài đặt gói python-matplotlib thì chúng tôi có thể tạo các thanh biểu đồ và hình tròn về việc sử dụng hoán đổi cho mục đích báo cáo, hãy kiểm tra các tùy chọn --pie và --bar trong trang hướng dẫn để biết thêm thông tin về điều này.

Bây giờ chúng ta đã có ý tưởng về những gì thực sự sử dụng không gian hoán đổi, có một vài điều chúng ta có thể làm. Chúng tôi có thể điều tra các quy trình cụ thể và xác nhận xem chúng có cần chạy hay không, đồng thời điều tra thêm bất kỳ cài đặt cấu hình cụ thể nào của ứng dụng cụ thể vì chúng tôi có thể sửa đổi phân bổ bộ nhớ chẳng hạn. Chúng tôi cũng có thể nâng cấp máy chủ bằng cách bổ sung thêm bộ nhớ nếu cần để không cần sử dụng không gian trao đổi.

Nếu không thể thực hiện các tùy chọn này, chúng tôi cũng có thể giảm tần suất sử dụng không gian hoán đổi.

2. Sửa đổi khả năng hoán đổi

Chúng ta có thể đặt tính hoán đổi, đây là tham số thời gian chạy kernel xác định tần suất sử dụng hoán đổi.

Giá trị hoán đổi là một tham số nhân có thể được đặt trong khoảng từ 0 đến 100. Giá trị càng thấp, nhân càng ít có khả năng sử dụng hoán đổi. Giá trị càng cao, càng có nhiều khả năng kernel sẽ cố gắng sử dụng trao đổi. Ví dụ: đặt tính hoán đổi thành 100 sẽ dẫn đến việc hạt nhân thực hiện các mức hoán đổi mạnh mẽ có thể làm giảm hiệu suất, trong khi đặt nó thành 0 sẽ chỉ hoán đổi để tránh hết bộ nhớ.

Nói chung trong Linux, tính hoán đổi mặc định được đặt thành 60, trong máy ảo CentOS 7 của tôi, nó có vẻ là 30.

Mã nguồn [Chọn]
[root@centos7 ~]# sysctl vm.swappiness
vm.swappiness = 30

Trên máy ảo Debian 8 của tôi, nó có 60 thông thường.

Mã nguồn [Chọn]
root@debian7:~# sysctl vm.swappiness
vm.swappiness = 60

Chúng ta có thể đặt giá trị của vm.swappiness cho cả thời gian chạy hiện tại hoặc kéo dài liên tục khi khởi động lại.

Để thay đổi giá trị hiện tại, chúng ta chỉ cần lặp lại giá trị mới thành /proc/sys/vm/swappiness, như minh họa bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# echo 50 > /proc/sys/vm/swappiness
[root@centos7 ~]# sysctl vm.swappiness
vm.swappiness = 50

Thay đổi này sẽ không kéo dài khi khởi động lại, để làm điều đó, chúng ta cần tạo một tệp trong thư mục /etc/sysctl.d kết thúc bằng.conf.

Mã nguồn [Chọn]
[root@centos7 ~]# echo "vm.swappiness = 1" > /etc/sysctl.d/swappiness.conf
[root@centos7 ~]# cat /etc/sysctl.d/swappiness.conf
vm.swappiness = 1

Tại thời điểm này, chúng tôi có thể khởi động lại để áp dụng các thay đổi, xác nhận rằng điều này sẽ đặt vm.swappiness vĩnh viễn hoặc chúng tôi có thể chạy sysctl với cờ -p để chỉ định tệp cấu hình sẽ tải như được hiển thị bên dưới để tránh khởi động lại.

Mã nguồn [Chọn]
[root@centos7 ~]# sysctl -p /etc/sysctl.d/swappiness.conf
vm.swappiness = 1
[root@centos7 ~]# sysctl vm.swappiness
vm.swappiness = 1

Bây giờ máy chủ Linux của chúng tôi sẽ chỉ sử dụng lượng không gian hoán đổi tối thiểu có thể.

3. Thêm không gian hoán đổi khác

Nếu chúng tôi không thể tăng bộ nhớ, kiểm soát dung lượng bộ nhớ mà quy trình có thể sử dụng hoặc thay đổi mức vm.swappiness thì tiếp theo bạn có thể xem xét việc tăng không gian hoán đổi có sẵn.

Theo mặc định trong CentOS 7 và Debian 8, không gian trao đổi đến từ một ổ đĩa logic, chúng ta có thể thêm nhiều không gian hơn dưới dạng phân vùng đĩa, LVM hoặc thậm chí là một tệp. Nếu bạn có tùy chọn để thêm phân vùng đĩa mới hoặc ổ đĩa logic thì đây là phương pháp được khuyến nghị để thêm không gian hoán đổi mới.

Đây là một ví dụ về cách chúng ta có thể tạo một phân vùng trao đổi bổ sung và gắn kết nó tự động khi khởi động. Tôi đã thêm một đĩa 1GB mới vào máy ảo sẽ được dành riêng cho không gian hoán đổi, /dev/sdb.

Mã nguồn [Chọn]
[root@centos7 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x48034745.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@centos7 ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 1047548 KiB
no label, UUID=7ef9388f-f4b6-4732-aee0-c834297b6e06
[root@centos7 ~]# echo "UUID=7ef9388f-f4b6-4732-aee0-c834297b6e06 swap swap defaults 0 0" >> /etc/fstab
[root@centos7 ~]# swapon -a
[root@centos7 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 0       -1
/dev/sdb1                               partition       1047548 0       -2

Chúng tôi cũng có thể tạo một tệp trên hệ thống tệp hoạt động như không gian hoán đổi, trong ví dụ này, trước tiên chúng tôi tạo tệp 1GB tại /root/swapfile, định dạng tệp dưới dạng không gian hoán đổi, sau đó gắn kết tệp.

Mã nguồn [Chọn]
[root@centos7 ~]# dd if=/dev/zero of=/root/swapfile bs=1024M count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 4.49015 s, 239 MB/s
[root@centos7 ~]# ls -lah /root/swapfile
-rw-r--r--. 1 root root 1.0G Aug 31 15:35 /root/swapfile
[root@centos7 ~]# mkswap /root/swapfile
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=0842421c-be65-4f7e-80c1-d2b89d880c0b

[root@centos7 ~]# echo "/root/swapfile swap swap defaults 0 0" >> /etc/fstab
[root@centos7 ~]# swapon -a
swapon: /root/swapfile: insecure permissions 0644, 0600 suggested.
[root@centos7 ~]# chmod 600 /root/swapfile
[root@centos7 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 0       -1
/root/swapfile                          file            1048572 0       -2

Các ưu tiên của không gian hoán đổi mới được thêm vào của chúng tôi đều là -2, nghĩa là chúng chỉ nên được sử dụng sau khi không gian hoán đổi ở mức ưu tiên -1 đã hết.

Lệnh 'swapon -a' sẽ cố gắn tất cả không gian hoán đổi được xác định trong tệp /etc/fstab. Nội dung của tệp này cũng được tự động gắn vào khi khởi động, vì vậy không gian trao đổi mới sẽ sẵn sàng để sử dụng ngay cả sau khi khởi động lại. Lệnh 'swapon -s' sẽ liệt kê tóm tắt không gian hoán đổi có sẵn, ở trên chúng ta có thể thấy tệp hoán đổi mà chúng ta đã thêm hiện đang được sử dụng.

Chúng tôi cũng có thể thấy một cảnh báo khuyến nghị tệp hoán đổi của chúng tôi được đặt thành quyền 600 thay vì quyền tệp 644 mặc định, điều này có ý nghĩa vì chúng tôi có thể chỉ muốn người dùng root có quyền truy cập vào tệp có khả năng chứa các phần nhạy cảm của bộ nhớ.

Lý tưởng nhất là chúng tôi muốn khắc phục nguyên nhân cốt lõi của việc sử dụng hoán đổi hoặc thậm chí chỉ cần bổ sung thêm bộ nhớ cho hệ thống Linux hoặc xem xét đặt một số loại hạn chế đối với các quy trình chịu trách nhiệm sử dụng lượng lớn RAM, tuy nhiên các tùy chọn này không phải lúc nào cũng vậy khả thi.

Ở đây chúng tôi đã đề cập đến cách bạn có thể theo dõi các quy trình và người dùng đang thực sự sử dụng bộ nhớ và không gian hoán đổi với smem, chỉ ra cách bạn có thể điều chỉnh các mức hoán đổi để kiểm soát tần suất hệ thống sẽ sử dụng không gian hoán đổi và cuối cùng là cách chúng tôi hướng dẫn bạn thực hiện thêm nhiều không gian hoán đổi nếu cần.