频道栏目
IT货架 > > 正文
Linux停判断内存使用的一些方法和说明【转】 >>> Linux操作系统下的内存管理方法详解
网友分享于:Jun 12, 2018 10:45:36 PM    来源: IT货架   
Linux下判断内存使用的一些方法和说明【转】
第一部分:查看内存使用状况
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,   1 running, 94 sleeping,   0 stopped,   0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.5% id, 0.5% wa, 0.0% hi, 0.0% si
Mem:   2056000k total, 1963652k used,    92348k free ,    59156k buffers
Swap: 4096564k total,      164k used, 4096400k free, 1605276k cached
PID USER      PR NI VIRT RES SHR S %CPU %MEM    TIME+ COMMAND
1 root      16   0 4744 552 460 S 0.0 0.0   0:00.46 init
从Top 显示来看是有1963652K 已经使用,只有92348k 内存空闲。一直问我是否内存不足了。下面就来解释一下Oracle 在Linux 下如何查看OS 内存是否不足。
但我们从Linux command free 来看:


[oracle@itc-test9 ~]free
total       used       free     shared    buffers     cached
Mem:       2056000    1869596     186404          0      59172    1512236
-/+ buffers/cache:     298188   
1757812
Swap:      4096564        164    4096400

-/+ buffers/cache:     used=298188k =291.2M
                        free=1757812k=1716.6M   约等于2G。
从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:   2056000k total, 1963652k used,    92348k free 很少。
第二部分:查看Swap 的状况:
Swap 空间的使用状况也能分辨出Oracle 服务器内存是否已经吃紧。
先看Swap 大小设定:
RAM Size    Swap Size
1-2G         1.5 倍 RAM
2-8G         1 倍 RAM
>8G          0.75 RAM
基本上每个操做系统(除Windows)都建议Swap 使用上面比例的配置。
但根据个人经验如果Server 的Memory >32G 时,一般都会将Swap 空间设置在10g 以内,甚至更小。
使用Command more /proc/meminfo 或top 来Monitor Swap 的使用状况。
[root@itc-test9 ~]# more /proc/meminfo
MemTotal:      2056000 kB
MemFree:        177268 kB
Buffers:         59292 kB
Cached:        1519188 kB
SwapCached:          4 kB
Active:        1092248 kB
Inactive:       654096 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      2056000 kB
LowFree:        177268 kB
SwapTotal:     4096564 kB
SwapFree:      4096400 kB

[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,   1 running, 94 sleeping,   0 stopped,   0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.5% id, 0.5% wa, 0.0% hi, 0.0% si
Mem:   2056000k total, 1963652k used,    92348k free ,    59156k buffers
Swap: 4096564k total,      164k used, 4096400k free, 1605276k cached
如果你观察Swap 中的使用量一直在增加,或Swap used 为一个很大的值。那我们基本就能确定在现有的状况下Oracle server 内存出现问题。(我们需要考虑此现象是偶尔发生还是一直出现)
我们需要做:
   增加内存
   减少OS 程序使用内存资源,如Oracle 减少SGA_target 或Memory_Target(11g)
   增大交换空间
你可以通过vmstat 来看当前Swap 活动的状态。
Swap 下面的Si 和So 分别显示Swap 页面交换进来和交换出去。
[root@itc-test9 ~]# vmstat 3 8
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b   swpd   free   buff cache   si   so    bi    bo   in    cs us sy id wa
0 0    164 175468 59292 1520344    0    0     1    21    4    20 0 0 99 0
0 0    164 175532 59292 1520344    0    0     0    48 1038    41 0 0 100 0
0 0    164 175532 59292 1520344    0    0     0    61 1032    35 0 0 99 0
0 0    164 175532 59292 1520344    0    0     0    11 1028    39 0 0 100 0
0 0    164 175532 59292 1520344    0    0     0    15 1024    39 0 0 100 0
使用Vmstat 命令只能看当前的Swap 页面的交换入和交换出。那如何看历史Swap 信息呢。
Linux 下有一个命令可以看,那就是
[root@itc-test9 sa]# cd /var/log/sa
[root@itc-test9 sa]# ls -al |grep 13
drwxr-xr-x   2 root root   4096 Apr 13 00:00 .
-rw-r--r--   1 root root 209328 Apr 13 17:50 sa13
[root@itc-test9 sa]# date    ----今天是4/13 号
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)         04/13/2009
12:00:01 AM pswpin/s pswpout/s
12:10:01 AM      0.00      0.00
12:20:01 AM      0.00      0.00
12:30:01 AM      0.00      0.00
12:40:01 AM      0.00      0.00
12:50:01 AM      0.00      0.00
01:00:01 AM      0.00      0.00
01:10:01 AM      0.00      0.00
01:20:01 AM      0.00      0.00
......(中间略去)
...... (中间略去)
03:50:01 PM      0.00      0.00
04:00:01 PM      0.00      0.00
04:10:01 PM      0.00      0.00
04:20:01 PM      0.00      0.00
04:30:01 PM      0.00      0.00
04:40:01 PM      0.00      0.00
04:50:01 PM      0.00      0.00
05:00:01 PM      0.00      0.00
05:10:01 PM      0.00      0.00
05:20:01 PM      0.00      0.00
05:30:01 PM      0.00      0.00
05:40:01 PM      0.00      0.00
05:50:01 PM      0.00      0.00
Average:         0.00      0.00
显示从今天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。

广告服务联系QQ:1134687142 | 网站地图

版权所有: IT货架- 内容来自互联网,仅供用于技术学习,请遵循相关法律法规. 京ICP备11030978号-1