我需要添加额外的 swap 空间以提升我的 Linux 服务器/桌面系统的性能。我该如何在不创建一个新的分区的前提下只使用命令行就添加一个 swap 文件到 Linux 系统中去呢?
在 Linux 中,亦如在大多数其它的类 Unix 操作系统中,通常都使用一块磁盘的一整块分区来作为交换区域。但对于 2.6 Linux Kernel 交换文件能够和交换分区一样快 - 尽管我还是建议去使用一个交换分区。对于交换文件的管理的灵活性要高于分区管理的灵活性;况且现代大容量硬盘可以进行物理扇区的重新映射,分区的连续性是无法保证的。你可以将交换文件作为一个专用分区进行添加,或者也可以使用下文的指令来创建一个交换文件。
$ su -
或
$ sudo -s
# dd if=/dev/zero of=/swapfile1 bs=1024 count=524288
输入如下:
524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied, 3.23347 s, 166 MB/s
备注,
# chown root:root /swapfile1
# chmod 0600 /swapfile1
一个人人可读的交换文件将是一个巨大的本地漏洞。以上命令保证了只有 root 用户能够对该文件进行读写。
# mkswap /swapfile1
输出如下:
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=0e5e7c60-bbba-4089-a76c-2bb29c0f0839
# swapon /swapfile1
# vi /etc/fstab
追加一行:
/swapfile1 none swap sw 0 0
保持并关闭该文件。下一次 Linux 重启以后,就会自动启用这个新的交换文件了。
$ free -m
total used free shared buffers cached
Mem: 1876 1798 77 0 119 1440
-/+ buffers/cache: 237 1638
Swap: 4607 0 4607
# swapon -s
输出如下:
Filename Type Size Used Priority
/dev/sda6 partition 4194296 0 0
/swapfile1 file 524280 0 -1
或者也可以查看 /proc/meminfo 文件:
$ less /proc/meminfo
$ grep -i --color swap /proc/meminfo
输出如下:
SwapCached: 30748 kB
SwapTotal: 6291448 kB
SwapFree: 6154008 kB
还有一个办法就是使用 top、 atop、 htop 等命令来显示交换区域的使用情况:
# top
# atop
# htop
一个运行了一个数据库服务器的 CentOS Linux 输出如下:
1 [|| 3.9%] Tasks: 171, 106 thr; 1 running
2 [ 0.0%] Load average: 0.06 0.12 0.09
3 [|| 2.0%] Uptime: 22 days, 07:07:28
4 [ 0.0%]
5 [ 0.0%]
6 [ 0.0%]
7 [ 0.0%]
8 [ 0.0%]
Mem[||||||||||||||||||2112/11909MB]
Swp[| 134/6143MB]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
8523 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:00.00 /usr/libexec/mysq
8524 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:02.74 /usr/libexec/mysq
8525 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:16.17 /usr/libexec/mysq
8526 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:06.33 /usr/libexec/mysq
8528 mysql 20 0 4545M 414M 4816 S 0.0 3.5 4:02.14 /usr/libexec/mysq
8529 mysql 20 0 4545M 414M 4816 S 0.0 3.5 5:22.00 /usr/libexec/mysq
8530 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:04.63 /usr/libexec/mysq
8531 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:50.95 /usr/libexec/mysq
8532 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:08.10 /usr/libexec/mysq
9359 mysql 20 0 4545M 414M 4816 S 0.0 3.5 22:53.28 /usr/libexec/mysq
# swapoff /swapfile1
# swapon -s
# sysctl vm.swappiness=VALUE
# sysctl vm.swappiness=20
或者
# echo VALUE > /proc/sys/vm/swappiness
# echo 30 > /proc/sys/vm/swappiness
/proc/sys/vm/swappiness 文件里的值控制着 Kernel 使用交换内存页的积极程度。值越高表示使用交换区域的积极程度越高,越低表示使用交换区域的积极程度越低也就是更大程度地去使用物理内存。默认值为 60。 swappiness 的值在重启后会恢复默认值 60,要永久性地修改,添加以下行到 /etc/sysctl.conf:
echo 'vm.swappiness=30' >> /etc/sysctl.conf
原文链接: Linux Add a Swap File – HowTo,发布日期:2006 年 5 月 18 日,最新修订日期:2017 年 5 月 3 日。
Vivek Gite 是 nixCraft 的创始人、资深系统管理员、Linux/Unix shell 脚本编程培训师。他曾与来自全球的客户进行合作,涉猎多个领域,包括 IT、教育、国防与空间探索以及非盈利组织。
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
22 package(s) needed for security, out of 29 available
Run "sudo yum update" to apply all updates.
$ uname -a
Linux PUBLISHER-02 4.4.23-31.54.amzn1.x86_64 #1 SMP
Tue Oct 18 22:02:09 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ whoami
defonds
$ free -m
total used free shared buffers cached
Mem: 7985 1885 6099 10 266 1285
-/+ buffers/cache: 334 7650
Swap: 0 0 0
$ cat /proc/swaps
Filename Type Size Used Priority
$ sudo -s
[sudo] password for defonds:
# whoami
root
# cat /proc/cpuinfo | grep "processor" | wc -l
2
# cd /
# dir
bin data home local media proc sbin sys var
boot dev lib lost+found mnt root selinux tmp
cgroup etc lib64 McAfee opt run srv usr
# dd if=/dev/zero of=/swapfile1 bs=1024 count=8388608
8388608+0 records in
8388608+0 records out
8589934592 bytes (8.6 GB) copied, 56.5998 s, 152 MB/s
# ls -alt
total 8388744
drwxrwxrwt 5 root root 4096 Jul 28 01:56 tmp
-rw-r--r-- 1 root root 8589934592 Jul 28 01:56 swapfile1
# chown root:root /swapfile1
# ls -alt
total 8388744
drwxrwxrwt 5 root root 4096 Jul 28 01:56 tmp
-rw-r--r-- 1 root root 8589934592 Jul 28 01:56 swapfile1
# chmod 0600 /swapfile1
# ls -alt
total 8388744
drwxrwxrwt 5 root root 4096 Jul 28 01:56 tmp
-rw------- 1 root root 8589934592 Jul 28 01:56 swapfile1
# mkswap /swapfile1
Setting up swapspace version 1, size = 8388604 KiB
no label, UUID=6624386f-338b-4748-a13d-08ff5896323a
# swapon /swapfile1
# vi /etc/fstab
# cat /etc/fstab
#
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/xvdb /data ext4 defaults 0 0
/swapfile1 none swap sw 0 0
# free -m
total used free shared buffers cached
Mem: 7985 7860 124 10 267 7066
-/+ buffers/cache: 526 7458
Swap: 8191 0 8191
# cat /proc/swaps
Filename Type Size Used Priority
/swapfile1 file 8388604 0 -1
# top -1
Tasks: 143 total, 1 running, 142 sleeping, 0 stopped, 0 zombie
Cpu0 : 7.9%us, 0.4%sy, 0.0%ni, 91.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 8.0%us, 0.9%sy, 0.0%ni, 91.0%id, 0.1%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 8176772k total, 8048280k used, 128492k free, 273968k buffers
Swap: 8388604k total, 0k used, 8388604k free, 5906156k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
543 root 20 0 50.0g 1.8g 517m S 1.0 23.0 2:26.99 java
1 root 20 0 19640 1996 1672 S 0.0 0.0 0:00.92 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:04.98 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 0:16.45 rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root RT 0 0 0 0 S 0.0 0.0 0:00.16 migration/0
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
13 root RT 0 0 0 0 S 0.0 0.0 0:00.35 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:18.57 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 xenwatch
以上操作对物理内存为 8G 的 Linux 加了 8G 的虚拟空间,立即生效并保证 Linux 重启后也有效。
在 Linux 中,亦如在大多数其它的类 Unix 操作系统中,通常都使用一块磁盘的一整块分区来作为交换区域。但对于 2.6 Linux Kernel 交换文件能够和交换分区一样快 - 尽管我还是建议去使用一个交换分区。对于交换文件的管理的灵活性要高于分区管理的灵活性;况且现代大容量硬盘可以进行物理扇区的重新映射,分区的连续性是无法保证的。你可以将交换文件作为一个专用分区进行添加,或者也可以使用下文的指令来创建一个交换文件。
在 Linux 下添加一个交换文件的步骤
你需要使用 dd 命令来创建一个交换文件。 mkswap 命令用于在一个设备或文件上建立一个 Linux 交换区域。步骤 #1:以 root 用户登录
打开一个终端窗口 (Applications > Accessories > Terminal) 或者使用 ssh 客户端登录到远程服务器。键入 su - (或 sudo -s) 命令并按提示输入 root 密码:$ su -
或
$ sudo -s
步骤 #2:创建存储文件
键入以下命令来创建 512MB 的交换文件 (1024 * 512MB = 524288 块大小):# dd if=/dev/zero of=/swapfile1 bs=1024 count=524288
输入如下:
524288+0 records in
524288+0 records out
536870912 bytes (537 MB) copied, 3.23347 s, 166 MB/s
备注,
- if=/dev/zero:从 /dev/zero 文件中读。/dev/zero 是一个特殊的文件,它提供了很多 null 字符用以建立一个名为 /swapfile1 的存储文件。
- of=/swapfile1:将从 /dev/zero 中读的 null 字符写存储文件到 /swapfile1。
- bs=1024:每次读或写 1024 个字节。
- count=524288:只拷贝 524288 个输入块。
步骤 #3:交换文件的安全处理
出于安全的原因,为交换文件设置合适的文件权限:# chown root:root /swapfile1
# chmod 0600 /swapfile1
一个人人可读的交换文件将是一个巨大的本地漏洞。以上命令保证了只有 root 用户能够对该文件进行读写。
步骤 #4:设置一个 Linux 交换区域
输入以下命令在一个文件中设置 Linux 交换区:# mkswap /swapfile1
输出如下:
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=0e5e7c60-bbba-4089-a76c-2bb29c0f0839
步骤 #5:启用交换文件
最后,立即激活 /swapfile1 交换区域,键入:# swapon /swapfile1
步骤 #6:修改 /etc/fstab 文件
要在 Linux 系统重启后激活 /swapfile1,添加条目到 /etc/fstab 文件。使用诸如 vi 的文本编辑器打开这个文件:# vi /etc/fstab
追加一行:
/swapfile1 none swap sw 0 0
保持并关闭该文件。下一次 Linux 重启以后,就会自动启用这个新的交换文件了。
如何检查交换区域是否已经激活?
只需要键入 free 命令:$ free -m
total used free shared buffers cached
Mem: 1876 1798 77 0 119 1440
-/+ buffers/cache: 237 1638
Swap: 4607 0 4607
如何显示 Linux 上交换区的使用摘要?
键入以下 swapon 命令:# swapon -s
输出如下:
Filename Type Size Used Priority
/dev/sda6 partition 4194296 0 0
/swapfile1 file 524280 0 -1
或者也可以查看 /proc/meminfo 文件:
$ less /proc/meminfo
$ grep -i --color swap /proc/meminfo
输出如下:
SwapCached: 30748 kB
SwapTotal: 6291448 kB
SwapFree: 6154008 kB
还有一个办法就是使用 top、 atop、 htop 等命令来显示交换区域的使用情况:
# top
# atop
# htop
一个运行了一个数据库服务器的 CentOS Linux 输出如下:
1 [|| 3.9%] Tasks: 171, 106 thr; 1 running
2 [ 0.0%] Load average: 0.06 0.12 0.09
3 [|| 2.0%] Uptime: 22 days, 07:07:28
4 [ 0.0%]
5 [ 0.0%]
6 [ 0.0%]
7 [ 0.0%]
8 [ 0.0%]
Mem[||||||||||||||||||2112/11909MB]
Swp[| 134/6143MB]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
8523 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:00.00 /usr/libexec/mysq
8524 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:02.74 /usr/libexec/mysq
8525 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:16.17 /usr/libexec/mysq
8526 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:06.33 /usr/libexec/mysq
8528 mysql 20 0 4545M 414M 4816 S 0.0 3.5 4:02.14 /usr/libexec/mysq
8529 mysql 20 0 4545M 414M 4816 S 0.0 3.5 5:22.00 /usr/libexec/mysq
8530 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:04.63 /usr/libexec/mysq
8531 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:50.95 /usr/libexec/mysq
8532 mysql 20 0 4545M 414M 4816 S 0.0 3.5 0:08.10 /usr/libexec/mysq
9359 mysql 20 0 4545M 414M 4816 S 0.0 3.5 22:53.28 /usr/libexec/mysq
我该如何关闭 Linux 上用于 page 分页以及交换区域的设备和文件?
你需要使用 swapoff 命令:# swapoff /swapfile1
# swapon -s
我该如何设置 Linux 服务器上的 swappiness?
语法:# sysctl vm.swappiness=VALUE
# sysctl vm.swappiness=20
或者
# echo VALUE > /proc/sys/vm/swappiness
# echo 30 > /proc/sys/vm/swappiness
/proc/sys/vm/swappiness 文件里的值控制着 Kernel 使用交换内存页的积极程度。值越高表示使用交换区域的积极程度越高,越低表示使用交换区域的积极程度越低也就是更大程度地去使用物理内存。默认值为 60。 swappiness 的值在重启后会恢复默认值 60,要永久性地修改,添加以下行到 /etc/sysctl.conf:
echo 'vm.swappiness=30' >> /etc/sysctl.conf
原文链接: Linux Add a Swap File – HowTo,发布日期:2006 年 5 月 18 日,最新修订日期:2017 年 5 月 3 日。
作者简介
Vivek GiteVivek Gite 是 nixCraft 的创始人、资深系统管理员、Linux/Unix shell 脚本编程培训师。他曾与来自全球的客户进行合作,涉猎多个领域,包括 IT、教育、国防与空间探索以及非盈利组织。
译者续:《给 aws 添加 8G 内存的操作步骤》
以下内容为译者在一台没有启用交换区的 aws 亲自动手操作,以示上述内容"亲测可用"。__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
22 package(s) needed for security, out of 29 available
Run "sudo yum update" to apply all updates.
$ uname -a
Linux PUBLISHER-02 4.4.23-31.54.amzn1.x86_64 #1 SMP
Tue Oct 18 22:02:09 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ whoami
defonds
$ free -m
total used free shared buffers cached
Mem: 7985 1885 6099 10 266 1285
-/+ buffers/cache: 334 7650
Swap: 0 0 0
$ cat /proc/swaps
Filename Type Size Used Priority
$ sudo -s
[sudo] password for defonds:
# whoami
root
# cat /proc/cpuinfo | grep "processor" | wc -l
2
# cd /
# dir
bin data home local media proc sbin sys var
boot dev lib lost+found mnt root selinux tmp
cgroup etc lib64 McAfee opt run srv usr
# dd if=/dev/zero of=/swapfile1 bs=1024 count=8388608
8388608+0 records in
8388608+0 records out
8589934592 bytes (8.6 GB) copied, 56.5998 s, 152 MB/s
# ls -alt
total 8388744
drwxrwxrwt 5 root root 4096 Jul 28 01:56 tmp
-rw-r--r-- 1 root root 8589934592 Jul 28 01:56 swapfile1
# chown root:root /swapfile1
# ls -alt
total 8388744
drwxrwxrwt 5 root root 4096 Jul 28 01:56 tmp
-rw-r--r-- 1 root root 8589934592 Jul 28 01:56 swapfile1
# chmod 0600 /swapfile1
# ls -alt
total 8388744
drwxrwxrwt 5 root root 4096 Jul 28 01:56 tmp
-rw------- 1 root root 8589934592 Jul 28 01:56 swapfile1
# mkswap /swapfile1
Setting up swapspace version 1, size = 8388604 KiB
no label, UUID=6624386f-338b-4748-a13d-08ff5896323a
# swapon /swapfile1
# vi /etc/fstab
# cat /etc/fstab
#
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/xvdb /data ext4 defaults 0 0
/swapfile1 none swap sw 0 0
# free -m
total used free shared buffers cached
Mem: 7985 7860 124 10 267 7066
-/+ buffers/cache: 526 7458
Swap: 8191 0 8191
# cat /proc/swaps
Filename Type Size Used Priority
/swapfile1 file 8388604 0 -1
# top -1
Tasks: 143 total, 1 running, 142 sleeping, 0 stopped, 0 zombie
Cpu0 : 7.9%us, 0.4%sy, 0.0%ni, 91.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 8.0%us, 0.9%sy, 0.0%ni, 91.0%id, 0.1%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 8176772k total, 8048280k used, 128492k free, 273968k buffers
Swap: 8388604k total, 0k used, 8388604k free, 5906156k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
543 root 20 0 50.0g 1.8g 517m S 1.0 23.0 2:26.99 java
1 root 20 0 19640 1996 1672 S 0.0 0.0 0:00.92 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:04.98 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 0:16.45 rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root RT 0 0 0 0 S 0.0 0.0 0:00.16 migration/0
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
13 root RT 0 0 0 0 S 0.0 0.0 0:00.35 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:18.57 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 xenwatch
以上操作对物理内存为 8G 的 Linux 加了 8G 的虚拟空间,立即生效并保证 Linux 重启后也有效。