Linux程序调试优化(1)——内存占用详解及优化思路

news2024/9/21 8:03:11

文章目录

  • 1.free查看总体的内存占用
  • 2./proc/$PID/status 查看某进程状态

linux开发最重要的两个参数,分别是内存以及CPU使用率,若内存出现严重不足,则在需要使用内存时,可能出现申请不到的情况,导致 OOM,Linux系统主动杀死占用内存比较高的进程。

1.free查看总体的内存占用

image.png

free中的信息,其实都来自/proc/meminfo。
可以用free -k 则显示数据的单位是KB,free -m 则看到的单位是MB
total:物理内存的总大小
计算方式:total = used + free + buff/cache

used:真正被使用内存的大小,其中包括shared共享内存大小
计算方式:used = total - free - buff/cache

free:未使用内存的大小
计算方式:free = total - buff/cache - used

shared:共享内存大小,包括mmap申请的共享内存,以及加载的动态链接库以及程序的代码段等。
这个值以及包含在used中

buff/cache:缓存和缓冲区的大小,主要目的是为了提升IO的性能,加快IO的速度,当系统内存不足时,会尝试从这边借用内存。Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

之所以buff/cache能加快IO性能,是因为实际场景中,从内存读取数据的效率远远大于从磁盘读取,如果频繁从磁盘读取数据,会影响CPU工作效率,所以Linux系统在内存中开辟缓存空间,把要用到的数据提前加载到内存中,提升CPU工作效率。

Linux系统读文件数据,首先判断数据是否在cache,如果在则从cache中读取,如果不在,则从磁盘中读取,并且次数会将读取的数据缓存到cache中,下次读取数据则会更快。
image.png

Linux系统写文件数据,首先是往cache中写入数据,此时将写入的cache页标记为脏页,也就是标记cache上还有数据没有同步到磁盘上,待内核在合适的时机将数据统一刷新到磁盘上,如果cache中的数据已经同步到磁盘上,我们就叫它干净页。
image.png

avaliable:剩余可使用的内存 ,理论上total - used就是剩下的内存,但实际上并不是所有剩余内存都可使用,所以 available <(total - used)即available < ( buff/cache + free),但比较接近这个值。

2./proc/$PID/status 查看某进程状态

当看到整体内存不足时,一般都需要去分析是哪个进程占用的内存比较多,并且确认该进程的内存是否一直在增长,如果是的话,则可能发生了内存泄漏。

xzx@ubuntu:~/share/project_ipc/hm3001/70mai/mike$ cat /proc/128622/status 
Name:   fwupd
Umask:  0022
State:  S (sleeping)
Tgid:   128622
Ngid:   0
Pid:    128622
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups:  
NStgid: 128622
NSpid:  128622
NSpgid: 128622
NSsid:  128622
VmPeak:   633144 kB
VmSize:   567608 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     24532 kB
VmRSS:     24532 kB
RssAnon:            4244 kB
RssFile:           20288 kB
RssShmem:              0 kB
VmData:    45180 kB
VmStk:       132 kB
VmExe:       332 kB
VmLib:     57656 kB
VmPTE:       540 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
CoreDumping:    0
THP_enabled:    1
Threads:        5
SigQ:   0/23440
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180004000
CapInh: 0000000000000000
CapPrm: 0000003ffffeffff
CapEff: 0000003ffffeffff
CapBnd: 0000003ffffeffff
CapAmb: 0000000000000000
NoNewPrivs:     0
Seccomp:        2
Speculation_Store_Bypass:       thread force mitigated
Cpus_allowed:   ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:      0-127
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        66
nonvoluntary_ctxt_switches:     7

Pid:当前进程id
PPid:当前进程的父进程ID
VmPeak:当前进程运行过程中占用内存的峰值
VmSize:进程当前使用的虚拟内存的大小,包括了进程使用的所有虚拟内存区域的大小,包括未分配的、已分配但尚未使用的、已使用的以及共享的内存区域等。虚拟内存大小包含了进程可访问的所有虚拟地址空间,但不一定都会被实际占用。
VmLck:当前进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘
VmHWM:进程所使用的物理内存的峰值
VmRSS:进程当前使用物理内存的大小
VmData: 进程占用的数据段大小
VmStk:进程占用的栈大小
VmExe:进程占用的代码段大小
VmLib:进程所加载的动态库所占用的内存大小
VmPTE:进程占用的页表大小
VmSwap:进程所使用的交换区的大小

一般是看VmRSS的增长情况来确认是否发生了内存泄漏,如果VmRss即真实物理内存大小不断在增长,则代表内存发生了泄漏。而VmHWM代表物理占用内存峰值,能看到该进程对内存的需求情况,如果峰值很高,代表这个进程存在内存需求比较多的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现对空调状态监测的监控

随着科技的飞速发展和人们生活水平的持续提高&#xff0c;空调已经成为现代家庭和办公环境中不可或缺的一部分。然而&#xff0c;传统的空调使用方式往往存在能效低下、操作不便等问题。为了解决这些问题&#xff0c;智能空调控制器应运而生&#xff0c;它不仅能实现对空调状态…

Java使用OpenOffice将office文件转换为PDF

Java使用OpenOffice将office文件转换为PDF 1. 先行工作1.1 OpenOffice官网下载1.2 JODConverter官网下载1.3 下载内容 2.介绍3. 安装OpenOffice服务3.1.Windows环境3.2 Linux环境 4. maven依赖5. 转换代码 1. 先行工作 请注意&#xff0c;无论是windows还是liunx环境都需要安装…

zookeeper分布式应用程序协调服务+消息中间件kafka分布式数据处理平台

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

半导体材料(一)

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第一篇笔记&#xff0c;下一篇传送门。 半导体是导电能力介于均属导体和绝缘体之间的固体材料。 半导体基本特征 室温下其电阻数量级约为 1 0 − 6 ∼ 1 0 8 Ω ⋅ m 10^{-6}\sim10^{8}\mathrm{\Omega…

供应IMX415-AAQR-C索尼芯片

长期供应各进口品牌芯片现货&#xff1a; IMX415-AAQR-C IMX492LLJ-C IMX492LQJ-C IMX455ALK-K IMMX455AQK-K IMX461ALR-C IMX461AQR-C IMX661-AAMR-C IMX661-AAQR-C IMX411ALR-C IMX411AQR-C IMX290LQR-C FS32K118LFT0MLHT FS32K146UAT0VLLT FS32K146UAT0VLQT …

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成&#xff08;Data Integration&#xff09;&#xff0c;简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中&#xff0c;我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中&#xff0c;使其具有相关性并易于使用。 数据集成&#xff1…

机器学习实训 Day1(线性回归练习)

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

针对MaxCompute优化案例分享

声明 原文来源&#xff1a;微信公众号&#xff1a;阿里云开发者 前言 MaxCompute 是阿里巴巴集团推出的一种大数据计算平台&#xff0c;用于处理海量数据和进行数据分析。它提供了高可靠性、高扩展性和高性能的数据处理能力&#xff0c;支持 SQL 查询、MapReduce 计算和机器…

【快捷部署】017_MongoDB(6.0.14)

&#x1f4e3;【快捷部署系列】017期信息 编号选型版本操作系统部署形式部署模式复检时间017MongoDB6.0.14Ubuntu 20.04apt单机2024-04-11 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;…

链表基础3——单链表的逆置

链表的定义 #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode (Node*)malloc(sizeof(Node)); if (!newNode) { return NULL; } newNode->data …

ceph集群管理节点高可用

一、前言 ceph集群想要高可用也必须要有多个管理节点&#xff0c;不然只有单管理节点&#xff0c;在一个管理节点挂了的情况下就没法进行集群的管理&#xff0c;可以分为web管理和客户端管理&#xff0c;web管理和mgr服务相关&#xff0c;客户端管理和mon服务相关 二、部署 mg…

品深茶都有什么功效,为什么那么贵?

品深国茶是一款高端商务用茶品牌。以中国传统中医理论为指导&#xff0c;精选天然有机茶叶为原料&#xff0c;经过严格配方科学制茶&#xff0c;再经现代生物技术加工制成的高端茶&#xff0c;有排毒养颜、补充营养、调节免疫、调节血脂和血压、调节血糖、促消化、解酒护肝、软…

【深度学习实战(6)】搭建通用的语义分割推理流程

一、代码 #---------------------------------------------------# # 检测图片 #---------------------------------------------------# def detect_image(self, image, countFalse, name_classesNone):#---------------------------------------------------------## 在…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题6

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

Decorator 装饰

意图 动态的给一个对象添加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类更加灵活 结构 其中&#xff1a; Component定义一个对象接口&#xff0c;可以给这些对象动态的添加职责。ConcreteComponent定义一个对象&#xff0c;可以给这个对象添加一些职…

C++修炼之路之list模拟实现--C++中的双向循环链表

目录 引言 一&#xff1a;STL源代码中关于list的成员变量的介绍 二&#xff1a;模拟实现list 1.基本结构 2.普通迭代器 const迭代器的结合 3.构造拷贝构造析构赋值重载 清空 4.inserterase头尾插入删除 5.打印不同数据类型的数据《使用模板加容器来完成》 三&#xf…

水库之大坝安全监测系统解决方案

一、系统介绍 水库之大坝安全监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装置、防雷设备&#xff09;、附件&#xff08;电缆、通信线路、电源线路&#xff09;等组成&a…

YOLO算法改进Backbone系列之:HAT-Net

本文旨在解决ViT中与多头自我关注&#xff08;MHSA&#xff09;相关的高计算/空间复杂性问题。为此&#xff0c;我们提出了分层多头自注意&#xff08;H-MHSA&#xff09;&#xff0c;这是一种以分层方式计算自注意的新方法。具体来说&#xff0c;我们首先按照通常的方法将输入…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数…

ClickHouse--18--argMin() 和argMax()函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 argMin() 和argMax()函数业务场景使用案例1.准备表和数据&#xff1a;业务场景一&#xff1a;查看salary 最高和最小的user业务场景二&#xff1a;根据更新时间获取…