对付系统内存泄露,我们首先使用“sar –r”,从系统日志/var/log/sa或者最近1天的结果,它能初略的估计系统是否有内存泄露。如果sar波动情况很大,我们就需要使用其它工具如free/top/pmap帮助定位最终的问题。 我们在今天对free进行介绍。
从sar结果中,如果内存使用〉90,这并不能说明就有泄漏。我们还需要考虑cache和buffer列。下面是一些个人对于free工具的理解:
- Cached我们可以认为就是free, 如果内存用光了. The ‘cache’ or ‘buffer’能很快转化为free.
- -/+ buffers/cache是从application角度显示内存显示情况. 我们使用它来判断真正的内存泄漏.
- Themem 这一行从OS角度显示内存显示情况. 实际used memory(1108)=used(7797)-buffers(498)-cached(6189) 。
- 我们能使用“free –k –s <delay>” or “free –m –s <delay>” 去收集free数据
- 在实时realtime系统中,如果有swap内存被使用。我们就要千万小心。因为可能系统性能会有影响。
- 像cp之类的命令能立即增加cached的使用率.
SYNOPSIS
usage: free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]
XX35-0-0-9:/root-#free –m –s 10
| total | used | free | shared | buffers | cached |
Mem: | 7861 | 7797 | 64 | 0 | 498 | 6189 |
-/+ buffers/cache: |
| 1108 | 6753 |
|
|
|
Swap: | 4110 | 0 | 4110 |
|
|
|
|
|
|
|
|
|
|
total |
| used | free | shared | buffers | cached |
Mem: | 7861 | 7777 | 84 | 0 | 498 | 6189 |
-/+ buffers/cache: |
| 1088 | 6772 |
|
|
|
Swap: | 4110 | 0 | 4110 |
|
|
|
disk buffer 保存最近访问disk的信息在内存;如果同一份数据被再次使用,OS直接从内存取数据而不用访问硬盘,极大的改善系统性能。以下就是这么一个example,我们准备拷贝同一个文件两次,你会发现两次用的时间不在1个数量级。
bjlinc1079 >ls -ltr *.out ß 我们有一个 300M file
-rw-rw-r-- 1 canhuali bicbj354148300 Dec 20 2010 Multi-IMSI_All.out
bjlinc1079 >free
total used free shared buffers cached
Mem: 8168704 5206884 2961820 0 167080 429112 ßcached 使用了429M. 从OS看,2.9G 内存在free
-/+ buffers/cache: 4610692 3558012 ß 从application看, 还有3.5G可用
Swap: 2040244 1732800 307444
bjlinc1079 >time cp Multi-IMSI_All.out Multi-IMSI_All.out.old ß第一次cp花费20.69s
0.009u 0.804s0:20.69 3.8% 0+0k 0+0io 1pf+0w
bjlinc1079 <27:canhuali>free
total used free shared buffers cached
Mem: 8168704 5732540 2436164 0 167688 946800 ß cp之后cached增加至946M
-/+ buffers/cache: 4618052 3550652
Swap: 2040244 1732800 307444
bjlinc1079 >time cp Multi-IMSI_All.out Multi-IMSI_All.out.old2 ß第2次cp只用了0.74s.
0.007u 0.711s0:00.74 95.9% 0+0k 0+0io 0pf+0w
bjlinc1079 >
以下是一些概念,从其它地方翻译过来的。
“total” 内存是在系统内核启动后总共内存的数量。我们会发现它会小于实际的物理内存,因为有一部分系统内核我们是不能把它们变为free的。
任何已经被用于processes或者磁盘缓冲的都被认为 “used.” cache和buffered包含在used里面。
当前系统没有使用的内存是 “free” 。
total=free+used
“shared” 表示有多少内存被多一个process共享. 像shell,一般会启动多个process. 可执行代码是只读 read-only并被所有同类shell共享.
“buffers” 指示多少内存正被disk buffering.
“free” 同时会显示swap的使用情况.
buffers and cache的不同
Buffer存放的一些关于磁盘信息或者文件节点信息的缓存,而cache是文件本身内容的缓存。第一比方就是buffer就是一些索引卡片,而cache就是书架,上面放的是书。
Buffers are associated with a specific block device, and cover caching of file system metadata as well as tracking in-flight pages. The cache only contains parked file data. That is, the buffers remember what's in directories, what file permissions are, and keep track of what memory is being written from or read to for a particular block device. The cache only contains the contents of the files themselves.