Swap交换分区

SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用.

它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。

需要注意的是,虽然这个SWAP分区能够作为"虚拟"的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于SWAP,最好的办法仍然是加大物理内存.SWAP分区只是临时的解决办法.

qlinux下得分区推荐一个交换分区,一个根分区,其中交换分区如上所说作为redhat或者其它虚机所划分的内存不够时候来使用!

交换分区(swap)的合理值一般在内存的2 倍左右,可以适当加大。实际上具体还是以实际应用为准,swap为内存的2倍也不过是一种以讹传讹的说法。如果交换分区的使用都超过4GB以上了,可想而知服务器的性能应该差很多了。


Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。


swap交换分区

一种流行的、以讹传讹的说法是,安装Linux系统时,交换分区swap的大小应该是内存的两倍。也就是说,如果内存是2G,那么就应该分出4G的硬盘空间作为交换空间。其实这是严重的浪费。真实的情况是:可以根据你系统内存的大小,以及所使用的程序,自行决定交换分区的大小,甚至可以完全不用交换分区!

首先解释一下什么是交换分区。交换分区,英文的说法是swap,意思是“交换”、“实物交易”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。

做一个假设:如果你的内存足够大,极少出现内存不足的情况,那么你就不需要交换分区。事实上,这种可能性是完全存在的。现在的1G内存的电脑不算什么了。动辄4G内存的电脑也日益普遍。日常使用的话,很少能用完全部的内存。在用不完内存容量的情况下,还要划出它两倍的硬盘空间用于内存交换,这不是浪费吗?

可以说,在你内存基本够用的情况下,完全可以不要交换空间。在Windows下也是一样,在系统属性中,把虚拟内存设置为0,系统依然运行的很好。当然,如果你用的是服务器,还是要有专门的虚拟内存,有备无患。但是虚拟内存的大小不一定非要内存的两倍。

那么怎么知道你的系统有没有用到交换空间呢?只需要在root用户下,运行下面的命令就可以知道了。

free -m

在日常应用中,通过上述命令看到交换空间的使用情况为0,那么你就不需要很大的虚拟内存,甚至可以完全不需要另辟硬盘空间作为虚拟内存。那么,万一有一天你需要了呢,难道要重装系统?大可不必,在Linux下虚拟内存不单可以放在单独的交换分区,也可以是一个在正常分区下的交换文件。


1 查看swap 空间大小(总计):

     # free -m

默认单位为k, -m 单位为M

                 total       used       free     shared    buffers     cached
  Mem:           377        180        197          0         19        110
  -/+ buffers/cache:         50        327
  Swap:          572          0        572

2 查看swap 空间(file(s)/partition(s)):

包括 文件 和 分区 的详细信息

 # swapon -s
 等价于
 # cat /proc/swaps

3 添加交换空间

两种选择:添加一个交换分区或添加一个交换文件。推荐你添加一个交换分区;不过,若你没有多少空闲空间可用,则添加交换文件。 
  • 3.1 添加一个交换分区

    步骤如下:

    a 使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区)
    b 使用 mkswap 命令来设置交换分区:
       # mkswap /dev/sdb2
    c 启用交换分区:
       # swapon /dev/sdb2
    d 写入/etc/fstab,以便在引导时启用:
       /dev/sdb2 swap swap defaults 0 0
    
  • 3.2 添加一个交换文件

步骤如下:

 a 创建大小为512M的交换文件: 
 # dd if=/dev/zero of=/swapfile1 bs=1024k count=512
 b 使用 mkswap 命令来设置交换文件: 
 # mkswap /swapfile1
 c 启用交换分区: 
 # swapon /swapfile1
 d 写入/etc/fstab,以便在引导时启用: 
 /swapfile1 swap swap defaults 0 0

新添了交换分区并启用它之后,请查看 cat /proc/swaps 或 free 命令的输出来确保交换分区已被启用了。

4 删除交换空间:

a 禁用交换分区:

# swapoff /dev/sdb2
b 从 /etc/fstab 中删除项目;

c 使用fdisk或yast工具删除分区。

删除交换文件步骤同上。


内存Free(重点)

# free -m
total used free shared buffers cached
Mem: 377 180 197 0 19 110
-/+ buffers/cache: 50 327
Swap: 572 0 572

Mem 行显示了从系统角度看来内存使用的情况,

total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存

buffers和cached是系统用做缓冲的内存.

buffers与某个块设备关联, 包含了文件系统元数据, 并且跟踪了块的变化.

cache只包含了文件本身.

-/+ buffers/cache 行则从用户角度显示内存信息, 可用内存从数量上等于mem行used列值减去buffers和cached内存的大小. 因为buffers和cached是操作系统为加快系统运行而设置的, 当用户需要时, 可以只接为用户使用.


top(重点)

top 显示系统运行时的各进程动态、实时的状态(cpu、内存)

top - 21:41:36 up 10:28, 1 user, load average: 0.02, 0.07, 0.08

Tasks: 288 total, 2 running, 285 sleeping, 0 stopped, 1 zombie

%Cpu(s): 2.8 us, 4.3 sy, 0.0 ni, 92.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st

KiB Mem : 4028864 total, 1127836 free, 1139052 used, 1761976 buff/cache

KiB Swap: 4192252 total, 4115896 free, 76356 used. 2530152 avail Mem

 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

 1346 root 20 0 459636 63160 19396 R 6.2 1.6 8:03.26 Xorg

top 中有3个列 VIRT RES SHR, 标示了进程使用的内存情况.

  • VIRT 标识这个进程可以使用的内存总大小, 包括这个进程真实使用的内存, 映射过的文件, 和别的进程共享的内存等.
  • RES 标识这个这个进程真实占用内存的大小.
  • SHR 标识可以和别的进程共享的内存和库大小.

vmstat 显示内存的使用情况

vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。

参数解读:

要以3秒为时间间隔,连续收集10次性能数据,命令如下:

root@debian6:~# vmstat 3 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 772804  41964 175320    0   32     5   143   22   14  0  0 99  0
 0  0      0 772796  41964 175320    0    0     0     0   24   14  0  0 100  0
 0  0      0 772796  41964 175320    0    0     0     0   22   15  0  0 100  0
 0  0      0 772796  41964 175320    0    0     0     0   29   16  0  0 100  0
 0  0      0 772796  41964 175320    0    0     0     0   52   36  0  0 100  0
 0  0      0 772796  41964 175320    0    0     0     0   46   21  0  0 100  0
 0  0      0 772780  41964 175320    0    0     0     0   51   50  1  0 99  0
 0  0      0 772780  41964 175320    0    0     0     0   48   25  0  0 100  0
 0  0      0 772780  41964 175320    0    0     0     0   43   19  0  1 99  0
 0  0      0 772780  41964 175320    0    0     0     0   36   18  0  0 100  0

VmSize即为该进程内存总大小, 和top输出中的VIRT一致.