什么是使用交换空间?

我们可以做一些事情来检查我们的内存和交换使用情况,但是查看实际使用交换空间的内容是另一个问题。

获取此类信息的常用工具是“smem”。

首先,我们将在 CentOS 7 服务器中安装 smem,它来自 EPEL 存储库。

[jack@onitroad ~]# yum install epel-release -y
[jack@onitroad ~]# yum install smem -y

smem 包也可用于安装在基于 Debian 的 Linux 发行版中。

jack@onitroad:~# apt-get install smem -y

现在我们可以使用 smem,它会告诉我们我们的进程使用了多少交换空间。

[jack@onitroad ~]# 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: jack@onitroad/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%

在这个例子中,整个交换列是 0,因为我们目前没有使用任何。
这里我们使用 -t 选项在底部显示总数,使用 -p 选项以百分比显示交换空间使用情况。

我们还可以使用 -u 标志来查看哪些用户正在使用 Linux 系统上的内存和交换空间。

[jack@onitroad ~]# 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%
--------------------------------------------------
            31    0.00%    2.52%    2.85%    4.65%

如果我们安装了 python-matplotlib 包,我们就可以制作交换使用情况的饼图和图形条用于报告目的,查看手册页中的 --pie 和 --bar 选项以获取更多信息。

现在我们已经了解了实际使用交换空间的内容,我们可以做一些事情。
我们可以调查特定进程并确认它们是否需要运行,还可以进一步调查任何特定应用程序的特定配置设置,因为我们可以修改内存分配等。
如果需要,我们还可以通过添加更多内存来升级服务器,这样就不需要使用交换空间。

如果这些选项不可行,我们还可以减少交换空间的使用频率。

在 Linux 中管理交换空间

交换空间是用于存储内存的磁盘区域。
在本教程中,我们将通过确定实际使用交换空间的内容、控制写入交换空间的频率以及最终根据需要添加另外的交换空间来了解如何管理 Linux 中的交换空间。

添加更多交换空间

如果我们无法增加内存、控制进程可能使用的内存量或者更改 vm.swappiness 的级别,那么接下来我们可以考虑增加可用交换空间。

在 CentOS 7 和 Debian 8 中默认交换空间来自逻辑卷,我们可以以磁盘分区、LVM 甚至文件的形式添加更多空间。
如果我们可以选择添加新的磁盘分区或者逻辑卷,这是添加新交换空间的推荐方法。

这是我们如何创建另外的交换分区并在启动时自动挂载它的示例。
我向虚拟机添加了一个新的 1GB 磁盘,该磁盘将专用于交换空间 /dev/sdb。

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

我们还可以在文件系统上创建一个文件作为交换空间,在这个例子中,我们首先在 /root/swapfile 中创建一个 1GB 的文件,将其格式化为交换空间,然后挂载它。

[jack@onitroad ~]# 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
[jack@onitroad ~]# ls -lah /root/swapfile
-rw-r--r--. 1 root root 1.0G Aug 31 15:35 /root/swapfile
[jack@onitroad ~]# mkswap /root/swapfile
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=0842421c-be65-4f7e-80c1-d2b89d880c0b
[jack@onitroad ~]# echo "/root/swapfile swap swap defaults 0 0" >> /etc/fstab
[jack@onitroad ~]# swapon -a
swapon: /root/swapfile: insecure permissions 0644, 0600 suggested.
[jack@onitroad ~]# chmod 600 /root/swapfile
[jack@onitroad ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       2097148 0       -1
/root/swapfile                          file    		1048572 0       -2

我们新添加的交换空间的优先级都是 -2,这意味着它们只能在优先级 -1 的交换空间耗尽后使用。

'swapon -a' 命令将尝试挂载 /etc/fstab 文件中定义的所有交换空间。
此文件的内容也会在启动时自动挂载,因此即使在重新启动后,新的交换空间也可以使用。
'swapon -s' 命令将列出可用交换空间的摘要,上面我们可以看到我们添加的交换文件现在正在使用中。

我们还可以看到一个警告,建议我们将交换文件的权限设置为 600,而不是默认的 644 文件权限,这是有道理的,因为我们可能只希望 root 用户有权访问可能包含内存敏感部分的文件。

修改交换可能性

我们可以设置 swappiness,它是一个内核运行时参数,用于定义交换的使用频率。

swappiness 值是一个内核参数,可以设置在 0 到 100 之间。
值越低,内核使用交换的可能性就越小。
值越高,内核就越有可能尝试使用交换。
例如,将 swappiness 设置为 100 将导致内核执行激进的交换级别,这可能会导致性能下降,而将其设置为 0 只会交换以避免内存不足。

通常在 Linux 中默认的 swappiness 设置为 60,在我的 CentOS 7 虚拟机中它似乎是 30。

[jack@onitroad ~]# sysctl vm.swappiness
vm.swappiness = 30

在我的 Debian 8 虚拟机上,它有通常的 60。

jack@onitroad:~# sysctl vm.swappiness
vm.swappiness = 60

我们可以为当前运行时设置 vm.swappiness 的值,也可以在重新启动后持续持续。

要更改当前值,我们可以简单地将新值回显到 /proc/sys/vm/swappiness,如下所示。

[jack@onitroad ~]# echo 50 > /proc/sys/vm/swappiness
[jack@onitroad ~]# sysctl vm.swappiness
vm.swappiness = 50

此更改不会持续重启,为此我们需要在 /etc/sysctl.d 目录中创建一个以 .conf 结尾的文件。

[jack@onitroad ~]# echo "vm.swappiness = 1" > /etc/sysctl.d/swappiness.conf
[jack@onitroad ~]# cat /etc/sysctl.d/swappiness.conf
vm.swappiness = 1

此时我们可以重新启动使更改生效,确认这将永久设置 vm.swappiness,或者我们可以使用 -p 标志运行 sysctl 以指定要加载的配置文件,如下所示,这将避免重新启动。

[jack@onitroad ~]# sysctl -p /etc/sysctl.d/swappiness.conf
vm.swappiness = 1
[jack@onitroad ~]# sysctl vm.swappiness
vm.swappiness = 1

现在我们的 Linux 服务器将只使用尽可能少的交换空间。

日期:2020-07-07 20:56:51 来源:oir作者:oir