`
yanghuidang
  • 浏览: 910376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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服务器性能测试工具,服务器压力测试

    通过网上收集和对LINUX服务器性能的分析和体验,整理了几个比较实用,功能比较强大的性能测试工具供亲们下载,虽然网络上都对每个工具做了详细的功能介绍和文档说明,但分得很散,所以, 在此本人将各个比较实用的...

    入门学习Linux常用必会60个命令实例详解doc/txt

    本文以Mandrake Linux 9.1(Kenrel 2.4.21)为例,介绍Linux下的安装和登录命令。 immortality按:请用ctrl+f在本页中查找某一部分的内容或某一命令的用法。 ----------------------------------------------------...

    Linux-0.11 [内核源代码带中文注释]

    从linux 内核0.95 版后已经使用与现在相同的命名方法了。 entry start ! 告知连接程序,程序从start 标号开始执行。 start: ! 47--56 行作用是将自身(bootsect)从目前段位置0x07c0(31k) ! 移动到0x9000(576k)处,...

    基于C++实现的HTTP服务器改进版源码+项目使用说明+详细注释.zip

    新信息读入会读取数据集并修改时间结点),基于sigaction形式实现对信号和信号处理函数的绑定,信号处理函数向管道发送信号消息,主线程监听到管道消息读入后判断信号类别,并进行关闭连接操作。\ **3)Http响应...

    pub类库

    在空闲时间,看看两年前的那些零散类文件,开始整理这些类成库,并写了简单的使用和测试范例,放在网上和朋友们共享。 由于早期的平台从windows98和VC6.0,redhat8.0,经历了些变迁,没有太多的时间再一一仔细测试...

    构筑Linux防火墙之IPtables的概念与用法

    一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方指定表名。当然,把表名放在开始处已经是约定俗成的标准。尽管命令...

    服务器运维管理手册.doc

    进程监控 任务管理器——进程 查看进程的CPU使用率和内存使用率是否超阀值 3. CPU性能 任务管理器——性能 查看CPU最高峰值与一般使用率是否超阀值 4. 内存性能 任务管理器——性能 查看内存最高峰值与一般使用率...

    基于 Lemon + LemonPlus 的轻量评测系统源码+项目说明(高分毕设).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,...- 在 Linux 下,默认的栈空间设置为和内存限制相同。 - 自定义测

    传智播客扫地僧视频讲义源码

    11_项目中检索内存泄漏使用和基本原理 12_动态库基本知识和环境调试注意 13_动态库内存释放问题 源码及文档 01_上一次课程回顾 02_链表热身_结构体中套元素和指针 03_结构体数据类型的嵌套定义和函数的嵌套调用是两...

    Java面试宝典2010版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 71、说出一些常用的类,包,接口,请各举5个 72、java中有几种...

    windows实用dos命令大全

    1.功能:显示磁盘状态、内存状态和指定路径下指定文件的不连续数目。  2.类型:外部命令  3.格式:CHKDSK [盘符:][路径][文件名][/F][/V]  4.使用说明:  (1)选用[文件名]参数,则显示该文件占用磁盘的...

    电子商务网站详细设计.doc

    如果上述两个条件都符合,则判断该用 户是否为合法用户,如果是合法用户,则可以登录,同时将用户的ID代号和用户名保存 在Session对象中,以便其他页使用。 ddlClassBind类 绑定商品类别名和商品图像名、 3.3公共类...

    grub4dos-V0.4.6a-2017-02-04更新

    执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....

    最新Java面试宝典pdf版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    FengCms 网站内容管理系统 v1.32 Beta.zip

    PS:安装在linux服务器下要注意给以下目录文件夹和其下的子文件777权限。 /admin/app/dbbackup 数据库备份目录 /admin/app/cache 后台缓存文件 /app/cache 前台缓存文件 /template 模版目录 /css 样式目录 /...

    Super-EC破解版

    ' 增加"易语言类"中"是否易程序",判断指定的EC模块或E源代码文件是否有效的易语言程序,若有效的易程序取易程序信息或转换易程序类型等失败则说明密码错误! ' 增加"易语言类"中"转换易程序类型",转换指定的EC模块或E...

    Java面试笔试资料大全

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    Java面试宝典-经典

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    JAVA面试宝典2010

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

Global site tag (gtag.js) - Google Analytics