Linux系统查看内存使用情况

Windows及带有GUI的Linux操作系统中,我们通常可以使用UI查看系统内存及空间使用情况,但是对于开发或者运维人员来说,经常要工作在没有GUI的Linux的服务器,命令行能比GUI提供更多功能和灵活性。

特别当我们的系统中某个应用程序异常,或者系统占用异常,抑或linux开发需要内存裁剪时,我们就要了解下系统内存及空间使用情况,就需要掌握几个常用的查看工具。

常用命令

  • 查看内存使用情况:free
  • 显示进程信息(包括CPU、内存使用等信息):top、ps
  • 查看驱动占用内存:lsmod

1 查看系统内存free

free命令可以显示当前系统未使用的和已使用的内存大小,还可以显示被内核使用的内存缓冲区。在终端中输入free(参数稍后说明)可以看到我们服务器内存情况,如下:
《Linux系统查看内存使用情况》

1.1详细说明如下:

Mem: 内存的使用信息
Swap: 交换空间的使用信息

total:总计物理内存的大小。
used:已使用物理内存。
free:可用物理内存。
shared:多个进程共享的内存总额。
buffers/cached:缓存缓冲使用物理内存大小。
available:还可以被应用程序使用的物理内存大小。

1.2 各物理内存之间的关系

total = used + free + buffer/cache
avaiable = free + buffer/cache(一般来说是这样,个人电脑是这样,但服务器或者公共云普通用户有部分buffer/cache是用不了的就会有avaiable < free + buffer/cache)

1.3 free与available的区别

free是正在未被使用的内存
available是应用程序认为可用的内存
Linux为了提升读写性能,消耗一部分内存资源作为缓存或者缓冲内存,在内核看来这部分buffer/cache属于已被使用的内存;在应用程序申请内存,而free内存不够时,就会让内核回收buffer和cache来满足应用程序的内存需求。

1.4buff和cache的区别

buffers和cache是有一定区别的:

  • A buffer is something that has yet to be “written” to disk.  —buffer 写缓存,数据存储时,先保存到磁盘缓冲区,然后再写入到永久空间
  • A cache is something that has been “reed” from the disk adn stored for later use. –cache 读缓存,数据从磁盘读出后,暂留在缓冲区,预备程序接下来的使用。
  • 更为形象的描述,请参考:
    https://www.cnblogs.com/M18-BlankBox/p/5326484.html

1.5 free参数说明

free命令下显示的单位是k,可以在free后面加上-m(即free -m)显示单位为Mb,如下图:
《Linux系统查看内存使用情况》
可以通过free --help查看free的详细命令:
《Linux系统查看内存使用情况》

通过free -h可以自动匹配适合人阅读习惯的单位,其中h是humanity之意。

ps:
第3行swap为交换分区,类似windows系统中的虚拟内存,当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

2 查看进程占用内存

  • top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令可以有效的发现系统的缺陷出在哪里,如内存不够、CPU处理能力不够、IO读写过高等。通过top命令所提供的互动式界面,用热键可以管理。
    相关语法:top -X
-b:以批处理模式操作;
-c:显示完整的治命令;
-d:屏幕刷新间隔时间;
-I:忽略失效过程;
-s:保密模式;
-S:累积模式;
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。
  • 在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽。交互命令如下:
h:显示帮助画面,给出一些简短的命令总结说明;
k:终止一个进程;
i:忽略闲置和僵死进程,这是一个开关式命令;
q:退出程序;
r:重新安排一个进程的优先级别;
S:切换到累计模式;
s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;
f或者F:从当前显示中添加或者删除项目;
o或者O:改变显示项目的顺序;
l:切换显示平均负载和启动时间信息;
m:切换显示内存信息;
t:切换显示进程和CPU状态信息;
c:切换显示命令名称和完整命令行;
M:根据驻留内存大小进行排序;
P:根据CPU使用百分比大小进行排序;
T:根据时间/累计时间进行排序;
w:将当前设置写入~/.toprc文件中。
  • 直接在终端中输入top指令,可以看到如下界面:
    《Linux系统查看内存使用情况》

2.1 top命令的第一到第五行的详细说明如下:

top – 10:14:31 当前系统时间
up 3 days, 22:36 系统已经运行了3天22h36min
1 users 共有1个用户为登录状态
load average: 0.57, 0.74, 0.65 系统负载,即任务队列的平均长度,load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。
注意:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

Tasks: 322 total 总进程数
2 running 正在运行的进程数
320 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 冻结进程数
%Cpu(s): 2.7 us, 用户空间占用CPU百分比(用户态使用CPU占比)
2.7 sy 内核空间占用CPU百分比 (系统态使用CPU占比)
0.0 ni 用做nice加权的进程分配的用户态cpu时间比
94.0 id 空闲的cpu时间比
0.0 wa IO wait ,cpu等待磁盘写入完成时间
0.0 hi Hardware IRQ,硬中断消耗时间
0.0 si Software IRQ,软中断消耗时间
0.7 st 被hypervisor(管理程序,一般为服务器或者虚拟机)偷取时间
MiB Mem : 11995.2 total 物理内存总量,单位:Mb
360.9 free 空闲内存总量
6766.0 used 使用的物理内存总量,此处需要注意的是:used实际指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
4868.3+buff/cache 用作内核缓存的内存量
MiB Swap: 7680.0 total 交换区总量
7433.1 free 空闲交换区总量
246.9 used 使用的交换区总量
3665.4 avail Mem 在不交换的情况下,对启动新应用程序可用内存的估计
(网上也有说法是交换区的可用容量)
top命令第六行为空。
top命令第七行是各个进程的监控:

从左到右依次为:

PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

需要注意的是,此界面显示的并不是所有进程,由于页面显示限制仅仅显示了这几行,我们可以通过top -b -n 1查看系统的所有进程的快照。

3查看内核占用内存

命令:cat /proc/meminfo
《Linux系统查看内存使用情况》

详细说明可以查看https://blog.csdn.net/qingzhuyuxian/article/details/80453538

注:initrd和初始化代码init在引导完成之后会被释放掉,所以最终的内核可管理内存(total)会比dmesg显示的available更多一点,相应的源代码可参见: free_initrd_mem() 和 free_initmem()。
优化可以主要从优化保留内存和优化used内存两个方面进行,具体的需要结合代码。
查看磁盘命令比较多,最常用的为: df -lh 命令

4 lsmod查看驱动占用内存

命令:lsmod
《Linux系统查看内存使用情况》

  • 功能:
    列出已加载的模块,以友好的方式显示/proc/modules的内容
  • 格式:
    第一列:Module表示模块的名称,如sysDebug
    第二列:Size表示模块大小,单位:byte
    第三列:Used 表示依赖的模块个数
    第四列:by表示依赖的模块内容
  • 示例:
    lsmod|grep -i ext3 //查看当前系统是否加载ext3驱动模块
    原文作者:禾仔仔
    原文地址: https://blog.csdn.net/weixin_43083491/article/details/120746362
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞