【Linux】之【内存】相关的命令&&解析以及内存相关的问题[free、meminfo、内存泄漏、内存溢出、Overcommit]

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: free命令的功能是显示系统内存使用量情况,包含物理和交换内存的总量、使用量和空闲量情况。

@[toc]

一、内存相关命令

1、free – 显示系统内存使用量情况

free命令的功能是显示系统内存使用量情况,包含物理和交换内存的总量、使用量和空闲量情况。

语法格式

free [参数]

常用参数

参数 解析
-b 以Byte显示内存使用情况
-k 以kb为单位显示内存使用情况
-m 以mb为单位显示内存使用情况
-g 以gb为单位显示内存使用情况
-s 持续显示内存
-t 显示内存使用总合
-h 以易读的单位方式显示内存使用情况

参考实例

以默认的容量单位显示内存使用量信息:

[root@root ~]# free
              total        used        free      shared  buff/cache   available
Mem:       65353144     8354168    53956676       39716     3042300    56522796
Swap:             0           0           0

以MB位单位显示内存使用量信息:

[root@root ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          63821        8154       52696          38        2971       55202
Swap:             0           0           0

以易读的单位显示内存使用量信息:

[root@root ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            62G        8.0G         51G         38M        2.9G         53G
Swap:            0B          0B          0B

以易读的单位显示内存使用量信息,每个10秒刷新一次:

[root@root ~]# free -hs 10
              total        used        free      shared  buff/cache   available
Mem:            62G        8.0G         51G         38M        2.9G         53G
Swap:            0B          0B          0B

              total        used        free      shared  buff/cache   available
Mem:            62G        8.0G         51G         38M        2.9G         53G
Swap:            0B          0B          0B
字段解析
#total:物理内存大小,就是机器实际的内存

used:已使用的内存大小,这个值包括了cached和应用程序实际使用的内存

free:未被使用的内存大小(俗称:空闲内存)

shared:共享内存大小,是进程间通信的一种方式

buffers:被缓冲区占用的内存大小

cached:被缓存占用的内存大小

2、cat /proc/meminfo

meminfo中包含所有的内存相关信息。
[root@root ~]# cat /proc/meminfo 
MemTotal:       65353144 kB
MemFree:        53956672 kB
MemAvailable:   56523144 kB
Buffers:           49180 kB
Cached:          2889216 kB
SwapCached:            0 kB
Active:          7603092 kB
Inactive:        2691064 kB
Active(anon):    7356648 kB
Inactive(anon):    38800 kB
Active(file):     246444 kB
Inactive(file):  2652264 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                36 kB
Writeback:             0 kB
AnonPages:       7360372 kB
Mapped:           764500 kB
Shmem:             39684 kB
Slab:             306384 kB
SReclaimable:     104216 kB
SUnreclaim:       202168 kB
KernelStack:       22464 kB
PageTables:        30644 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    32676572 kB #系统中可以申请的虚拟内存最大值
Committed_AS:   27883644 kB #系统已经申请的虚拟内存
VmallocTotal:   34359738367 kB
VmallocUsed:      525916 kB
VmallocChunk:   34325372924 kB
HardwareCorrupted:     0 kB
AnonHugePages:   4573184 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      771124 kB
DirectMap2M:    11393024 kB
DirectMap1G:    56623104 kB

二、内存相关问题

1、内存泄漏

解析:

如果程序运行过程中不能正常回收不用的内存,那么一段时间就会导致内存增长很高,最终导致系统不可以用,这种情况称为内存泄漏。

内存泄漏可以使用内存分享工具valgrind进行内存分析。

[root@root ~]# yum -y install valgrind
[root@root ~]# valgrind --tool=memcheck  ./mem_leak -t
==1738== Memcheck, a memory error detector
==1738== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==1738== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==1738== Command: ./mem_leak -t
==1738== 
==1738== 
==1738== HEAP SUMMARY:
==1738==     in use at exit: 4 bytes in 1 blocks
==1738==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==1738== 
==1738== LEAK SUMMARY:
==1738==    definitely lost: 4 bytes in 1 blocks
==1738==    indirectly lost: 0 bytes in 0 blocks
==1738==      possibly lost: 0 bytes in 0 blocks
==1738==    still reachable: 0 bytes in 0 blocks
==1738==         suppressed: 0 bytes in 0 blocks
==1738== Rerun with --leak-check=full to see details of leaked memory
==1738== 
==1738== For counts of detected and suppressed errors, rerun with: -v
==1738== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

2、虚拟内存、物理内存

内存的最小单位为页(paging),默认情况一页是4K。

  • 虚拟内存与物理内存

  当进程向操作系统申请10G内存时,操作系统收到请求后先进行自我检查,经过分析后决定给予进程10G内存空间,但是系统此时并没有真正给进程10G,系统会判断进程运行实际需要的内存大小,比如该进程需要300M就够用了,所以系统只划分300M内存给进程运行,这种实际分配的内存称为物理内存。

[root@root ~]# ps aux|head -1
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
#VSZ 虚拟内存
#RSS 物理内存

3、内存溢出

内存溢出(out of memory,OOM),当进程运行向系统申请内存时,系统没有更多的进程分配给该进程了,就会出现内存溢出。内存溢出后系统会杀掉系统中的一些进程来释放内存,通常OOM Killer杀死的都是占用内存较多的服务,直到内存够用为止,所以内存溢出的直观现象通常是某些服务异常或宕机。当发生内存溢出后可以通过dmesg命令或者通过/var/log/messages来快速确定。
[root@root ~]# dmesg |tail -5
[ 3613.796390] [ 1277]     0  1277    28983        1      16      217             0 bash
[ 3613.796393] [ 1446]     0  1446    29003        0      16      221             0 bash
[ 3613.796395] [ 1546]     0  1546   774216   213712    1439   513149             0 python
[ 3613.796396] Out of memory: Kill process 1546 (python) score 912 or sacrifice child
[ 3613.796422] Killed process 1546 (python) total-vm:3096864kB, anon-rss:854848kB, file-rss:0kB, shmem-rss:0kB
[root@root ~]# cat /proc/sys/vm/panic_on_oom 
0
[root@root ~]# echo 1 > /proc/sys/vm/panic_on_oom

panic_on_oom该参数的值共有三个选项:
0是触发oom killer进行杀进程处理(/proc/sys/vm/oom_kill_allocating_task默认值为0,结束占用内存多的进程;如果设置为1,就杀死当前申请内存的进程)
2是直接触发kernel panic(类似于Windows的蓝屏),此时系统开发人员可以连接进行debug,但是对其他人并没有什么用。更多希望系统快速重启(/proc/sys/kernel/panic设置多少秒后重启)
1是根据不同情况会有不同处理;

4、Overcommit

一般情况下,进程并不会一次用光申请的内存,所以操作系统为了提高内存使用率,会向进程“超卖”内存,以便能响应更多的进程内存申请。但是为了保证程序的稳定运行,系统并不会无限制响应内存申请,这样可以防止内存申请过多,导致系统本身内存空间不足而无法正常运行。Linux系统中使用OverCommit的方式控制内存的申请。

内核参数overcommit_memory 内存分配策略
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,引发OOM。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核不允许进程申请超过系统设置大小的内存空间。在这种模式下,系统设置的可申请内存空间大小为:Swap+RAM*(“/proc/sys/vm/overcommit_ratio”/100)
说明:/proc/sys/vm/overcommit_ratio就是系统最大可以分配内存的百分比,默认是50.

目录
相关文章
|
7天前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
50 23
Linux系统之whereis命令的基本使用
|
26天前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
54 20
|
20天前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
33 11
|
2月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
2月前
|
Ubuntu Linux
Linux 各发行版安装 ping 命令指南
如何在不同 Linux 发行版(Ubuntu/Debian、CentOS/RHEL/Fedora、Arch Linux、openSUSE、Alpine Linux)上安装 `ping` 命令,详细列出各发行版的安装步骤和验证方法,帮助系统管理员和网络工程师快速排查网络问题。
203 20
|
2月前
|
Linux
linux查看目录下的文件夹命令,find查找某个目录,但是不包括这个目录本身?
通过本文的介绍,您应该对如何在 Linux 系统中查看目录下的文件夹以及使用 `find` 命令查找特定目录内容并排除该目录本身有了清晰的理解。掌握这些命令和技巧,可以大大提高日常文件管理和查找操作的效率。 在实际应用中,灵活使用这些命令和参数,可以帮助您快速定位和管理文件和目录,满足各种复杂的文件系统操作需求。
141 8
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
131 2
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析