Linux知识讲座:七大swap经典误区

 整理了一下思路,回忆过去零零星星所学的东西,和在论坛里常看到的观点,去伪存真,搞了一个排行榜,旨在还swap一个清白。

  第7名: 程序在窗口最小化时被swap到swap中
  程序的最小化,跟是否被swap毫无关系,是否会被swap,是根据当前剩余物理内存大小,当前申请的内存大小,当前各个程序数据的活跃度决定的,简 单的说,就是尽可能选择长时间不被访问或者短期内不会再被访问的部分内存swap出去,这里的算法不能保证100%是最优选择,带有一定的猜测性.

  第6名: 用swap一定比不用swap效率低
  举个反例就行了,一个程序运行了1分钟,现在要等待10小时后用户输入数据后再运行,此时另外一个程序需要使用大量内存,剩余的物理内存不够了,这个 时候有两种选择,第一是把那个暂时不运行的程序swap出去,第二是销毁部分Mem Cache. Mem Cache是Linux的内存管理特色之一,可以提高不少效率.使用第二种方案就丧失了部分Mem Cache的性能提升.使用第一种方案明显要明治的多.至于是尽量砍除Mem Cache还是swap出一些预计近期不被使用的数据,可以自己设置这个偏好值./etc/sysctl.conf中有一段vm.swappiness = 0, 0表示尽量砍除Cache,100表示尽量swap.可以在0到100之间调整./proc/sys/vm/swappiness 直接修改这个可以立即 生效

  第5名: swap在哪都一样
  一般的说来, swap在独立扇区效率高于使用文件.因为文件不管是链式存储还是索引结构,"寻址"的效率都比不上独立分区中寻址的效率高.学过C语言的都知道,定位到 一个数组的任意元素和定位到一个链表的任意节点效率是很不一样的,考虑到swap可以使用类似CPU的Cache的算法,维护一个快表,实现快速的定位, 因此使用文件和独立分区虽然速度有别,但是不至于太明显.

  同样是文件或者同样是独立分区的情况下,由于磁盘外圈速度高于磁盘内圈,把swap放到磁盘外圈,可以有更高的读取速度.有人曾做过一个实验.在IBM DHCS-04W上,低柱面号(外圈)的swap分区要比内部的快一些,最大的差距达到2倍之多.

  第4名: 只能在启动的时候挂载swap
  swap不仅仅可以在/etc/fstab中指定,其实在系统运行的任意时刻都能挂载.通过简单的命令完成.

  mkswap和swapon两步走.
  mkswap -f /dev/sda6
  swapon /dev/sda6

  第3名: 只能挂载一个swap
  2.1或者更早期的内核,最多可以挂载8个swap设备.2.4的内核支持同时使用32个swap设备.现在是2.6内核时代,想必一般人不会遇到超过swap个数上限的情况.

  第2名: swap必须是个磁盘分区.
  swap也可以是一个普通的磁盘文件. 举个例子

  dd if=/dev/zero of=/var/my_swap bs=65536 count=65536
  mkswap -f /var/my_swap
  swapon /var/my_swap

  第1名: swap最好是内存大小的2倍.
  这个是被以讹传讹最多的错误观点,2.4内核时代曾经流行过这么做,没想到现在还在流行,甚至有人把这个当作金科玉律,认为必须是内存的两倍.过去有人这么做图方便省事可以理解,现在这么做就显得有点盲从了.像加内存了要不要加swap这样的傻瓜问题也屡见不鲜.

  到底swap多大好呢?
  回答是,完全取决于你的需求和硬件条件.必须遵守的规矩只有一条,如果你需要休眠,确保swap不小于内存.

  物理内存+swap == vitrul memory
  virtual memory是你能提供的内存大小

  从这个等式看 内存大 swap可以小一点 内存小 swap就要大一些

  具体 内存+swap 需要多大 还得看你的应用. 如果跑大型计算,也许100G都不够用.如果做桌面,像我这样上网,看电影,开wine+BT下东西,写程序,看电子书等, 那么1G就够了得出这个结论是2007年, 以后1T内存普及的时候,有人看到这篇古董,不要笑话我目光短浅。

  最后, swap是有很多技巧的,比如同时使用不同的驱动器上的swap来提高效率,在fstab文件中指定各个swap的优先级,等等,值得挖掘一下,工作的时候能提高服务器吞吐量,老板会更happy的,你的钱包也会更happy.

来源:
http://bbs.lpi-china.org/archiver/?tid-3454.html


附,此文深得我心,特别是在机房看到旁边有人安装RHEL时设置16G交换分区(8G内存),当时很无语。。。