Swap交换分区

Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

关于Swap分区,其实我们有很多疑问,如果能弄清楚这些疑问,那么你对Swap的了解掌握就差不多了。如何查看Swap分区大小? Swap分区大小应该如何设置?系统在什么时候会使用Swap分区? 是否可以调整? 如何调整Swap分区的大小?Swap分区有什么优劣和要注意的地方? Swap分区是否必要?那么我一个一个来看看这些疑问吧!

查看Swap分区大小

free命令:查看swap分区的大小以及使用情况

[root@localhost ~]# free -h
             total       used       free     shared    buffers     cached
Mem:          1.8G       1.4G       365M       8.2M       900K       310M
-/+ buffers/cache:       1.1G       676M
Swap:         2.0G        10M       2.0G
[root@localhost ~]#

swapon命令:查看当前swap相关信息,启用(swapon)/禁用(swapoff)分页和交换的设备和文件

[root@localhost ~]# swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-1                              	partition	2097148	10652	-1
[root@localhost ~]#

cat /proc/swaps:查看内核文件查看swap相关信息

[root@localhost ~]# ll /proc/swaps 
-r--r--r--. 1 root root 0 Nov 30 18:42 /proc/swaps
[root@localhost ~]# cat /proc/swaps 
Filename				Type		Size	Used	Priority
/dev/dm-1                               partition	2097148	10652	-1
[root@localhost ~]# 

Swap分区大小设置

系统的Swap分区大小设置多大才是最优呢? 关于这个问题,具体还应该根据系统实际情况和内存的负荷综合考虑,像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分区空间

1.查看当前swap分区状态

[root@localhost ~]# free -h
             total       used       free     shared    buffers     cached
Mem:          1.8G       1.4G       363M       8.3M       900K       310M
-/+ buffers/cache:       1.1G       674M
Swap:         2.0G        10M       2.0G
[root@localhost ~]# cat /proc/swaps 
Filename				Type		Size	Used	Priority
/dev/dm-1                               partition	2097148	10584	-1
[root@localhost ~]# 

2.swapoff关闭交换分区

[root@localhost ~]# swapoff /dev/dm-1
[root@localhost ~]# free -h
             total       used       free     shared    buffers     cached
Mem:          1.8G       1.4G       358M        10M       892K       311M
-/+ buffers/cache:       1.1G       670M
Swap:           0B         0B         0B
[root@localhost ~]#

3.swapon开启交换分区

[root@localhost ~]# swapon /dev/dm-1
[root@localhost ~]# free -h
             total       used       free     shared    buffers     cached
Mem:          1.8G       1.4G       357M        10M       896K       311M
-/+ buffers/cache:       1.1G       670M
Swap:         2.0G         0B       2.0G
[root@localhost ~]# 

Swap分区空间什么时候使用

系统在什么情况或条件下才会使用Swap分区的空间呢? 其实是Linux通过一个参数swappiness来控制的。当然还涉及到复杂的算法。

这个参数值可为 0-100,控制系统 swap 的使用程度。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

有两种临时修改swappiness参数的方法,系统重启后失效

#方法一

[root@localhost ~]# more /proc/sys/vm/swappiness   
30
[root@localhost ~]# echo 31 > /proc/sys/vm/swappiness 
[root@localhost ~]# more /proc/sys/vm/swappiness 
31
[root@localhost ~]#

#方法二

[root@localhost ~]# sysctl vm.swappiness=30   
vm.swappiness = 30
[root@localhost ~]# more /proc/sys/vm/swappiness 
30
[root@localhost ~]#

永久修改swappiness参数的方法就是在配置文件/etc/sysctl.conf里面修改vm.swappiness的值,然后重启系统

[root@localhost ~]# echo "vm.swappiness=10" >> /etc/sysctl.conf 
[root@localhost ~]# more /etc/sysctl.conf | grep "swappiness"
vm.swappiness=10
[root@localhost ~]# 

Swap交换分区对性能的影响

我们知道Linux可以使用文件系统中的一个常规文件或独立分区作为Swap交换空间,相对而言,交换分区要快一些。但是和RAM比较而言,Swap交换分区的性能依然比不上物理内存,目前的服务器上RAM基本上都相当充足,那么是否可以考虑抛弃Swap交换分区,是否不需要保留Swap交换分区呢?这个其实是我的疑问之一。

其实保留swap分区概括起来可以从下面来看:

首先,当物理内存不足以支撑系统和应用程序(进程)的运作时,这个Swap交换分区可以用作临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。有点类似机房的UPS系统,虽然正常情况下不需要使用,但是异常情况下, Swap交换分区还是会发挥其关键作用。

其次,即使你的服务器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对于有发生内存泄漏几率的应用程序(进程),Swap交换分区更是重要,因为谁也不想看到由于物理内存不足导致系统崩溃。

最后,现在很多个人用户在使用Linux,有些甚至是PC的虚拟机上跑Linux系统,此时可能常用到休眠(Hibernate),这种情况下也是推荐划分Swap交换分区的。

其实少量使用Swap交换空间是不会影响性能,只有当RAM资源出现瓶颈或者内存泄露,进程异常时导致频繁、大量使用交换分区才会导致严重性能问题。另外使用Swap交换分区频繁,还会引起kswapd0进程(虚拟内存管理中, 负责换页的)耗用大量CPU资源,导致CPU飙升。

关于Swap分区的优劣以及是否应该舍弃,我有点恶趣味的想到了这个事情:人身上的两个器官,阑尾和扁桃体。切除阑尾或扁桃体是否也是争论不休。另外,其实不要Swap交换分区,Linux也是可以正常运行的(有人提及过这个问题)

调整Swap分区的大小

1. 查看Swap的使用情况以及相关信息

[root@getlnx14uat ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/mapper/VolGroup00-LogVol01         partition       67108856        878880  -1
[root@getlnx14uat ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3957       3920         36          0         39       3055
-/+ buffers/cache:        825       3132
Swap:        65535        858      64677

2. 关闭swap交换分区

[root@getlnx14uat ~]# swapoff /dev/mapper/VolGroup00-LogVol01
[root@getlnx14uat ~]# swapon -s
Filename                                Type            Size    Used    Priority

3. 这里是缩小Swap分区大小,如果是增大Swap分区大小,那么就需要扩展正在使用的swap分区的逻辑卷,此处使用lvreduce命令收缩逻辑卷。

[root@getlnx14uat ~]# lvreduce -L 8G /dev/mapper/VolGroup00-LogVol01
  WARNING: Reducing active logical volume to 8.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
  Do you really want to reduce LogVol01? [y/n]: y
  Reducing logical volume LogVol01 to 8.00 GB
  Logical volume LogVol01 successfully resized
[root@getlnx14uat ~]#

4. 格式化swap分区

[root@getlnx14uat ~]# mkswap /dev/mapper/VolGroup00-LogVol01
Setting up swapspace version 1, size = 8589930 kB
[root@getlnx14uat ~]#

5. 启动swap分区

[root@getlnx14uat ~]# swapon -s
Filename                                Type            Size    Used    Priority
[root@getlnx14uat ~]# swapon /dev/mapper/VolGroup00-LogVol01
[root@getlnx14uat ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/mapper/VolGroup00-LogVol01         partition       8388600 0       -1

Windows系统端口号大全

引入端口的主要原因是:操作系统给每个进程指派的进程标识符并非全网统一,不同操作系统进程标识符的格式也各不相同。同时,一个机器上运行的特定进程,如果...

linux如何删除文件夹

linux如何删除文件夹?在linux中删除一个目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可解决。 直接r...

Linux常用命令大全

以下命令仅供大家参考: 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬...

GNU / Linux上的信号加密通讯工具

整个网络的隐私意识一直在稳步增长,因此出现了一些计划。Signal,就是这样一个程序。 我不会放弃这个名字,但是在这个隐私权倡导的世界里,足够多的主要参与...

Linux进程通讯:信号signal

1. 信号基本概念 信号signal是linux进程通讯中唯一的异步通讯方式。 信号从软件层次上看是对中断机制的一种模拟。一个进程收到信号时的处理方式与CPU收到中断...

什么是僵尸进程和如何查找和杀死僵尸进程?

如果你是一个普通的Linux用户,你一定遇到过“ 僵尸进程 ”这个词。 那么什么是僵尸进程? 他们如何创建? 它们对系统有害吗? 我如何杀死这些进程? 继续阅读...