Linux - 查看内存占用: top和free的区别

一、top

能够实时(监控)显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

默认进入top时,各进程是按照CPU的占用量来排序,以K为单位显示内存大小,可通过大写字母E来切换内存信息区域的显示单位,如下按一下E切换到MB,再按一下E切换到GB。

注意:shift+M使应用按内存使用率排序,定位到第一个使用内存最高的应用,并找到对应的PID。

top命令常用的选项参数:

top [选项]

例如:

top 每隔3秒显式所有进程的资源占用情况
top -d 1 每隔1秒显式所有进程的资源占用情况
top -c 每隔3秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 28820 -p 38830 每隔3秒显示pid是28820和pid是38830的两个进程的资源占用情况
top -d 2 -c -p 69358 每隔2秒显示pid是69358的进程的资源使用情况,并显式该进程启动的命令行参数

交互命令:

1)敲top后,按键盘数字“1”可以监控每个逻辑CPU的状况;

2)敲top后,输入u,然后输入用户名,则可以查看相应的用户进程;

3)敲top后,默认以K为单位显示内存大小,可以通过大写字母E来切换内存信息区域的显示单位,按一下E切换到MB,再按一下E切换到GB;

4)敲top后,输入h进入top命令的帮助文档,了解更多关于top的用法。

1)总览区:(含义分别如下)

第一行(top):
up:系统当前时刻,
days:系统启动后到现在的运作时间,
users:当前登录到系统的用户终端数,
load average:当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数;

注意:负载值一般不超过cpu核数的1-1.5倍,如果超过1.5倍,那就要重视,此时会严重影响系统。

根据经验法则, 建议生产系统的 CPU 总使用率不要超过 70%。

1)、查看服务器的CPU个数
cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l

2)、查看服务器的CPU物理核数
cat /proc/cpuinfo| grep “cpu cores”| uniq
注:查的是每颗CPU的物理核数

3)、查看服务器的CPU逻辑核数
cat /proc/cpuinfo | grep “siblings” | uniq --查看单颗CPU的逻辑核数
cat /proc/cpuinfo| grep “processor”| wc -l --查看所有CPU的逻辑核数

查看cpu个数:

cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
lscpu  //显示有关 CPU 架构的信息

例如:cpu核数是4,负载值在4以下是属于正常,短时间内4~6问题不大,超过6那就有大问题。

第二行(Tasks):
total:当前系统进程总数,
running:当前运行中的进程数,
sleeping:当前处于等待状态中的进程数,
stopped:被停止的系统进程数,
zombie:僵尸进程数;

第三行(Cpu):
us:用户空间占用CPU百分比(像shell程序、各种语言的编译器、各种应用、web服务器和各种桌面应用都算是运行在用户地址空间的进程,这些程序如果不是处于idle状态,那么绝大多数的CPU时间都是运行在用户态)
sy:内核空间占用CPU百分比(所有进程要使用的系统资源都是由Linux内核处理的,对于操作系统的设计来说,消耗在内核态的时间应该是越少越好,在实践中有一类典型的情况会使sy变大,那就是大量的IO操作,因此在调查IO相关的问题时需要着重关注它)
ni:用户进程空间内改变过优先级的进程占用CPU百分比(ni是nice的缩写,可以通过nice值调整进程用户态的优先级,这里显示的ni表示调整过nice值的进程消耗掉的CPU时间,如果系统中没有进程被调整过nice值,那么ni就显示为0)
id:空闲CPU百分比,
wa:等待输入输出的CPU时间百分比(和CPU的处理速度相比,磁盘IO操作是非常慢的,有很多这样的操作,比如,CPU在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会把CPU等待IO操作的时间也计算进去,所以在看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作造成的

hi:硬件CPU中断占用百分比(硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理,消耗CPU时间)
si:软中断占用百分比(软中断是由程序发出的中断,最终也会执行相应的处理程序,消耗CPU时间)
st:虚拟机占用百分比(steal time,虚拟机进程在物理CPU上等待其CPU时间的时间百分比)

第四行(KiB Mem,实体内存):
total:物理内存总量,
used:使用的物理内存总量,
free:空闲内存总量,
buffers:用作内核缓存的内存量;

第五行(KiB Swap,虚拟内存):
total:交换区总量,
userd:使用的交换区总量,
free:空闲交换区总量,
cached:缓冲的交换区总量;

注意:

第四、第五行分别是内存信息和swap信息,所有程序的运行都是在内存中进行的,所以内存的性能对与服务器来说非常重要。不过当内存信息的free变少的时候,其实并不需要太紧张真正需要看的是Swap中的used信息。Swap分区是由硬盘提供的交换区,当物理内存不够用的时候,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存是真的不够用了。

2)进程列表栏:(含义分别如下)

PID:进程的ID,
USER:进程所有者,
PR:进程的优先级别,越小越优先被执行,
NI:nice值,负值表示高优先级,正值表示低优先级,
VIRT:进程占用的虚拟内存,单位kb,
RES:进程占用的物理内存,单位kb,
SHR:进程使用的共享内存,单位kb,
S:进程的状态,S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数,
%CPU:进程占用CPU的使用率,
%MEM:进程使用的物理内存和总内存的百分比,
TIME+:该进程启动后占用的总的CPU时间,
COMMAAND:进程启动命令名称

二、free

显示内存的使用情况,包括实体内存,虚拟(交换文件)内存,共享内存区段,以及系统核心使用的缓冲区等。

 例如:

free -s 5  //,每隔5s重新查询一次

1)Mem是实体内存,物理内存空间使用情况

2)SWAP是交换分区(虚拟内存),物理内存不够用时,临时存放数据
3)free 是真正从尚未被使用的物理内存数量
4)available 是从应用程序角度看到的可用内存数量【含缓存,程序“认为”还可以被使用的内存】
5)buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求

6)Linux为了提高读写性能,会拿出一部分内存来临时存储数据(也就是系统内存缓存),当剩余的内存(free)不够的时候,就会释放一部分缓存(buff/cache)来满足程序的使用需求,即:available = free + buff/chche(部分可以被释放的缓存)

total 去掉为硬件和操作系统保留的内存后剩余的内存总量
used 当前已使用的内存总量
free 空闲或可以使用的内存总量
shared 共享内存大小,主要用于进程间通信
buff/cache 主要用于块设备数据缓冲,例如记录文件系统的metadata(目录、权限等等信息)
available 可以使用的内存总量

 // 内存总数与已使用内存和空闲内存数的关系
total=used+free

虚拟内存(Swap):

  首先需要强调的是虚拟内存不同于物理内存,虽然两者都包含“内存”字眼,但它们属于两个不同层面的概念。进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很大。虚拟内存是操作系统内核为了对进程地址空间进行管理而精心设计的一个逻辑意义上的内存空间概念。我们程序中的指针其实都是这个虚拟内存空间中的地址。比如我们在写完一段C++程序之后都需要采用g++进行编译,这时候编译器采用的地址其实就是虚拟内存空间的地址。因为这时候程序还没有运行,何谈物理内存空间地址?凡是程序运行过程中可能需要用到的指令或者数据都必须在虚拟内存空间中。既然说虚拟内存是一个逻辑意义上(假象)的内存空间,为了能够让程序在物理机器上运行,那必须有一套机制可以让这些假象的虚拟内存空间映射到物理内存空间(实实在在的RAM内存条上的空间)。这其实就是操作系统中页映射表(page table)所做的事情了。内核会为系统中每一个进程维护一份相互独立的页映射表,页映射表的基本原理是将程序运行过程中需要访问的一段虚拟内存空间通过页映射表映射到一段物理内存空间上,这样CPU访问对应虚拟内存地址的时候就可以通过这种查找页映射表的机制访问物理内存上的某个对应的地址。“页(page)”是虚拟内存空间向物理内存空间映射的基本单元。

  虚拟内存的引入,每个进程都拥有自己独立的虚拟地址空间,进程与进程之间的虚拟内存地址空间是相互隔离,互不干扰,而且每个进程都认为自己独占所有内存空间。如此,就可以将多进程之间协同的相关复杂细节统统交给内核中的内存管理模块来处理,极大地解放了程序员的负担。这一切都是因为虚拟内存能够提供内存地址空间的隔离,极大地扩展了可用空间。当CPU访问进程的虚拟地址时,经过地址翻译硬件将虚拟地址转换成不同的物理地址,这样不同的进程运行时,既是操作的是同一虚拟地址,背后写入的也是不同的物理地址。

  对于一台真实的计算机来说,它的虚拟内存空间有多大呢?计算机虚拟内存空间的大小是由程序计数器的寻址能力来决定的。

  例如:在程序计数器的位数为32的处理器中,它的虚拟内存空间就为4GB。

如何判断内存是否够用?(内存使用情况分析技巧)

  当系统的物理内存不够用时,就会把一部分不常用的数据临时放到交换分区(Swap),等到程序要使用这些数据时,再把它们从交换分区加载到物理内存中。这就意味着,系统总是在内存不够用的情况下,才会使用交换分区。如果交换分区没被使用或者使用的很少,内存够用(使用情况良好);反之,就说明内存不够用了,可能会影响到系统的使用。

  交换分区可以在一定程度上解决内存不足的问题,但它会读取磁盘的数据,所以读写速度不快,因此,只有在内存不够用时,才会选择把数据放到交换分区。

例如:

使用 free -m  //查看系统还剩多少兆内存可以使用【重点是看free那一列】

此时服务器的内存还剩809MB(总共257415MB,已使用66759MB,缓存用了189847MB),属于不正常的情况:

缓存占了太多的内存,服务器上的应用可能就会出现功能无法正常使用的问题,如果需要紧急恢复使用,可以重启服务,释放缓存;如果不紧急,就找专业人员分析一下具体的原因。

问题定位

cached 占用过高问题

buffer,cached的作用:cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完

Free中的buffer和cache:(它们都是占用内存)

buffer : 作为buffer cache的内存,是块设备(磁盘)的缓冲区,包括读、写磁盘
cache: 作为page cache的内存, 文件系统的cache,包括读、写文件

如果 cache 的值很大,说明cache住的文件数很多。

linux服务器会自动释放内存,保障系统运行,但只会释放够用的内存,而不会去释放更多的内存。

解决方法:

手动(临时)释放cached方法:

释放前最好sync一下,防止丢数据。sync 在启动机器或关机之前一定要运行sync命令。

记住:在任何情况下,慎重地执行sync命令决不会有任何坏处,sync命令强制把磁盘缓冲的所有数据写入磁盘。

要达到释放缓存的目的,需要了解下关键的配置文件/proc/sys/vm/drop_caches,默认为0

echo 1 > /proc/sys/vm/drop_caches    // 清理pagecache(页面缓存)
echo 2 > /proc/sys/vm/drop_caches    // 清理dentries(目录缓存)和inodes
echo 3 > /proc/sys/vm/drop_caches   // 清理pagecache、dentries和inodes
sync  // 将存于 buffer 中的资料强制写入硬盘中【用于数据同步,在关闭Linux系统时使用】                 

#常用方法

sync  //使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存
echo 1 > /proc/sys/vm/drop_caches

#清除后要还原系统默认配置:(系统默认值是0,释放之后需要再改回0值):

echo 0 > /proc/sys/vm/drop_caches

#查看设置

sysctl -a | grep drop_caches

这时,查看 free 可以看到 cached 降低了很多。

例如:

 查看内存占用高的前20:

ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20

补充: echo 字符串 > 文件 就是把字符串内容从定向到文件中

原理(free数据来源)

free命令实际上是在查询 /proc/meminfo,查看这个文件,会发现里面有很多字段,单位是KB,所以free不加参数时,默认单位就是KB。

cat  /proc/meminfo

posted @ 2023-12-27 22:21  李若盛开  阅读(2788)  评论(0编辑  收藏  举报