Linux下找出吃内存的方法

几个 个 Linux 内存查看方法

1、free命令

2、 vmstat命令

3、 /proc/meminfo 命令

4、 top命令

5、 htop 命令

6、查看进程内存信息

内存性能指标

系统内存使用情况,比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。 共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊 的缓存。 可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存。 缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访 问的速度。另一部分,则是 Slab 分配器中的可回收内存。 缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样,内核就可以把分散的写集中 起来,统一优化磁盘写入。

  1. 进程内存使用情况,比如进程的虚拟内存、常驻内存、共享内存以及 Swap 内存等。 虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注 意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存。常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存。 共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码 段等。

Swap 内存,是指通过 Swap 换出到磁盘的内存。 当然,这些指标中,常驻内存一般会换算成占系统总内存的百分比,也就是进程的内存使用率。

  1. 缺页异常。 系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分 配。缺页异常又分为下面两种场景。 可以直接从物理内存中分配时,被称为次缺页异常。 需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常。 主缺页异常升高,就意味着需要磁盘 I/O,那么内存访问也会慢很多。

  2. Swap 的使用情况,比如 Swap 的已用空间、剩余空间、换入速度和换出速度等。 已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。 换入和换出速度,则表示每秒钟换入和换出内存的大小。

内存性能工具

一、free命令

最常用的内存工具,可以查看系统的整体内存和 Swap 使用情况可以显示当前系统未使用的和已使用的 内存数目

  1. free 命令语法:

free [options]

free 命令选项:

. free 命令实例

二、vmstat 指令

vmstat命令是最常见的Linux/Unix监控工具,用于查看系统的内存存储信息,是一个报告虚拟内存统计 信息的小工具,属于sysstat包。可以动态查看内存变化,还可以区分缓存和缓冲区、Swap 换入和换出 的内存大小。

vmstat 命令报告包括:进程、内存、分页、阻塞 IO、中断、磁盘、CPU。 可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读 写情况。 这个命令一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而 不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

  1. 常见性能问题分析

IO/CPU/men连锁反应

内存不足

io瓶颈

CPU瓶颈:load,vmstat中r列

三、/proc/meminfo

用途:用于从/proc文件系统中提取与内存相关的信息。这些文件包含有 系统和内核的内部信息。其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只 是看起来不太直观。

四、top 指令

Top 命令提供了对系统当前工作负载的简单和动态的实时概述。由 Linux 内核处理的线程和进程列 表显示为一个基于交互式列的汇总显示,其中进程的统计数据和资源使用情况显示在上半部分,而 当前活动的进程列表显示在下半部分

用途:用于打印系统中的CPU和内存使用情况。输出结果中,可以很清晰的看出已用和可用内存的资源 情况。top 最好的地方之一就是发现可能已经失控的服务的进程 ID 号(PID)。有了这些 PID,可以对 有问题的任务进行故障排除(或 kill)。

第一行,任务队列信息,同 uptime 命令的执行结果

系统时间:02:19:10 运行时间:up 2:26 min, 当前登录用户:1 user 负载均衡(uptime) load average: 0.00, 0.06, 0.07 average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除 以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了

第二行,Tasks --- 任务(进程)

总进程:229 total, 运行:1 running, 休眠:163 sleeping, 停止: 0 stopped, 僵尸进程: 0 zombie

第三行,cpu状态信息

0.7%us【user space】--- 用户空间占用CPU的百分比。1.0%sy【sysctl】--- 内核空间占用CPU的 百分比。0.0%ni【】--- 改变过优先级的进程占用CPU的百分比 97.9%id【idolt】--- 空闲CPU百分 比 0.3%wa【wait】--- IO等待占用CPU的百分比 0.0%hi【Hardware IRQ】--- 硬中断占用CPU的百 分比 0.0%si【Software Interrupts】--- 软中断占用CPU的百分比

第四行,内存状态

2017504 total, 653616 free, 1154200 used, 209688 buff/cache【缓存的内存量】

第五行,swap交换分区信息

998396 total, 771068 free, 227328 used. 635608 avail Mem

第七行以下:各进程(任务)的状态监控

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 --- 进程名称(命令名/命令行)

五、htop 指令

htop 它类似于 top 命令,但可以让在垂直和水平方向上滚动,所以可以看到系统上运行的所有进程,以 及他们完整的命令行。 可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing)。

htop快照:

六、查看指定进程的内存

通过/proc/procid/status查看进程内存

以上内存性能工具使用总结

首先,用 free。这是个。相对应的,可以用 top 或 p,查看进程的内存使用情况。 然后,通过 proc 文件系统,找到了内存指标的来源;并通过 vmstat,动态观察了内存的变化情况。 接着,可以使用cachestat ,查看整个系统缓存的读写命中情况,并用 cachetop 来观察每个进程缓存的 读写命中情况。 再接着,用 vmstat看内存泄露情况,然后用 memleak给出的内存分配栈,确认内存泄漏情况并找到内 存泄露位置。 最后,通过 cachetop,可以找到缓冲区升高的根源;通过对比剩余内存跟 /proc/zoneinfo 的内存阈, 找出Swap 所影响的进程。

常用清理命令

清缓存

请交换空间

总结

系统内存不足会导致OOM问题,可在/var/log中查看

也有可能是内存泄露(memory leak),在实际环境中可能是Apache、MySQL、Java程序、http大量请 求等导致 常见的优化结局思路:

最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。 减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等。 尽量使用缓存和缓冲区来访问数据。比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据; 或者用 Redis 这类的外部缓存组件,优化数据的访问。 使用 cgroups 等方式限制进程的内存使用情况。这样,可以确保系统内存不会被异常进程耗尽。 通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不 会被 OOM 杀死。

相关推荐
jimy12 小时前
安卓里运行Linux
linux·运维·服务器
爱凤的小光3 小时前
Linux清理磁盘技巧---个人笔记
linux·运维
耗同学一米八4 小时前
2026年河北省职业院校技能大赛中职组“网络建设与运维”赛项答案解析 1.系统安装
linux·服务器·centos
知星小度S5 小时前
系统核心解析:深入文件系统底层机制——Ext系列探秘:从磁盘结构到挂载链接的全链路解析
linux
2401_890443025 小时前
Linux 基础IO
linux·c语言
智慧地球(AI·Earth)6 小时前
在Linux上使用Claude Code 并使用本地VS Code SSH远程访问的完整指南
linux·ssh·ai编程
老王熬夜敲代码7 小时前
解决IP不够用的问题
linux·网络·笔记
zly35007 小时前
linux查看正在运行的nginx的当前工作目录(webroot)
linux·运维·nginx
QT 小鲜肉7 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
问道飞鱼8 小时前
【Linux知识】Linux 虚拟机磁盘扩缩容操作指南(按文件系统分类)
linux·运维·服务器·磁盘扩缩容