很多年前,刚参加工作的时候,见到组内大牛,每次处理线上故障的时候,登录服务器之后,敲入的第一个命令就是top
。然后盯着不断跳动的屏幕念念有词。
多年以后,我也知道了top
指令的妙用。但是我发现很多周围的人对top
指令的理解还是模棱两可,特别是对内存信息的解读。我见过很多人都只看free
内存,一看free
内存少了,就觉得是内存不够用了。其实想判断内存够不够用不能光看free
这个值。下面我结合具体的top
输出,跟大家说说我是如何使用top
判断机器内存情况的。
top
输出的内容如下,注意,我手动加入了一条分割线并对前五行做了编号,实际输出是没有的。
1 | 1. top - 09:03:45 up 620 days, 10:53, 1 user, load average: 0.09, 0.16, 0.17 |
分割线以上
这部分列出的是系统总体信息。
第一行是系统当前时间,系统运行时间,负载值等等。第二行是系统任务运行情况,比如有多少任务,有多少在运行中。第三行是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进程。