资源监控
1
、
free
内存监控
语 法:
free [-bkmotV][-s <
间隔秒数
>]
补充说明:
free
指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以
及系统核心使用的缓冲区等。
参 数:
-b
以
Byte
为单位显示内存使用情况。
-k
以
KB
为单位显示内存使用情况。
-m
以
MB
为单位显示内存使用情况。
-o
不显示缓冲区调节列。
-s<
间隔秒数
>
持续观察内存使用状况。
-t
显示内存总和列。
-V
显示版本信息。
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况
第 1 行 Mem: total:表示物理内存总量。
used:表示总计分配给缓存(包含 buffers 与 cache )使用的数量,但其中可能部分缓存并未实际使
用。
free:未被分配的内存。
shared:共享内存,一般系统不会用到,这里也不讨论。
buffers:系统分配但未被使用的 buffers 数量。
cached:系统分配但未被使用的 cache 数量。buffer 与 cache 的区别见后面。 total = used + free
第 2 行 -/+ buffers/cached: used:也就是第一行中的 used – buffers-cached 也是实际使用的内
存总量。
free:未被使用的 buffers 与 cache 和未被分配的内存之和,这就是系统当前实际可用内存。 free 2=
buffers1 + cached1 + free1 //free2 为第二行、buffers1 等为第一行
A buffer is something that has yet to be “written” to disk. A cache is something that has
been “read” from the disk and stored for later use 第 3 行: 第三行所指的是从应用程序角度
来看,对于应用程序来说,buffers/cached 是等于可用的,因为 buffer/cached 是为了提高文件读取
的性能,当应用程序需在用到内存的时候,buffer/cached 会很快地被回收。
所以从应用程序的角度来说,可用内存=系统 free memory+buffers+cached.
接下来解释什么时候内存会被交换,以及按什么方交换。
当可用内存少于额定值的时候,就会开会进行交换,如何看额定值(
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 将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,
系统会自动释放(不像 windows 那样,即使你有很多空闲内存,他也要访问一下磁盘中的 pagefiles)
使用 free 命令
将 used 的值减去 buffer 和 cache 的值就是你当前真实内存使用 ————– 对操作系统 来讲是
Mem 的参数.buffers/cached 都是属于被使用,所以它认为 free 只有 16936 .
对应用程序 来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为 buffer/cached 是为 了
提高 程序执行的性能, 当程序使用内存时,buffer/cached 会很快地被使用。 所以,以应用来看看,
以(-/+ buffers/cache)的 free 和 used 为主.所以我们看这个就好了.另外告诉大家 一些常识.Linux
为了提高磁盘和内存存取效率, Linux 做了很多精心的设计, 除了对 dentry 进行缓存(用于 VFS,加速
文件路径名到 inode 的转换), 还采取了两种主要 Cache 方式:Buffer Cache 和 Page Cache。 前者针
对磁盘块的读写,后者针对文件 inode 的读写。这些 Cache 能有效缩短了 I/O 系统调用(比如
read,write,getdents)的时间。 记住内存是拿来用的,不是拿来看的. 不象 windows,无论你的真实物
理内存有多少,他都要拿硬盘交换 文件来读.这也就是 windows 为什么常常提示虚拟空间不足的原因.
你们想想,多无聊,在内存还有大部分 的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.
所以我们看 linux,只要不用 swap 的交换 空间,就不用担心自己的内存太少.如果常常 swap 用很多,可
能你就要考虑加物理内存了.这也是 linux 看 内存是否够用的标准哦
.
[root@scs-2 tmp]# free
total used free shared buffers cached
Mem: 3266180 3250004 16176 0 110652 2668236
-/+ buffers/cache: 471116 2795064
Swap: 2048276 80160 1968116
下面是对这些数值的解释:
total:
总计物理内存的大小。
used:
已使用多大。
free:
可用有多少。
Shared:
多个进程共享的内存总额。
Buffers/cached:
磁盘缓存的大小。
第三行
(-/+ buffers/cached):
used:
已使用多大。
free:
可用有多少。
第四行就不多解释了。
区别:第二行
(mem)
的
used/free
与第三行
(-/+ buffers/cache) used/free
的区别。 这两个的区别在于使用
的角度来看,第一行是从
OS
的角度来看,因为对于
OS
,
buffers/cached
都是属于被使用,所以他的可
用内存是
16176KB,
已用内存是
3250004KB,
其中包括,内核(
OS
)使用
+Application(X, oracle,etc)
使用的
+buffers+cached.
第三行所指的是从应用程序角度来看,对于应用程序来说,
buffers/cached
是等于可用的,因为
buffer/cached
是为了提高文件读取的性能,当应用程序需在用到内存的时候,
buffer/cached
会很快地被
回收。
所以从应用程序的角度来说,可用内存
=
系统
free memory+buffers+cached
。
如上例:
2795064=16176+110652+2668236
接下来解释什么时候内存会被交换,以及按什么方交换。 当可用内存少于额定值的时候,就会开会进
行交换。
如何看额定值:
cat /proc/meminfo
[root@scs-2 tmp]# cat /proc/meminfo
MemTotal: 3266180 kB
MemFree: 17456 kB
Buffers: 111328 kB
Cached: 2664024 kB
SwapCached: 0 kB
Active: 467236 kB
Inactive: 2644928 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 3266180 kB
LowFree: 17456 kB
SwapTotal: 2048276 kB
SwapFree: 1968116 kB
Dirty: 8 kB
Writeback: 0 kB
Mapped: 345360 kB
Slab: 112344 kB
Committed_AS: 535292 kB
PageTables: 2340 kB
VmallocTotal: 536870911 kB
VmallocUsed: 272696 kB
VmallocChunk: 536598175 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
用
free -m
查看的结果:
[root@scs-2 tmp]# free -m
total used free shared buffers cached
Mem: 3189 3173 16 0 107 2605
-/+ buffers/cache: 460 2729
Swap: 2000 78 1921
查看
/proc/kcore
文件的大小(内存镜像):
[root@scs-2 tmp]# ll -h /proc/kcore
-r-------- 1 root root 4.1G Jun 12 12:04 /proc/kcore
备注:
占用内存的测量
测量一个进程占用了多少内存,
linux
为我们提供了一个很方便的方法,
/proc
目录为我们提供了所有的
信息,实际上
top
等工具也通过这里来获取相应的信息。
/proc/meminfo
机器的内存使用信息
/proc/pid/maps pid
为进程号,显示当前进程所占用的虚拟地址。
/proc/pid/statm
进程所占用的内存
[root@localhost ~]# cat /proc/self/statm
654 57 44 0 0 334 0
输出解释
CPU
以及
CPU0
。。。的每行的每个参数意思(以第一行为例)为:
参数 解释
/proc//status
Size (pages)
任务虚拟地址空间的大小
VmSize/4
Resident(pages)
应用程序正在使用的物理内存的大小
VmRSS/4
Shared(pages)
共享页数
0
Trs(pages)
程序所拥有的可执行虚拟内存的大小
VmExe/4
Lrs(pages)
被映像到任务的虚拟内存空间的库的大小
VmLib/4
Drs(pages)
程序数据段和用户态的栈的大小 (
VmData+ VmStk
)
4
dt(pages) 04
查看机器可用内存
/proc/28248/>free
total used free shared buffers cached
Mem: 1023788 926400 97388 0 134668 503688
-/+ buffers/cache: 288044 735744
Swap: 1959920 89608 1870312
我们通过
free
命令查看机器空闲内存时,会发现
free
的值很小。这主要是因为,在
linux
中有这么一种
思想,内存不用白不用,因此它尽可能的
cache
和
buffer
一些数据,以方便下次使用。但实际上这些内
存也是可以立刻拿来使用的。
所以 空闲内存
=free+buffers+cached=total-used
2
、
vmstat
很显然从名字中我们就可以知道
vmstat
是一个查看虚拟内存(
Virtual Memory
)使用状况的工具,但
是怎样通过
vmstat
来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回顾一下
Linux
中关于虚拟
内存相关内容。