编程

Linux 系统查看内存使用情况

1142 2023-03-20 09:12:19

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

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

常用命令
查看内存使用情况:free
显示进程信息(包括 CPU、内存使用等信息):top、ps
查看驱动占用内存:lsmod
1.查看系统内存 free
free 命令可以显示当前系统未使用的和已使用的内存大小,还可以显示被内核使用的内存缓冲区。在终端中输入free(参数稍后说明)可以看到我们服务器内存情况,如下:


[root@centos ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1881864      670560      166648         980     1044656     1019308
Swap:             0           0           0

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.4 buff 和 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 读缓存,数据从磁盘读出后,暂留在缓冲区,预备程序接下来的使用。
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 文件中。

[root@centos ~]# top
top - 03:24:39 up 3 days, 13:21,  1 user,  load average: 0.37, 0.14, 0.08
Tasks: 136 total,   1 running, 135 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.5 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1881864 total,    84724 free,   667820 used,  1129320 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1019204 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                        
      

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

Tasks: 136 total 总进程数
1 running 正在运行的进程数
135 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 冻结进程数
%Cpu(s): 0.5us, 用户空间占用 CPU 百分比(用户态使用 CPU 占比)
0.5 sy 内核空间占用 CPU 百分比 (系统态使用 CPU 占比)
0.0 ni 用做 nice 加权的进程分配的用户态 cpu 时间比
99.0 id 空闲的 cpu 时间比
0.0 wa IO wait ,cpu 等待磁盘写入完成时间
0.0 hi Hardware IRQ,硬中断消耗时间
0.0 si Software IRQ,软中断消耗时间
0.7 st 被hypervisor(管理程序,一般为服务器或者虚拟机)偷取时间
KiB Mem : 1881864 total 物理内存总量,单位:Kb
667820 free 空闲内存总量
1129320 used 使用的物理内存总量,此处需要注意的是:used 实际指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到 free 中去,因此在 linux 上 free 内存会越来越少,但不用为此担心。
4868.3+buff/cache 用作内核缓存的内存量
KiB Swap: 0 total 交换区总量
0 free 空闲交换区总量
0 used 使用的交换区总量
1019204 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

4 lsmod查看驱动占用内存

命令:lsmod

功能:
列出已加载的模块,以友好的方式显示 /proc/modules 的内容
格式:
第一列:Module 表示模块的名称,如 sysDebug
第二列:Size 表示模块大小,单位:byte
第三列:Used 表示依赖的模块个数
第四列:by 表示依赖的模块内容
示例:
lsmod|grep -i ext3 //查看当前系统是否加载 ext3 驱动模块