Linux使用free命令查看实际内存占用

转自: http://www.cnblogs.com/pengdonglin137/p/3315124.html

Linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free -m方式查看内存占用情况(兆为单位)。而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内存有如下几个加减法:

  • used=total-free total=used+free
  • 实际内存占用:used-buffers-cached total-free-buffers-cached
  • 实际可用内存:buffers+cached+free

                   total       used       free     shared    buffers     cached
Mem:            128        119           8          0            1               22
-/+ buffers/cache:        95          32
swap:          255            0         255

第1行Mem数据:

  • total 内存总数: 128
  • used 已经使用的内存数: 119
  • free 空闲的内存数: 8
  • shared 当前已经废弃不用,总是0
  • buffers Buffer Cache内存数: 1
  • cached Page Cache内存数: 22

第2行-/+ buffers/cache:

  • -buffers/cache 的内存数:95 (等于第1行的 used - buffers - cached)
  • +buffers/cache 的内存数: 32 (等于第1行的 free + buffers + cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

第三行数据是交换分区SWAP的,也就是我们通常所说的虚拟内存。

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

感兴趣的可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。

系统管理员必须维护他们服务器的健康运行。其中一个重要的部分就是内存。当服务器内存使用率过高时,它会降低服务器的性能。Linux有一个称为 free 的工具,来监控内存使用率。

102015J55-0

free 命令是什么

free 命令是一个显示系统中空闲和已用内存大小的工具。free 命令的输出和 top 命令相似。大多数Linux发行版已经含有 free 命令。

如何运行 free

想要运行,只需在控制台输入free 即可。不带选项运行会显示一个以KB为单位的默认输出。

$ free
10201512c-1

从上面的截图我们看到:

内存 (以KB计)
  • Total(全部) : 1026740
  • Used(已用) : 843396
  • Free(可用) : 183344
  • Shared(共享) : 0
  • Buffers(块设备缓存区) : 52704
  • Cached(文件缓存) : 376384

译注:关于Buffers和Cached的区别,来自 http://www.taobaotesting.com/blogs/qa?bid=2265 的一段解释如下:

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.

cached是用来给文件做缓冲。

那就是说:buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件

Swap (以KB计)
  • Total(全部) : 1045500
  • Used(已用) : 3376
  • Free(可用) : 1042124

当你看见 buffer/cache 的空闲空间低或者 swap 的空闲空间低,说明内存需要升级了。这意味这内存利用率很高。请注意 shared(共享)内存列应该被忽略 ,因为它已经被废弃了。

以其它单元显示内存信息

如我们先前提到的,默认 free 会以 KB 为单位显示信息。free 同样提供给我们 b (B), -k (KB), -m (MB), -g (GB) and –tera (TB)这些单位。要显示我们想要的单位,只要选择一个并在 free 后面跟上。下面一个是以 MB 为单位的输出样例。

$ free -m
1020154a0-2

这个技巧同样适用于-b, -k, -g 以及 –tera 选项。

以适于人类可读方式显示内存信息

free 同样提供了-h选项,这意味着适于人类可读(译注:系统上可能并不存在-h选项,已被-m取代)。那么这与其它的选项有什么不同呢,如-m(MB)选项? 可见的最大不同是-h选项会在数字后面加上适于人类可读的单位。让我们看一个例子。

$ free -h

10201553I-3

如我们一起看到的,在1,0数字后这里是G(GB)字母。当数字并没有达到GB时,free足够聪明来知道并在每个数字后面跟上合适的单位。后面的M - 数字929告诉我们它有929MB(译注: 原文为929 number tell us its 969 Megabytes,这里应该为输入错误)。

间隔显示 free

作为一个状态检查工具,最好的统计内存利用率的方法是使用延迟间隔。这么做的话,我们可以使用-s选项后面跟上我们想要间隔的N秒数。我们可以在后面合并几个选项来使输出满足我们的需求。假如我们想要每3秒统计一次内存利用率并且适于人类可读,那么就像这样做:

$ free -hs 3
1020152151-4
显示高低内存利用率

如果我们想要知道高低内存统计,我们可以使用-l选项。下面是一个例子。

$ free -l
1020154458-5
显示 Linux 全部内存

如果我们需要每列的总计信息,我们可以在 free 命令后面跟上 -t 选项。这会在字底部额外加入一行显示。

$ free -t
1020154Y7-6
总结

除了vmstat以外,free 命令也是一个用于统计内存利用率的简单统计工具。用这个你可以快速查看你的 Linux 内存信息。free 命令使用 /proc/meminfo 作为基准来显示内存利用率信息。如往常一样,你可以在控制台下输入 man free 来获取更多关于 free 的信息。

前段时间有个项目的用C写的,性能测试时发现内存泄露问题。关于怎么观察内存使用问题,free是很好用的一个命令。

bash-3.00$ free

total       used       free     shared    buffers     cached

Mem:       1572988    1509260      63728          0      62800     277888

-/+ buffers/cache:    1168572     404416

Swap:      2096472      16628    2079844

Mem:表示物理内存统计

-/+ buffers/cached:表示物理内存的缓存统计

Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。

系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。

第1行 Mem: total:表示物理内存总量。

used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。

free:未被分配的内存。

shared:共享内存,一般系统不会用到,这里也不讨论。

buffers:系统分配但未被使用的buffers 数量。

cached:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。 total = used + free 第2行 -/+ buffers/cached: used:也就是第一行中的used - buffers-cached 也是实际使用的内存总量。

free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。 free 2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行

buffer 与cache 的区别

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 第3行: 第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.

接下来解释什么时候内存会被交换,以及按什么方交换。

当可用内存少于额定值的时候,就会开会进行交换.

如何看额定值(RHEL4.0):

#cat /proc/meminfo

交换将通过三个途径来减少系统中使用的物理页面的个数:

1.减少缓冲与页面cache的大小,

2.将系统V类型的内存页面交换出去,

3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。

事实上,少量地使用swap是不是影响到系统性能的。

下面是buffers与cached的区别。

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.

cached是用来给文件做缓冲。

那就是说:buffers是用来存储,目录里面有什么内容,权限等等。

而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。

#free

#man X

#free

#man X

#free

你可以先后比较一下free后显示buffers的大小。

另一个实验:

#free

#ls /dev

#free

你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles)

使用free命令

将used的值减去   buffer和cache的值就是你当前真实内存使用 ————– 对操作系统来讲是Mem的参数.buffers/cached 都是属于被使用,所以它认为free只有16936.

应用程序来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为buffer/cached是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。 所以,以应用来看看,以(-/+ buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家 一些常识.Linux为了提高磁盘和内存存取效率, Linux做了很多精心的设计, 除了对dentry进行缓存(用于 VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。 前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 记住内存是拿来用的,不是拿来看的.不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换 文件来读.这也就是windows为什么常常提示虚拟空间不足的原因.你们想想,多无聊,在内存还有大部分 的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不用swap的交换 空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看 内存是否够用的标准哦.

<think>好的,我现在需要回答用户关于如何在Linux查看脚本运行占用内存的问题。首先,我需要回忆自己知道的Linux内存管理相关命令。常见的命令有top、htop、ps、free,可能还有vmstat之类的工具。用户问的是具体查看脚本运行时的内存占用,所以应该专注于进程级别的监控。 用户可能是一个刚接触Linux的开发者,可能在调试或优化自己的脚本时遇到了内存问题。他们需要知道具体的命令和参数,可能还需要一些使用示例来更好地理解。因此,回答应该简洁明了,给出常用命令,并说明每个命令的特点和适用场景。 首先想到的是ps命令,它可以显示进程的信息。其中,RSS(Resident Set Size)表示进程占用的物理内存,VSZ是虚拟内存大小。但需要注意,RSS可能不是特别准确,因为它不包括共享库的内存,不过对于基本查看应该足够了。比如使用ps aux | grep 脚本名,但可能需要更具体的参数。 然后是top和htop,这两个是交互式工具,可以实时查看进程的内存使用情况。top默认可能显示的是%MEM,即内存占用百分比,而htop更直观,可能有颜色区分,但需要安装。这两个工具适合动态监控,但用户可能想要一个一次性查看命令。 接下来是free命令,但它主要显示系统总体的内存使用情况,不是针对进程的,可能不太符合用户需求。不过如果用户想了解系统整体内存情况,可以提一下。 还有vmstat,不过这个更偏向于系统整体的性能监控,包括内存、IO、CPU等,可能不太直接显示具体进程的内存使用。 另外,pmap命令可以显示进程的内存映射,可能更详细,但可能对于新手来说比较复杂。需要根据用户的需求来判断是否需要介绍。 总结下来,用户可能需要的是简单直接的命令,比如ps和top/htop。需要给出具体的使用示例,比如ps的参数组合,如何过滤出特定进程,如何查看RSS等。此外,可能需要提醒用户注意单位转换,因为默认可能是KB,而用户可能需要MB或GB。 可能还需要提到一些工具,比如smem,它提供了更详细的内存报告,但需要安装。或者使用/proc文件系统,比如查看/proc/[pid]/status文件中的VmRSS项,但这种方法需要知道进程的PID,步骤稍多。 在回答时,应该分点列出不同的方法,并简要说明每个方法的优缺点,让用户可以根据具体情况选择。例如: 1. 使用ps命令查看内存占用:给出具体命令如ps aux --sort=-%mem | grep [进程名],并解释输出中的RSS列。 2. 使用top或htop实时监控:说明如何启动这些工具,并找到目标进程。 3. 使用pmap查看详细内存映射:可能需要root权限,但可以显示更详细的信息。 4. 通过/proc文件系统查看:cat /proc/[pid]/status | grep VmRSS,需要替换pid。 同时,需要提醒用户注意内存使用的不同指标,如VSZ和RSS的区别,虚拟内存实际物理内存的不同。可能用户关心的是实际物理内存使用,所以应重点解释RSS。 另外,是否需要考虑容器环境?比如在Docker容器中,可能需要使用docker stats之类的命令,但用户的问题是关于Linux本身,可能不需要涉及容器,除非用户特别说明。 最后,可能需要给出一个综合建议,比如日常使用推荐htop,脚本中使用ps,或者需要详细分析时用pmap。或者根据用户的使用场景推荐不同的工具。 需要检查命令的正确性,比如ps的参数是否正确,是否有拼写错误。例如,ps aux的正确性,--sort的参数是否正确。另外,RSS的单位是KB,可能需要提示用户转换为MB或GB的方法,比如在命令中添加计算,或者手动换算。 可能还需要提到内存占用的一些常见误解,比如共享库的内存会被多个进程共享,所以实际物理内存占用可能小于各进程RSS之和。但用户可能只需要了解自己进程的情况,所以这点可以简要说明。 总之,回答需要结构清晰,分点列出不同方法,每个方法给出命令示例和简要说明,帮助用户快速找到适合自己的解决方案。</think>关于Linux查看脚本内存占用的常用方法: $$\begin{array}{|l|l|l|} \hline \text{命令} & \text{关键指标} & \text{单位转换公式} \\ \hline \text{ps} & \text{RSS (实际物理内存)} & \text{RSS(KB)/1024=MB} \\ \text{top} & \text{RES (同RSS)} & \text{自动适配单位} \\ \text{htop} & \text{MEM\% (内存占比)} & \text{总内存×MEM\%} \\ \hline \end{array}$$ **一、基础诊断命令** 1. **ps 命令** ```bash # 查看特定进程(示例查找python进程) ps aux | grep 'python script.py' | awk '{print $6/1024 " MB"}' # 按内存排序所有进程 ps aux --sort=-%mem ``` 输出列解析: $$\begin{cases} \text{RSS} \geq 0 & \text{物理内存占用(KB)} \\ \text{VSZ} \geq \text{RSS} & \text{虚拟内存占用(KB)} \end{cases}$$ 2. **top 实时监控** ```bash top -p $(pgrep -f 'script_name') # 定位特定PID ``` 交互操作: $$\text{Shift+M} \Rightarrow \text{按内存使用量排序进程}$$ **二、高级分析工具** 1. **htop 增强版** ```bash htop --filter='script_name' # 过滤显示目标进程 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值