内存都去哪儿啦

###看到的现象###

今天在游戏服务器上使用了top 命令系统使用参数,发现内存16G 的内存用了12G, 如下

但是同时在线人数不多,机器的负载并不是很大,并发也不高, 只有900+。

而游戏的服务端代码仅仅使用了7.8G, 我们不禁会问,内存去哪里了?难道是系统自己占用的内存呢,不可能一个8核16G的机器系统自己占用了4G吧?

带着这个疑问,查阅了资料,发现其中并非表明所看到的这么简单. 我们来看以下 使用 free -m 命令

Mem 参数 解释###

  • total 内存总数: 15875 , total = used + free
  • used 已经使用的内存数: 11900
  • free 空闲的内存数: 3975
  • shared 当前已经废弃不用,总是0
  • buffers: Buffer Cache内存数: 145
  • cached: Page Cache内存数: 5561

-/+ buffers/cache的解惑

  • -buffers/cache 的内存数: 6193 (大致等于第1行的 used - buffers - cached), 反映的是被程序实实在在吃掉的内存,
  • +buffers/cache 的内存数: 9682 (大致等于第1行的 free + buffers + cached), 反映的是可以挪用的内存总数

两种cache

因为cpu速度明显快过内存, 为了提高磁盘存取效率, Linux做了一些精心的设计, 采取了两种主要Cache方式, 来做速度的过度, 这些Cache有效缩短了 I/O系统调用(如read,write,getdents)的时间。

  • Buffer Cache, 针对磁盘块的读写
  • Page Cache。针对文件inode的读写。

内存解读的区别

第1行(mem)的used/free与第2行(-/+ buffers/cache) used/free的区别在于角度的不同:

  • 第一行因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是3975M,已用内存是11900MB,其中包括,内核(OS)使用 + 应用使用的+ buffers + cached.
  • 第2行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是可用的,是为了提高文件读取的性能而设,当应用程序要用到内存的时候,buffer/cached会很快地被回收。所以从应用程序的角度来说,
1
可用内存=系统free memory + buffers + cached.

所以,回到话题开头,虽然内存显示用了12.2G,正在被应用程序使用的是7.9G 还有5.6(cache+buffer) + 4G free 可用.内存原来在这里!

获益匪浅 :)