欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux的SWAP分区

程序员文章站 2022-05-05 10:25:37
...

碰到这个问题:gcc : internal compiler error: Killed (program cc1plus)

内存不足导致,需要扩展内存到虚拟内存来解决,于是总结整理了一下LINUX的SWAP管理问题

无论是windows系统还是linux系统,除了物理内存外,都还有一个虚拟内存。在linux上,虚拟内存被称为swap space。过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内存的大小至少都有了好几个GB,如果16G内存用32G的swap岂不是太占用硬盘空间?

下图是虚拟内存和交换空间的映射关系,虚拟内存的存在,可以提高电脑的运行速度,所以其存在很有意义。

Linux的SWAP分区

我们看看redhat的官方答复是怎么说的:

Amount of RAM in the system 物理内存 Recommended swap space建议的交换空间大小 Recommended swap space if allowing for hibernation如果开启休眠功能建议的交换空间大小
⩽ 2GB 2 times the amount of RAM 3 times the amount of RAM
> 2GB – 8GB Equal to the amount of RAM 2 times the amount of RAM
> 8GB – 64GB At least 4 GB 1.5 times the amount of RAM
> 64GB At least 4 GB Hibernation not recommended

总结起来就是,如果不打算开启休眠功能,物理内存在8G以下,则swap设置为与物理内存一样大。如果物理内存在8G以上,swap空间设置为8G即可。当物理内存大于64G时,不建议开启休眠功能。

以下是Ubuntu的指南,更加细致:(从左至右依次是RAM大小,不开启休眠,开启休眠,最大值)

    RAM(MB) No hibernation With Hibernation Maximum
     256     256              512               512
     512     512             1024              1024
    1024    1024             2048              2048

    RAM(GB) No hibernation  With Hibernation  Maximum
      1      1                2                   2
      2      1                3                   4
      3      2                5                   6
      4      2                6                   8
      5      2                7                  10
      6      2                8                  12
      8      3               11                  16
     12      3               15                  24
     16      4               20                  32
     24      5               29                  48
     32      6               38                  64
     64      8               72                 128
    128     11              139                 256

swap分区其实就是将一部分的硬盘化出来充当内存的功能!其速度介于硬盘与内存之间,如果内存不足的话,swap分区能起到不错的作用!这就是为什么要划分swap分区的原因。有同事问LINUX操作系统下如何创建swap分区? 其实不同的操作系统下,比如说RedHat在安装操作系统的过程中,就会有提示创建swap分区,而且swap分区的大小一般为内存的1-2倍为佳。但有的操作系统在安装的时候没有swap分区,必须安装完操作系统之后再配置,Ubuntu,CentOS系统,创建方法也很简单快捷。方法主要有两种:

方式一:通过创建分区的方式来创建

1). fdisk /dev/sdd          # 创建分区、分区ID为82。 其他常用的83:Linux,8e:Linux LVM

2). mkswap /dev/sdd         # 格式化为swap格式,这里假设硬盘分区为/dev/sdd,一般SAS硬盘sd开头

3). swapon /dev/sdd         # 启动并挂载swap分区,这样的话就算创建好了!

备注: 

1. 创建分区,选择分区号为82代表swap分区

1.创建分区
Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (641-1566, default 641):
Using default value 641
Last cylinder or +size or +sizeM or +sizeK (641-890, default 890):
Using default value 890
Command (m for help): p
Disk /dev/sda: 12.8 GB, 12884901888 bytes
255 heads, 63 sectors/track, 1566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           6       48163+  83  Linux
/dev/sda2               7         515     4088542+  83  Linux
/dev/sda3             516        1566     8442157+   5  Extended
/dev/sda5             891        1015     1004031   83  Linux
/dev/sda6            1016        1566     4425876   83  Linux
/dev/sda7             516         640     1004031   83  Linux
/dev/sda8             641         890     2008093+  83  Linux
 
2.指定分区类型为linux swap。这里的/dev/sda5就是我们要做swap的分区。
Command (m for help): t
Partition number (1-8): 5
Hex code (type L to list codes): 82
Command (m for help): p
Disk /dev/sda: 12.8 GB, 12884901888 bytes
255 heads, 63 sectors/track, 1566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           6       48163+  83  Linux
/dev/sda2               7         515     4088542+  83  Linux
/dev/sda3             516        1566     8442157+   5  Extended
/dev/sda5             516         640     1004031   82  Linux swap
/dev/sda6             641         890     2008093+  83  Linux
/dev/sda7             891        1015     1004031   83  Linux
/dev/sda8            1016        1566     4425876   83  Linux
2. 创建前后内存的变化,注意用free命令观察swap的情况

1. 创建前
# free –m
              total       used       free     shared    buffers     cached
Mem:          1006         84        922          0         11         38
-/+ buffers/cache:         35        971
Swap:            0          0          0
 
2. 创建后
# free  -m
              total       used       free     shared    buffers     cached
Mem:          1006        994         12          0          4        929
-/+ buffers/cache:         60        946
Swap:          999          0        999

方式二:通过创建临时文件的方式来创建

1). dd if=/dev/zero of=/tmp/swap bs=100M count=100  # 以dd命令创建swapfile,这里假设1G

2). mkswap /tmp/swap                                # 以mkswap将swapfile格式化为swap格式

3). swapon /tmp/swap                                # 以swapon来启动档案,使之成为swap

备注:

1. 如果要删除该临时性文件

$ swapoff /tmp/swap    # 先用swapoff命令卸载该分区
$ rm -rf /tmp/swap     # 然后再删除就可以了
2. 如果提示不安全的权限 0644,建议使用 0600

$ chmod -R 0600 /tmp/swap
3. 可以通过swaplabel命令来修改该swapfile的label

$ swaplabel /tmp/swap 
4. 如果想一启动就生效,就必须修改/etc/fstab文件

/tmp/swap   swap  swap  defaults  0  0
5. 更改swap配置
Linux 会使用硬盘的一部分做为swap分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成'等待(standby)',甚至'睡眠(sleep)',一旦要用,再调成'活动(active)',睡眠的进程就躺到swap分区睡大觉,把内存空出来让给'活动'的进程。如果内存够大,应当告诉Linux不必太多的使用swap分区, 可以通过修改swappiness的数值。swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。在ubuntu里面,默认设置swappiness这个值等于60。
  
如果内存较小,而进程调度频繁,硬盘的响动就会大了!
  
现在一般1个G的内存可修改为10, 2个G的可改为5, 甚至是0。具体这样做:

1.查看系统里面的swappiness,默认为60
$ cat /proc/sys/vm/swappiness
2.修改swappiness值为10
$ sudo sysctl vm.swappiness=10
3.在sysctl.conf文档的最后加上这样一行:
$ sudo vi /etc/sysctl.conf
vm.swappiness=10
4. 保存后执行source /etc/sysctl,设置就算生效了。

 

相关标签: swap