你的内存够用吗

很多年前,刚参加工作的时候,见到组内大牛,每次处理线上故障的时候,登录服务器之后,敲入的第一个命令就是top。然后盯着不断跳动的屏幕念念有词。
多年以后,我也知道了top指令的妙用。但是我发现很多周围的人对top指令的理解还是模棱两可,特别是对内存信息的解读。我见过很多人都只看free内存,一看free内存少了,就觉得是内存不够用了。其实想判断内存够不够用不能光看free 这个值。下面我结合具体的top输出,跟大家说说我是如何使用top 判断机器内存情况的。

top输出的内容如下,注意,我手动加入了一条分割线并对前五行做了编号,实际输出是没有的。

1
2
3
4
5
6
7
8
9
10
11
12
1. top - 09:03:45 up 620 days, 10:53,  1 user,  load average: 0.09, 0.16, 0.17
2. Tasks: 294 total, 1 running, 293 sleeping, 0 stopped, 0 zombie
3. Cpu(s): 1.1%us, 0.9%sy, 0.0%ni, 97.0%id, 0.0%wa, 0.0%hi, 0.9%si, 0.0%st
4. Mem: 33268224k total, 18831220k used, 14437004k free, 1036320k buffers
5. Swap: 4194300k total, 82768k used, 4111532k free, 15287648k cached
--------------------------------------------------------------

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
59674 daemon 20 0 4966m 18m 2368 S 2.0 0.1 0:02.80 httpd
56444 daemon 20 0 4966m 18m 2348 S 1.7 0.1 0:03.80 httpd
60951 daemon 20 0 4966m 17m 2348 S 1.7 0.1 0:01.54 httpd
53238 daemon 20 0 4966m 18m 2348 S 1.3 0.1 0:04.87 httpd
分割线以上

这部分列出的是系统总体信息。
第一行是系统当前时间,系统运行时间,负载值等等。第二行是系统任务运行情况,比如有多少任务,有多少在运行中。第三行是CPU相关信息。第四行是物理内存使用情况。第五行时swap区使用情况

分割线以下

这部分显示的是各个进程的信息。每一行就是一个进程。
从左至右依次 PID(进程号),USER(启动进程的用户),PR(进程优先级),NI(nice值)。VIRT( 虚拟内存),RES(常驻内存),SHR(共享内存),S(进程状态),%CPU(上次更新到现在的CPU时间占用百分比),%MEM(占用物理内存百分比),TIME+(进程使用CPU时间总计),COMMAND(运行进程的命令)。

与系统内存相关的信息

既然要说内存,那么我们就只关注跟内存相关的信息。分割线以上,第四行与第五行是跟内存相关的信息。
第四行表示物理内存使用情况。依次是 total(总物理内存),used(使用中的内存),free(空闲内存),以及buffer的内存。
第五行表示Swap使用情况,依次是 total(swap内存总量),used(使用中的虚拟内存),free(空闲的虚拟内存),以及缓存的虚拟内存。

前面我们说了,不能光看free的值,因为Linux内核对于内存是只借不还。简单来说就是,内核发现内存不够了就去申请,用完了之后也不还,所以free的数量就会越来越小。那么如何计算剩余内存呢?可以简单的这样估算 剩余内存=物理剩余内存+物理buffer+swap cache。如果判断系统内存是否够用,也可以看第五行的used值是否不断变动,如果频繁变动说明内核不断进行内存和swap的数据交换,物理内存可能不够用了。

与进程相关的内存信息

说完了系统内存,我们还要关注各个进程占用内存情况。这样才能评估系统能够启动多少进程(我上面的截图是Apache服务器,Apache会启动多个httpd进程提供web服务,所以评估能够启动多少httpd进程对评估系统的极限值至关重要)。

这里重点关注分割线以下的内容。里面有三个比较重要的内存概念,分别是VIRT,RES,SHR.

虚拟内存(VIRT: virtual memory usage):进程所使用的虚拟内存大小。
共享内存(SHR: shared memory):与其他进程共享的内存,比如公共的Lib库。
常驻内存(RES: resident memory usage):内核为进程分配的物理内存大小,其中包含了部分共享内存。

因为SHR可能会被多个进程所共享,所以系统中所有进程的RES加起来很可能会超过总的物理内存数量。

Linux管理内存就是把所有物理内存都映射为虚拟内存。Linux内存相关的知识具体可以参考这篇文章

举个例子

为了方便大家理解上面的概念,我给大家举个小例子,不一定完全准确,但一定利于你理解。
比如你家有三个孩子。你爹准备了20W块钱给你们上大学用。你大哥跟你爹要了3W作为学费以及一年的生活费,你二哥也要了3W ,你也要了3W。开学之后你们各自交了8千的学费。你爹为了方便你们出行,又用10W块钱给你们买了辆车,这样你爹就还剩1W块钱存款。
上面的例子中,你们每个人都是一个进程,你爹的20W就是物理内存大小。手里剩下的1W就是free内存,你们每个人要的3W块钱就是VIRT,交的8K学费就是RES。你爹花10万购买的车就是共享内存。

结束

技术人员太爱钻牛角尖,这样有的时候是好事儿,有的时候就不是什么好事儿了。我们评估内存的时候或者机器性能的时候,也没有必要做到百分百的精准,有个大概值就OK了。
最后,我上面的例子中httpd的res内存为18M左右,大家可以帮忙算一下还可以启动多少httpd进程。

-------------本文结束-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%