Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1617786
  • 博文数量: 268
  • 博客积分: 8708
  • 博客等级: 中将
  • 技术积分: 3764
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-06 15:58
文章分类

全部博文(268)

文章存档

2014年(1)

2013年(15)

2012年(23)

2011年(60)

2010年(51)

2009年(12)

2008年(59)

2007年(47)

分类:

2011-04-12 10:17:50

Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copied to the preconfigured space on the hard disk, called swap space, to free up that page of memory. The combined sizes of the physical memory and the swap space is the amount of virtual memory available.
Linux 把物理内存划分作称为分页(Page)的内存区块。内存交换是一个内存分页被复制到一个预配置的称为 swap 空间的硬盘空间里的过程,以此来释放内存分页。物理内存与这个 swap 空间的共同大小称为可用的虚拟内存量。
保留 swap 分区有两个重要的原因。

其一,当物理内存不足以支撑系统和应用程序(进程)的运作时,这个 swap 空间可以用作临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。

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

如果你需要在 Ubuntu 下跑虚拟机或者常用休眠(Hibernate),推荐划分 swap 空间。

如果在使用过程中想要清空 swap 空间,可以先禁用 swap,然后再次启用。以 Ubuntu为例,

sudo swapoff -a
sudo swapon -a
通过系统监视器,例如 gnome-system-monitor,你就可以看到 swap 空间的内容被转移到了物理内存中。
可能也许你不习惯把一个分区留给 swap,那么也可以使用一个文件作为 swap 空间,设置方法如下。但是这样确实不如 swap 分区的性能来得好。
打开控制台,创建一个 512MB 的文件用作 swap:
sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=512
格式化这个 swap 文件作为内存交换设备:
sudo mkswap /mnt/512Mb.swap
添加这个 swap 文件到系统:
sudo swapon /mnt/512Mb.swap
* 要在开机时就使用这个 swap 文件,需要编辑配置文件:
gksudo gedit /etc/fstab
* 在 /etc/fstab 最末加入这一行:
/mnt/512Mb.swap none swap sw 0 0
重启即可生效。


Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能,节省系统升级费用。

  Swap的原理是一个较复杂的问题,需要大量的篇幅来说明。在这里只作简单的介绍,在以后的文章中将和大家详细讨论Swap实现的细节。

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

  Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释 放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到 内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

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

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

  突破128M Swap限制

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

  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空间用完,则服务进程无法启动,通常会出现“ 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平台下都有这样一些命令),此命令可以查看大多数性能指标。

  例如:

  揭开Linux操作系统的Swap交换区之谜

  命令说明:

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

  procs下的w

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

  memory下的swpd

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

  Swap下的si,so

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

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

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

  揭开Linux操作系统的Swap交换区之谜

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

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

  有关Swap操作的系统命令

  增加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类型,如:

  //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空间不是一个文件,而是一个分区,则需创建一个新的文件系统,再挂接到原来的文件系统上。


阅读(1409) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~