工作机制:
Linux虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。虚拟内存的硬盘部分被称为交换空间。Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。
磁盘缓冲技术作用:一方面,被写入磁盘的数据常常会很快地又被读出,所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。
free是系统自带的,常用的监控工具,用于显示已使用物理内存和交换空间,相对于top命令,free提供了更简洁的查看内存的使用情况。free命令由procps.*.rpm提供,free命令的所有输出值都是从/proc/meminfo中读出的:
[[email protected] ~]# cat /proc/meminfo MemTotal: 8182340 kB MemFree: 7541876 kB Buffers: 28224 kB Cached: 306136 kB SwapCached: 0 kB Active: 121164 kB Inactive: 290056 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 8182340 kB LowFree: 7541876 kB SwapTotal: 4095992 kB SwapFree: 4095992 kB Dirty: 36 kB Writeback: 0 kB AnonPages: 76860 kB Mapped: 27336 kB Slab: 194132 kB PageTables: 8032 kB NFS_Unstable: 0 kB Bounce: 0 kB CommitLimit: 8187160 kB Committed_AS: 1254860 kB VmallocTotal: 34359738367 kB VmallocUsed: 2196 kB VmallocChunk: 34359736151 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 Hugepagesize: 2048 kB
命令详解:
# free -m total used free shared buffers cached Mem: 7990 625 7365 0 127 200 -/+ buffers/cache: 298 7692 Swap: 3999 0 3999
- 第二行:Mem部分==>内存使用(系统级别)
total 内存总数 : 7990
used 已用内存数: 625 #系统级别总共内存使用数
free 空闲内存数: 7365 #系统级别纯粹空闲内存数
shared 共享内存数:0 #此项已废弃,一般为0
buffers 缓存内存数: 127 #预留给准备写入硬盘做的缓冲;
cached 缓存内存数: 200 #预留给以后使用的缓冲,该数据已经从硬盘中读取;
物理内存总共大小:
total(7990) = used(625) + free(7365)
= used(-/+ buffers/cache) + free(-/+
buffers/cache)
系统实际分配内存大小:
Used(Mem) = used(-/+ buffers/cache)+ buffers(Mem) + cached(Mem)
625 = 298 + 127 + 200
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.
- 第三行:-/+buffers/cache部分==>内存使用(程序级别)
实际可用内存大小:
free(-/+ buffers/cache)= free(Mem) + buffers(Mem) + cached(Mem);
7692 = 7365 + 127 + 200
- 第四行:Swap space部分==>交换空间(硬盘空间)
很好理解,故不做解释!
参数介绍:
free [-b|-k|-m|-g] [-l] [-o] [-t] [-sdelay ] [-c count]
-b, --bytes #输出以比特方式显示 -k, --kb #输出以KB方式显示,这是系统默认项 -m, --mb #输出以MB方式显示,这是常用项,比较清晰 -g, --gb #输出以GB方式显示 -l, --lowhigh #显示详细信息 -o, --old #旧格式显示,不显示-/+ buffers/cache项 -t, --total #显示总共物理内存和交换区间 -c n, --count=n #显示统计的次数,n默认为1 次 -s n, --repeat=n #间隔秒数,持续观察内存使用情况 -V, --version #显示版本信息 --help #显示帮助信息
常用例子:
- 例子1: 以KB,MB,GB的方式显示内存使用情况
# free -k total used free shared buffers cached Mem: 8027952 5323952 2704000 0 116876 1626940 -/+ buffers/cache: 3580136 4447816 Swap: 15624188 603792 15020396 # free -m total used free shared buffers cached Mem: 7839 5197 2642 0 114 1588 -/+ buffers/cache: 3495 4344 Swap: 15257 589 14668 # free -g total used free shared buffers cached Mem: 7 5 2 0 0 1 -/+ buffers/cache: 3 4 Swap: 14 0 14
- 例子2: 显示物体内存、交换空间总的使用情况
# free -t total used free shared buffers cached Mem: 8027 5369 2658 0 117 1634 -/+ buffers/cache: 3617 4410 Swap: 15624 603 15020 Total: 23652 5972 17679
- 例子3: 每隔1秒,显示内存输出情况
#free -k -s 1 total used free shared buffers cached Mem: 8027952 5370220 2657732 0 117376 1635144 -/+ buffers/cache: 3617700 4410252 Swap: 15624188 603788 15020400 total used free shared buffers cached Mem: 8027952 5367244 2660708 0 117392 1635272 -/+ buffers/cache: 3614580 4413372 Swap: 15624188 603788 15020400 total used free shared buffers cached Mem: 8027952 5367556 2660396 0 117392 1635272 -/+ buffers/cache: 3614892 4413060 Swap: 15624188 603788 15020400 total used free shared buffers cached Mem: 8027952 5367388 2660564 0 117392 1635272 -/+ buffers/cache: 3614724 4413228 Swap: 15624188 603788 15020400
- 例子4: 持续监控内存输出情况
# watch -n 1 -d free # -n 2 //-->统计2次 # -d //-->difference # watch free //-->持续监控内存的使用情况
其他说明:
- free, top命令,其中数据主要取自/proc目录,相关的目录文件:
/proc/meminfo #机器的内存使用信息 /proc/pid/maps #pid为进程号,显示当前进程所占用的虚拟地址。 /proc/kcore #内存镜像文件 [[email protected] ~]# ll -h /proc/kcore -r——– 1 root root 4.1G Jun 12 12:04 /proc/kcore /proc/pid/statm #进程所占用的内存 [[email protected] ~]# cat /proc/self/statm 654 57 44 0 0 334 0
- swap space配置问题
分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。 如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。因此Swap空间的分配是很重要的。 通常情况下,Swap空间的大小应是物理内存的2-2.5倍,最小不应小于64M。根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,一般来说对于4G以下的物理内存,配置2倍的swap,4G 以上配置1倍。 另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。