Linux下判断内存使用的一些方法和说明

下面我来写一下在linux OS 下 如何判断系统是否内存吃紧。
我从两个部分来查看如何检查。
第一部分:查看内存使用状况
Linux 下使用Top
[root@itc-test9 ~]# top
top - 17:08:01 up 12 days, 3:48, 2 users, load average: 0.01, 0.01, 0.00
Tasks: 95 total,<wbr><wbr> 1 running, 94 sleeping,<wbr><wbr> 0 stopped,<wbr><wbr> 0 zombie<br>Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.5% id, 0.5% wa, 0.0% hi, 0.0% si<br><span style="color:#ff0000;"><strong>Mem:<wbr><wbr> 2056000k total, 1963652k used,<wbr><wbr><wbr> 92348k free</wbr></wbr></wbr></wbr></wbr></strong></span>,<wbr><wbr><wbr> 59156k buffers<br>Swap: 4096564k total,<wbr><wbr><wbr><wbr><wbr> 164k used, 4096400k free, 1605276k cached</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
PID USER<wbr><wbr><wbr><wbr><wbr> PR NI VIRT RES SHR S %CPU %MEM<wbr><wbr><wbr> TIME+ COMMAND<br>1 root<wbr><wbr><wbr><wbr><wbr> 16<wbr><wbr> 0 4744 552 460 S 0.0 0.0<wbr><wbr> 0:00.46 init</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
从Top 显示来看是有1963652K已经使用,只有92348k内存空闲。一直问我是否内存不足了。下面就来解释一下Oracle 在Linux 下如何查看OS 内存是否不足。
但我们从Linux command free 来看:

[oracle@itc-test9 ~]free
total<wbr><wbr><wbr><wbr><wbr><wbr> used<wbr><wbr><wbr><wbr><wbr><wbr> free<wbr><wbr><wbr><wbr> shared<wbr><wbr><wbr> buffers<wbr><wbr><wbr><wbr> cached<br>Mem:<wbr><wbr><wbr><wbr><wbr><wbr> 2056000<wbr><wbr><wbr> 1869596<wbr><wbr><wbr><wbr> 186404<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 0<wbr><wbr><wbr><wbr><wbr> 59172<wbr><wbr><wbr> 1512236<br>-/+ buffers/cache:<wbr><wbr><wbr><wbr> 298188<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
1757812
Swap:<wbr><wbr><wbr><wbr><wbr> 4096564<wbr><wbr><wbr><wbr><wbr><wbr><wbr> 164<wbr><wbr><wbr> 4096400<br><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
-/+ buffers/cache:<wbr><wbr><wbr><wbr> used=298188k =291.2M</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> free=1757812k=1716.6M<wbr><wbr> 约等于2G。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
从Free 命令行来看OS 还有1.76G 空间未使用。
需要解释一下Free 和Top 在Linux 下的不同显示问题。
Free命令显示在操作系统中使用和空闲的内存数量。
Top 显示是和Linux 对内存使用的方式关系紧密,linux 尽可能的要求
使 用物理内存来提高Buffer 和Cache 对Disk 的I/O操作。Linux 将尽可能多的将I/O 操作磁盘上的信息保存在内存当中,如果Oracle(其他程序也一样)需要更多的内存空间,Linux 才会将一些内存使用LRU 算法清理出来,如果不需要则继续保持这些数据信息在内存中。所以我们使用Top看到的Memory FreeMem:<wbr><wbr> 2056000k total, 1963652k used,<wbr><wbr><wbr> 92348k free</wbr></wbr></wbr></wbr></wbr>很少。
第二部分:查看Swap 的状况:
Swap 空间的使用状况也能分辨出Oracle 服务器内存是否已经吃紧。
先看Swap 大小设定:
RAM Size<wbr><wbr><wbr> Swap Size<br>1-2G<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 1.5 倍 RAM<br>2-8G<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 1 倍 RAM<br>&gt;8G<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 0.75 RAM</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
基本上每个操做系统(除Windows)都建议Swap 使用上面比例的配置。
但根据个人经验如果Server 的Memory >32G 时,一般都会将Swap 空间设置在10g 以内,甚至更小。
使用Command more /proc/meminfo 或top 来Monitor Swap 的使用状况。
[root@itc-test9 ~]# more /proc/meminfo
MemTotal:<wbr><wbr><wbr><wbr><wbr> 2056000 kB<br>MemFree:<wbr><wbr><wbr><wbr><wbr><wbr><wbr> 177268 kB<br>Buffers:<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 59292 kB<br>Cached:<wbr><wbr><wbr><wbr><wbr><wbr><wbr> 1519188 kB<br>SwapCached:<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 4 kB<br>Active:<wbr><wbr><wbr><wbr><wbr><wbr><wbr> 1092248 kB<br>Inactive:<wbr><wbr><wbr><wbr><wbr><wbr> 654096 kB<br>HighTotal:<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 0 kB<br>HighFree:<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 0 kB<br>LowTotal:<wbr><wbr><wbr><wbr><wbr> 2056000 kB<br>LowFree:<wbr><wbr><wbr><wbr><wbr><wbr><wbr> 177268 kB<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
SwapTotal:<wbr><wbr><wbr><wbr> 4096564 kB<br>SwapFree:<wbr><wbr><wbr><wbr><wbr> 4096400 kB</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
[root@itc-test9 ~]# top
top - 17:08:01 up 12 days, 3:48, 2 users, load average: 0.01, 0.01, 0.00
Tasks: 95 total,<wbr><wbr> 1 running, 94 sleeping,<wbr><wbr> 0 stopped,<wbr><wbr> 0 zombie<br>Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.5% id, 0.5% wa, 0.0% hi, 0.0% si<br><span style="color:#ff0000;"><strong>Mem:<wbr><wbr> 2056000k total, 1963652k used,<wbr><wbr><wbr> 92348k free</wbr></wbr></wbr></wbr></wbr></strong></span>,<wbr><wbr><wbr> 59156k buffers<br>Swap: 4096564k total,<wbr><wbr><wbr><wbr><wbr> 164k used, 4096400k free, 1605276k cached</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
如果你观察Swap 中的使用量一直在增加,或Swap used 为一个很大的值。那我们基本就能确定在现有的状况下Oracle server 内存出现问题。(我们需要考虑此现象是偶尔发生还是一直出现)
我们需要做:
<wbr><wbr> 增加内存</wbr></wbr>
<wbr><wbr> 减少OS 程序使用内存资源,如Oracle 减少SGA_target 或Memory_Target(11g)</wbr></wbr>
<wbr><wbr> 增大交换空间</wbr></wbr>
你可以通过vmstat 来看当前Swap 活动的状态。
Swap 下面的Si 和So 分别显示Swap 页面交换进来和交换出去。
[root@itc-test9 ~]# vmstat 3 8
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b<wbr><wbr> swpd<wbr><wbr> free<wbr><wbr> buff cache<wbr><wbr> si<wbr><wbr> so<wbr><wbr><wbr> bi<wbr><wbr><wbr> bo<wbr><wbr> in<wbr><wbr><wbr> cs us sy id wa<br>0 0<wbr><wbr><wbr> 164 175468 59292 1520344<wbr><wbr><wbr> 0<wbr><wbr><wbr> 0<wbr><wbr><wbr><wbr> 1<wbr><wbr><wbr> 21<wbr><wbr><wbr> 4<wbr><wbr><wbr> 20 0 0 99 0<br>0 0<wbr><wbr><wbr> 164 175532 59292 1520344<wbr><wbr><wbr> 0<wbr><wbr><wbr> 0<wbr><wbr><wbr><wbr> 0<wbr><wbr><wbr> 48 1038<wbr><wbr><wbr> 41 0 0 100 0<br>0 0<wbr><wbr><wbr> 164 175532 59292 1520344<wbr><wbr><wbr> 0<wbr><wbr><wbr> 0<wbr><wbr><wbr><wbr> 0<wbr><wbr><wbr> 61 1032<wbr><wbr><wbr> 35 0 0 99 0<br>0 0<wbr><wbr><wbr> 164 175532 59292 1520344<wbr><wbr><wbr> 0<wbr><wbr><wbr> 0<wbr><wbr><wbr><wbr> 0<wbr><wbr><wbr> 11 1028<wbr><wbr><wbr> 39 0 0 100 0<br>0 0<wbr><wbr><wbr> 164 175532 59292 1520344<wbr><wbr><wbr> 0<wbr><wbr><wbr> 0<wbr><wbr><wbr><wbr> 0<wbr><wbr><wbr> 15 1024<wbr><wbr><wbr> 39 0 0 100 0</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
使用Vmstat 命令只能看当前的Swap 页面的交换入和交换出。那如何看历史Swap 信息呢。
Linux 下有一个命令可以看,那就是
[root@itc-test9 sa]# cd /var/log/sa
[root@itc-test9 sa]# ls -al |grep 13
drwxr-xr-x<wbr><wbr> 2 root root<wbr><wbr> 4096 Apr 13 00:00 .<br>-rw-r--r--<wbr><wbr> 1 root root 209328 Apr 13 17:50 sa13<br></wbr></wbr></wbr></wbr></wbr></wbr>
[root@itc-test9 sa]# date<wbr><wbr><wbr> ----今天是4/13 号</wbr></wbr></wbr>
Mon Apr 13 17:58:02 CST 2009

[root@itc-test9 sa]# ll |grep 13
-rw-r--r-- 1 root root 209328 Apr 13 17:50 sa13
[root@itc-test9 sa]# sar -W -f sa13
Linux 2.6.9-5.ELsmp (itc-test9)<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 04/13/2009</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
12:00:01 AM pswpin/s pswpout/s
12:10:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>12:20:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>12:30:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>12:40:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>12:50:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>01:00:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>01:10:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>01:20:01 AM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br><em>......(中间略去)</em></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
...... (中间略去)
03:50:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>04:00:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>04:10:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>04:20:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>04:30:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>04:40:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>04:50:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>05:00:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>05:10:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>05:20:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>05:30:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>05:40:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>05:50:01 PM<wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br>Average:<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 0.00<wbr><wbr><wbr><wbr><wbr> 0.00<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
显示从今天0点到当前的所有Swap 页面交换的数量


//////////////

Linux 的内存管理,实际上跟Windows的内存管理有很相像的地方,都是用虚拟内存这个概念。但是为什么Windows在很多还有很大物理内存的时候,却还是用到了Pagefile,所以才经常要跟一帮人吵着说Pagefile的大小,以及如何分配这个问题,在Linux中大家就不用再吵什么SWAP大小的问题,SWAP设个512M已经足够一般性的使用,如果还嫌小的话,可以考虑加块内存,要不就检查你的应用,是不是真的出现了memory leak。

在Linux下查看内存我们一般用command free

[root@nonamelinux ~]# free



total used free shared buffers cached



Mem: 386024 377116 8908 0 21280 155468



-/+ buffers/cache: 200368 185656



Swap: 393552 0 393552

下面是对这些数值的解释:

第二行(mem):

total:总计物 理内存的大小。

used:已使用多大。

free:可用有多少。

Shared:多个进程共享的内存总额。

Buffers/cached:磁盘缓存的大小。

第三行(-/+ buffers/cached):

used:已使用多大。

free:可用有多少。

第四行就不多解释了。

区别:

第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。

这两个的区别在于使用的角度来看,第二行是从OS的角度来看,因为对于OS, buffers/cached 都是属于被使用,所以他的可用内存是8908KB,已用内存是377116KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来 说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需再用到内存的时候,buffer/cached会很快地被回收。

所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.

如 上例:

185656=8908+21280+155468

接下来解释什么时候内存会被 交换,以及按什么方式交换。

当可用内存少于额定值的时候,就会开始进行交换.

如何看额 定值(RHEL4.0):

#cat /proc/meminfo

交换将通过三个途径来 减少系统中使用的物理页面的个数:

1.减少缓冲与页面cache的大小,

2.将系统V 类型的内存页面交换出去, 

3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。

事实上,少量地使用swap是不是影响到系统性能的。

下面是buffers与cached的区别。

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.

cached是用来给文件做缓冲。

那就是说:buffers是用来存储, 目录里面有什么内容,权限等等。

而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

实验:在一台没有什么应用的机器 上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。

#free



#man X



#free



#man X



#free

你可以先后比较一下free后显示buffers的大小。

另一个实验:

#free



#ls /dev



#free

你比较一下两个的大小,当然这个buffers随时都在增加,但你使用过ls的话,增加的速度会变得快,这个就是 buffers/chached的区别。


>>> Linux操作系统下的内存管理方法详解



什么是虚拟内存?

  Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。用做虚拟内存的这部分硬盘叫 对换空间。

  Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。如果知道要多少对换空间,应该用对换分区;如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。

  Linux允许同时使用多个对换分区和/或对换文件。即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。

  产生对换空间

  对换文件是普通文件,对核心没有什么特别的。唯一不同是它没有孔,用 mkswap 准备。必须在本地盘上,不能在通过NFS mount的文件系统中。

  关于孔,是重要的。对换文件保留了磁盘空间,使核心能快速对换出一页,而不必经过如文件的定位磁盘扇区的全部事情。核心只用分配给这个文件的所有扇区。由于文件中的孔意味着没有为文件中这个位置分配磁盘扇区,这对核心使用不利。

  产生没有孔的对换文件的一个好办法是通过如下命令:

$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 1024+0 records in 1024+0 records out $

  /extra-swap 是对换文件名,大小由count=给出. 大小最好是4的倍数,因为核心写出的内存页是4KB。如果不是4的倍数,最后那几KB将不可用。

  对换分区也没什么特别。就象产生其他分区一样产生;唯一的不同是它作为原始分区使用,即没有任何文件系统,最好将对换分区标记为类型82(Linux swap),虽然这对核心没有影响,但这使分区列表更清晰。

  产生对换文件或对换分区后,需要写个标记起用它,这包括核心要用的一些管理信息。命令是 mkswap , 用法如下:

  $ mkswap /extra-swap 1024 Setting up swapspace, size = 1044480 bytes $

  注意对换空间现在还没用,它存在,但核心还没用它提供虚拟内存。

  请一定小心使用mkswap , 因为它不检查文件或分区是否被其他东西使用。 你可能用mkswap 很容易地覆盖了重要文件和分区! 幸好,你只需在你安装系统时使用mkswap 。

  Linux内存管理限制了每个对换空间约为127MB(由于技术原因,实际限制是127.6875MB)。可以同时使用最多16个对换空间,总计差不多2GB。

  使用对换空间

  用swapon 将一个初始化的对换空间可用。此命令告诉核心对换空间可以用了,对换空间的路径作为参数,启动一个临时对换文件可以用如下命令:

  $ swapon /extra-swap $

  对换空间如果列入/etc/fstab ,就可自动使用。

  /dev/hda8 none swap sw 0 0 /swapfile none swap sw 0 0

  启动手稿运行命令swapon -a, 它将启动/etc/fstab 中所列的所有对换空间。因此swapon 命令只有在启动额外的对换空间时才使用。 可以用free 监视对换空间的使用,它将给出所有使用的对换空间。

  $ free total used free shared buffers Mem: 15152 14896 256 12404 2528 -/+ buffers: 12368 2784 Swap: 32452 6684 25768 $

  前一行输出(Mem:)显示物理内存。 Total列不显示核心使用的物理内存(通常大约1MB)。Used列显示被使用的内存总额(第二行不计缓冲)。 Free列显示全部没使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。后一行(Swap:)对对换空间,显示的信息类似上面。如果这行为全0,那么没使用对换空间。

  通过top ,或使用proc文件系统的/proc/meminfo 文件可以得到相同的信息。得到某个对换空间的使用信息目前还比较困难。

  可用swapoff 取消对换空间,一般不必这样,除非是临时对换空间。对换空间中的要用的页被换入(swap->RAM),如果没有足够的物理内存,就被换出 (RAM->swap,到其他对换空间)。如果没有足够的虚拟内存放进所有页面,Linux将开始震荡(thrash); 很长时间以后应该能恢复,但此时系统不可用。取消一个对换空间前,应该检查(例如用free )是否有足够的物理内存。

  用swapon -a自动使用的所有对换空间可以用swapoff -a取消。它查看文件/etc/fstab 得知要取消什么。任何手工起用的对换空间将依然使用着。

  即使有许多空闲的物理内存,有时许多对换空间也被使用着。这种情况是由于在某个时间需要对换,但后来一个占用大量物理内存的大进程终止并释放了内存。直到被换出的数据要被使用之前它们并不自动换入。不必顾虑这种情况,但知道为什么会发生这种情况会更安心。

  与其他操作系统共享对换空间

  许多操作系统内置虚拟内存。由于他们只需在运行时使用,即,不会同时,那么除了当前运行的,其他所有对换空间都浪费着。如果他们共享同一个对换空间将更有效。这是可能的但需要一些Hacking工作。 Tips-HOWTO包含了一些如何完成这项任务的忠告。

  分配对换空间

  也许有人告诉你,应该分配2倍于物理内存的对换空间,但这是个虚假的规律。下面说明如何正确:

  估计你的全部内存需求。这是你可能需要的最大量,即你要同时运行的所有程序所需的内存要求的总和。你可以同时运行你可能同时运行的所有程序试试。

  例如,如果你想运行X,你得分配8MB给他,gcc要求数MB(有些文件偶尔可能需要很大量,数十MB,但一般4MB差不多),等等。核心自己使用 1MB,Shell和一些小工具可能需要几百KB(或说,总共1MB)。不必太精确,粗略估计就行,但可以较悲观地考虑。

  记得如果将有多人同时使用系统,他们将都消耗内存。如果2个人同时运行相同的程序,总内存消耗一般并非加倍,因为代码页和共享库是单一的。

  free 和ps 命令对估计内存需求很有用。

  第一步的估计加上一些安全量。因为对程序大小的估计很可能是错误的,因为你可能忘了一些要运行的程序,并确定你有一些额外空间。应该有数MB。(分配太多对换空间比分配太少好,但不必过分,因为不使用的对换空间是浪费;见后文:关于增加对换空间。) Also,since it is nicer to deal with even numbers, you can round the value up to the next full megabyte.

  基于以上计算,你知道了你总共需要多少内存。减去你的实际物理内存,就是对换空间。 (有些版本的UNIX中,你还需要分配物理内存的映象空间,所以第二布中计算的你所需的空间就不能减)

  如果你计算的对换空间比你的实际物理内存大得多(大于好几倍以上),那么你也许需要更多的物理内存,否则系统性能将太低。

  即使计算显示你无须对换空间,最好还是至少有一些。Linux有些侵略性地使用对换空间,这样保持一定的空闲物理内存。即使内存还不为什么程序所需,Linux也会换出一些不用的内存页,这样在需要的时候就可以避免因对换的等待--即对换可以在硬盘空闲的时候提早完成。

  对换空间可以分在几个硬盘中,这有时可以提高性能,依赖于这些盘的相对速度和存取模式。你可以尝试几中方案,但要知道正确地尝试是很困难的。不要相信某种方案比其他方案好的断定,因为它不会总是对的。

  高速缓存

  与存取(真正的)内存相比,从磁盘读是很慢的另外,在相对短的一端时间里,多次读硬盘相同的部分是很常见的。例如,你可能先读了一封电子邮件,然后回复时又将它读入编辑器,然后复制它到一个文件夹时又用邮件程序读它。或者,考虑命令ls 可能被系统上的很多用户多么频繁地使用。只从磁盘读一次信息,并保持在硬盘中,知道不再需要,除了第一次读,其他都会较快。这就叫磁盘缓存disk buffering,用于此目的的内存叫buffer cache。

  不幸的是,由于内存是有限且缺乏的资源,buffer cache一般不会足够大(大到能够装下所有人可能用到的数据)。当cache满时,最长时间不用的数据将被丢弃,内存释放给最新的数据。

  磁盘缓冲也用于写操作。要写的数据经常马上又被读(例如一个源代码文件保存到文件中后又被编译器读出),所以将要写的数据放在缓冲里是个好主意。另外,只将数据放如cache而不马上写到磁盘,写操作的程序执行速度更快。写操作然后可以在后台完成,而不降低其他程序的速度。

  许多操作系统有buffer caches (即使名称不同),但并非都根据上述原理。有些是透写write-through: 数据马上写到磁盘(当然也同时写到cache) 不马上写的cache叫回写write-back。回写比透写更有效,但也更容易出错:如果系统崩溃,或电源突然掉电,或软盘在cache回写前被取出,那么cache中改变的数据将丢失。这可能意味着文件系统is not in full working order, 可能由于未写数据包含了系统记录信息的重要的变化。

  因此,千万不要不经过正常的关闭过程直接关闭电源(见6章), 或没有unmount就取出软盘(如果是mount的),或什么程序还在用着软盘,或软盘灯还在闪。 sync 命令刷新缓冲,即强制将所有未写数据写回磁盘,如果要确保所有数据安全回写,可以用它。传统的UNIX系统中,有个update 程序在后台运行,它每30秒运行一次 sync ,所以通常无须使用sync 。 Linux有一个另外的守侯程序bdflush ,它克服了sync 有时因磁盘I/O负荷太重(因为频繁的操作)而导致有时系统突然呆住的问题。

  Linux下,bdflush 由update 启动。一般无须考虑它,但如果bdflush 偶尔因为什么原因死了,核心会给出警告,此时应该手工启动它(/sbin/update )。

  cache并不真正缓冲文件,而是块,就是磁盘I/O的最小单元(Linux下,一般是1kB)。这样,所有的目录、超级块、其他文件系统记录数据和无文件系统磁盘都可以被缓冲。

  cache的效果决定于其大小。太小的cache几乎无用;它只能cache很少的数据,而可能在被重用前就被清除了。大小有赖于有多少数据被读写,相同的数据的存取频度。唯一的方法是实验。

  如果cache是固定大小,那么不应该太大,否则,会由于空闲内存空间太小而使用swap(也很慢)。为了最有效地使用真实内存,Linux自动使用所有空闲内存作为buffer cache,当程序需要更多内存时,自动减少cache。

  Linux下,对cache使用无须做任何工作,它完全是自动的。除了要正常关闭系统和取出软盘,无须关心cache。

你可能感兴趣的:(linux)