Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM is full, inactive pages in memory are moved to the swap space. While swap space can help machines with a small amount of RAM, it should not be considered a replacement for more RAM. Swap space is located on hard drives, which have a slower access time than physical memory.Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap files.
Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当用户提交程序,然后产生进程,在机器上运行,机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到swap中等待,该程序占用的物理内存中的一部分空间就被释放出来了,然后把新的进程调入到内存中运行。等到那个挂起程序要运行时,再从Swap分区中恢复保存的数据到内存中。
但是并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。当物理内存和swap都被使用完那么就会报错out of memory。
Swap被使用的日常例子
在使用Windows系统时,可以同时运行多个程序,当你切换到一个很长时间没有理会的程序时,会听到硬盘“哗哗”直响。这是因为这个程序的内存被那些频繁运行的程序给“偷走”了,放到了Swap区中。因此,一旦此程序被放置到前端,它就会从Swap区取回自己的数据,将其放进内存,然后接着运行。
Swap空间的作用
当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的程序被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。
Swap分区对性能的影响
正方:Swap不能代替物理内存用!因为swap毕竟还是以磁盘来伪装成内存,交换的操作是磁盘IO的操作而不是内存的load与store操作。
反方:正常的情况即物理内存还够的情况下,很少使用swap内存区,物理内存不够的情况下,swap空间上存储的也是系统不会频繁使用的数据,调用的次数非常少,性能问题几乎可以忽略,物理内存极度不够的话,性能问题与Swap分区有啥关系,这时你加多数Swap分区也无济于事,只能加物理内存。
使用多大比例内存之后开始使用swap
可在/proc/sys/vm/swappiness文件中进行调整,默认是60。该参数可以从0-100进行设置。0就是最大限度使用内存,尽量不使用swap;100就是积极使用swap。A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space
临时修改swappiness参数的方法(不能直接vi /proc/sys/vm/swappiness ),重启后失效
方法1:echo 60 >/proc/sys/vm/swappiness
方法2:sysctl vm.swappiness=60
永久修改swappiness参数的方法,重启后生效
修改/etc/sysctl.conf里面的vm.swappiness,可以直接vi /etc/sysctl.conf
开启关闭swap交换分区
swapoff /dev/dm-1
swapon /dev/dm-1
swap交换分区不是tmpfs对应的/dev/shm分区,而是swapon -s对应的Filename的分区
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 4194296 42352 -1
[root@localhost ~]# ll /dev/mapper/VolGroup-lv_swap
lrwxrwxrwx 1 root root 7 6月 27 10:34 /dev/mapper/VolGroup-lv_swap -> ../dm-1
[root@localhost ~]# fdisk -l|grep swap
Disk /dev/mapper/VolGroup-lv_swap: 4294 MB, 4294967296 bytes
[root@localhost ~]# ll /dev|grep dm-1
brw-rw---- 1 root disk 253, 1 6月 27 10:34 dm-1
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 35G 3.6G 30G 11% /
tmpfs 3.9G 72K 3.9G 1% /dev/shm
/dev/sda1 485M 39M 421M 9% /boot
/dev/sdb1 197G 100G 87G 54% /db
Swap大小如何确定
CENTOS官网采用如下公式:
M = Amount of RAM in GB
S = Amount of swap in GB,
then If M < 2, S = M *2 Else S = M + 2。
ORACLE的官方文档推荐
RAM ==>Swap Space
Up to 512 MB ==>2 times the size of RAM
Between 1024 MB and 2048 MB==>1.5 times the size of RAM
Between 2049 MB and 8192 MB==>Equal to the size of RAM
More than 8192 MB ==>0.75 times the size of RAM
查看Swap内存的命令
free和swapon -s和cat /proc/swaps三者都可以看到大概的Swap信息
swapon -s和cat /proc/swaps还可以看到Swap对应的磁盘信息
vmstat可以看到间隔时间内Swap in、Swap out的大小
[root@localhost ~]# free -k|grep Swap
Swap: 4194296 42352 4151944
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 4194296 42352 -1
[root@localhost ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 4194296 42352 -1
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 7872 6580 1292 0 104 1037
-/+ buffers/cache: 5339 2433
Swap: 4095 3241 854
第二行
total = used + free
第三行
(-buffers/cache) used内存数:第一部分Mem行中的 used - buffers - cached (反映的是被程序实实在在用掉的内存)
(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached (反映的是可以挪用的内存总数)
第四行
指SWAP交换分区
1)如果没有swap:
swap用了3241M,空闲的物理内存是2433M,也就是说,如果没有swap,内存已经爆了。
2)swap并没有影响到性能:
系统还有足够的物理内存(2433M),换句话说,现在swap里存储的还是不常使用的数据(也就是swap正在发挥正常的作用)。
[root@localhost ~]# vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 42352 1322484 209984 6182296 0 0 17 21 4 3 0 0 100 0 0
0 0 42352 1322484 209984 6182296 0 0 0 0 42 34 0 0 100 0 0
0 0 42352 1322484 209984 6182296 0 0 0 0 38 36 0 0 100 0 0
0 0 42352 1322484 209984 6182296 0 0 0 0 61 43 0 0 100 0 0
0 0 42352 1322484 209984 6182296 0 0 0 0 34 33 0 0 100 0 0
vmstat 3表示每3秒收集一次
si表示当前(三秒钟之内)交换回内存(Swap in)的总量,单位为kbytes;
so表示当前(三秒钟之内)交换出内存(Swap out)的总量,单位为kbytes。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30126024/viewspace-2141646/
,如需转载,请注明出处,否则将追究法律责任。