因为对Linux命令的不熟悉,造成明月长期以来都没有个自己的ECS云主机开启 SWAP分区 ,直到昨天才算是真正的明白了 SWAP分区 正确的创建和使用方法(请参考【【学习笔记】阿里云ECS下创建、启用SWAP分区详细教程】一文)。目前看服务器整体的运行非常的稳定,负载基本上都维持在正常偏下的水平,可以说是非常的完美了。于是,闲来无事就度娘、谷姐一番关于Linux下 SWAP分区 的相关资料深入学习了一番,今天作为笔记分享的这篇就是一篇有关 SWAP分区 很全面的一篇文章,真心很不错!

timg (3).jpg

  嵌入式Linux中文站消息,Linux系统的Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

  如大家所知,现代操作系统都实现了“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,更重要的是,“虚拟内存”是隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。

  可能计算机用户会经常遇这种现象。例如,在使用Windows系统时,可以同时运行多个程序,当你切换到一个很长时间没有理会的程序时,会听到硬盘“哗哗”直响。这是因为这个程序的内存被那些频繁运行的程序给“偷走”了,放到了Swap区中。因此,一旦此程序被放置到前端,它就会从Swap区取回自己的数据,将其放进内存,然后接着运行。

  另外,并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。

突破128M Swap限制

  有些Linux(国内汉化版)安装手册上有这样的说明:Swap空间不能超过128M。为什么会有这种说法?在说明“128M”这个数字的来历之前,先给问题一个回答:现在根本不存在128M的限制!现在的限制是2G!

  Linux系统中的Swap空间是分页的,每一页的大小和内存页的大小一样,方便Swap空间和内存之间的数据交换。旧版本的Linux实现Swap空间时,用Swap空间的第一页作为所有Swap空间页的一个“位映射”(Bit map)。这就是说第一页的每一位,都对应着一页Swap空间。如果这一位是1,表示此页Swap可用;如果是0,表示此页是坏块,不能使用。这么说来,第一个Swap映射位应该是0,因为,第一页Swap是映射页。另外,最后10个映射位也被占用,用来表示Swap的版本(原来的版本是Swap_space,现在的版本是swapspace2)。那么,如果说一页的大小为s,这种Swap的实现方法共能管理“8*(s-10)-1”个Swap页。对于i386系统来说s=4096,则空间大小共为133890048,如果认为1 MB=2^20 Byte的话,大小正好为128M。

  这样来实现Swap空间的管理,是要防止Swap空间中有坏块。如果系统检查到Swap中有坏块,则在相应的位映射上标记上0,表示此页不可用。这样在使用Swap时,不至于用到坏块,而使系统产生错误。

  现在的系统设计者认为:
   - 1.现在硬盘质量很好,坏块很少。
   - 2.就算有,也不多,只需要将坏块罗列出来,而不需要为每一页建立映射。
   - 3.如果有很多坏块,就不应该将此硬盘作为Swap空间使用。

  于是,现在的Linux取消了位映射的方法,也就取消了128M的限制。直接用地址访问,限制为2G。

Swap配置对性能的影响

  对于分配太多的Swap空间,会浪费磁盘空间,而Swap空间太少,则系统会发生错误。

  当系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。

  一般情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,具体配置参见各服务器产品的说明。

  此外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。

系统性能监视

  Swap空间的分配固然很重要,而系统运行时的性能监控却更加有价值。通过性能监视工具,可以检查系统的各项性能指标,找到系统性能的瓶颈。本文只介绍一下在Solaris下和Swap相关的一些命令和用途。

  最常用的是Vmstat命令(在大多数Unix平台下都有这样一些命令),此命令可以查看大多数性能指标。例如:

  #vmstat 3

  procs memory swap io system cpu

  r b w swpd free buff cache si so bi bo in cs us sy id

  0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99

  0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100

  0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100

  …………

  命令说明:

  vmstat后面的参数指定了性能指标捕获的时间间隔。3表示每三秒钟捕获一次。第一行数据不用看,没有价值,它仅反映开机以来的平均性能。从第二行开始,反映每三秒钟之内的系统性能指标。这些性能指标中和Swap有关的包括以下几项:

  procs下的w

  它表示当前(三秒钟之内)需要释放内存、交换出去的进程数量。

  memory下的swpd

  它表示使用的Swap空间的大小。

  Swap下的si,so

  si表示当前(三秒钟之内)每秒交换回内存(Swap in)的总量,单位为kbytes;so表示当前(三秒钟之内)每秒交换出内存(Swap out)的总量,单位为kbytes。

  以上的指标数量越大,表示系统越忙。这些指标所表现的系统繁忙程度,与系统具体的配置有关。系统管理员应该在平时系统正常运行时,记下这些指标的数值,在系统发生问题的时候,再进行比较,就会很快发现问题,并制定本系统正常运行的标准指标值,以供性能监控使用。

  另外,使用Swapon-s也能简单地查看当前Swap资源的使用情况。例如:

  #swapon-s

  Filename Type Size Used Priority

  /dev/hda9 partition 361420 0 3

  能够方便地看出Swap空间的已用和未用资源的大小。

  应该使Swap负载保持在30%以下,这样才能保证系统的良好性能。

  增加Swap空间,分以下几步:

   - 1)成为超级用户

  $su-root

   - 2)创建Swap文件

  dd if=/dev/zero of=swapfile bs=1024 count=65536

  创建一个有连续空间的交换文件。

   - 3)激活Swap文件

  /usr/sbin/swapon swapfile

  swapfile指的是上一步创建的交换文件。

   - 4)现在新加的Swap文件已经起作用了,但系统重新启动以后,并不会记住前几步的操作。

  因此要在/etc/fstab文件中记录文件的名字,和Swap类型,如:

  /path/swapfile none Swap sw,pri=3 0 0

   - 5)检验Swap文件是否加上

  /usr/sbin/swapon-s

  删除多余的Swap空间。

   - 1)成为超级用户

   - 2)使用Swapoff命令收回Swap空间。

  /usr/sbin/swapoff swapfile

   - 3)编辑/etc/fstab文件,去掉此Swap文件的实体。

   - 4)从文件系统中回收此文件。

  rm swapfile

   - 5)当然,如果此Swap空间不是一个文件,而是一个分区,则需创建一个新的文件系统,再挂接到原来的文件系统上。

Swap分区空间什么时候使用

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

  这个参数值可为0-100,控制系统swap的使用程度。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。关于该参数请参考这篇文章[转载]调整虚拟内存,在此不做过多赘述。下面是关于swappiness的相关资料

  The Linux 2.6 kernel added a new kernel parameter called swappiness
to let administrators tweak the way Linux swaps.It is a number from 0
to 100.In essence,higher values lead to more pages being swapped,and
lower values lead to more applications being kept in memory,even if
they are idle.Kernel maintainer Andrew Morton has said that he runs
his desktop machines with a swappiness of 100,stating that"My point is
that decreasing the tendency of the kernel to swap stuff out is
wrong.You really don't want hundreds of megabytes of BloatyApp's
untouched memory floating about in the machine.Get it out on the
disk,use the memory for something useful."

  Swappiness is a property of the Linux kernel that changes the
balance between swapping out runtime memory,as opposed to dropping
pages from the system page cache.Swappiness can be set to values
between 0 and 100 inclusive.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.The default value
is 60,and for most desktop systems,setting it to 100 may affect the
overall performance,whereas setting it lower(even 0)may improve
interactivity(by decreasing response latency.

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

方法1:

more /proc/sys/vm/swappiness

60

echo 10 > /proc/sys/vm/swappiness

more /proc/sys/vm/swappiness

10

方法2

sysctl vm.swappiness=10

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

echo 'vm.swappiness=10' >>/etc/sysctl.conf

如果有人会问是否物理内存使用到某个百分比后才会使用Swap交换空间,可以明确的告诉你不是这样一个算法,比如:即使物理内存只剩下8M了,但是依然没有使用Swap交换空间,而另外一个例子,物理内存还剩下19G,居然用了一点点Swap交换空间。

  Swap交换分区对性能的影响

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

   - Advantages:

  Provides overflow space when your memory fills up completely

  Can move rarely-needed items away from your high-speed memory

  Allows you to hibernate

   - Disadvantages:

  Takes up space on your hard drive as SWAP partitions do not resize dynamically

  Can increase wear and tear to your hard drive

  Does not necessarily improve performance(see below)

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

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

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

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

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

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

  明月感觉因为Linux的先天机制,感觉还是要配合一个SWAP交换分区的存在的。但是一定要将 swappiness 值设定在一个比较低的阈值内,比如明月目前的SWAP交换分区 swappiness 值就是 10 ,至于说具体的效果我只能说是需要持续观察服务器运行状况来决定了,后续有心得了我们再做分享吧!

最后修改:2018 年 01 月 12 日
如果觉得我的文章对你有用,请随意赞赏