Linux 如何添加一个 Swap 文件

我需要添加额外的 swap 空间以提升我的 Linux 服务器/桌面系统的性能。我该如何在不创建一个新的分区的前提下只使用命令行就添加一个 swap 文件到 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

备注,
  1. if=/dev/zero:从 /dev/zero 文件中读。/dev/zero 是一个特殊的文件,它提供了很多 null 字符用以建立一个名为 /swapfile1 的存储文件。
  2. of=/swapfile1:将从 /dev/zero 中读的 null 字符写存储文件到 /swapfile1
  3. bs=1024:每次读或写 1024 个字节。
  4. 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

还有一个办法就是使用 topatophtop 等命令来显示交换区域的使用情况:
# 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 使用交换内存页的积极程度。值越高表示使用交换区域的积极程度越高,越低表示使用交换区域的积极程度越低也就是更大程度地去使用物理内存。默认值为 60swappiness 的值在重启后会恢复默认值 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
Vivek 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 重启后也有效。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页