Linux的SWAP分区
碰到这个问题:gcc : internal compiler error: Killed (program cc1plus)
内存不足导致,需要扩展内存到虚拟内存来解决,于是总结整理了一下LINUX的SWAP管理问题
无论是windows系统还是linux系统,除了物理内存外,都还有一个虚拟内存。在linux上,虚拟内存被称为swap space。过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内存的大小至少都有了好几个GB,如果16G内存用32G的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,设置就算生效了。