内存占用高排查

一、定位内存占用高的进程

        top指令是最常见的检测系统运行状态的指令,但是因为展示界面和实时刷新的限制,则通过top指令不一定能够发现占用的内存很高的进程。因此,我们使用ps aux指令检索当前系统下的所有运行的进程。

• 下述指令查看系统内存占用前10的进程信息

ps aux|head -n1;ps aux|grep -v PID|sort -nr -k6|head -n10

说明: ps aux|head -n1;表示显示标题行;ps aux|grep -v PID表示结果跳过标题行(含有串PID的行);|sort -nr -k6表示结果按第六列(RSS)从大到小排序;|head -n10表示仅显示前10行数据。

• PID         进程的ID
• USER        进程所有者
• PR         进程的优先级别,越小越优先被执行
• NI         nice值
• VIRT         进程占用的虚拟内存
• RES         进程占用的物理内存
• SHR         进程使用的共享内存
• S         进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
• %CPU       进程占用CPU的使用率
• %MEM     进程使用的物理内存和总内存的百分比
• TIME+        该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
• COMMAND    进程启动命令名称

二、查看内存占用的进程内存分配情况

1、pmap pid去检查内存分布情况

pmap 17354

• Address:00378000-0038d000        进程所占的地址空间
• Kbytes                         该虚拟段的大小
• RSS                                             设备号(主设备:次设备)
• Anon                         设备的节点号,0表示没有节点与内存相对应
• Locked                        是否允许swapped
• Mode                         权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
• Mapping: bash                 对应的映像文件名
(1). 部分32位proc节点内存占用高的原因是用户配置了几百个proc处理线程,而1个线程10M,也就意味着光是线程开销,再启动后就占用了1G多了。
(2). 部分业务会把所有几百个业务so都加载到proc处理模块上去,这也会占用几百兆内存。

三、定位具体占用内存高的代码

如果从前面的步骤也没有定位到具体内存占用高的原因,就要结合具体的代码进行排查了。我们使用valgrind工具集的massif工具进行检测。
检测前,用户需要保证自己的测试环境能够重现内存占用高的问题。
massif工具检测时,需要检测的程序和动态库含有符号信息,也就是使用-g属性进行编译集成。一般我们中间件和发布的库都是携带-g属性编译的,使用开发工具生成的业务so也含有-g属性。
massif工具检测时,需要更多的内存消耗和更久的处理耗时,因此推荐在高性能的测试环境上运行。
4.1. 如何使用massif定位内存泄漏问题
在程序启动命令前添加valgrind命令及参数(massif工具内部会记录下程序每次申请与释放内存的地方,并隔一段时间记录下该时刻的内存使用情况),示例如下:蓝色部分为自己启动进程的命令
valgrind --tool=massif --heap=yes --stacks=yes --detailed-freq=1 servert -f dlr_front.xml -start mainsvr -t ar -s 1 -status 0
如果启动的是守护的程序,即测试程序实际上是由守护程序拉起的,我们就要添加--trace-children=yes,示例如下
valgrind --tool=massif --heap=yes --stacks=yes --detailed-freq=1 --trace-children=yes servert -f dlr_front.xml -start monsvr -t ar -s 1 -status 0
程序启动后,按之前的测试流程重复操作,保证测试时间足够长,看到了内存明显增长的现象;
然后停止程序,注意停止时严禁通过kill等指令强杀程序(实际用户强杀的是valgrind程序,导致valgrind无法正常生成检测结果),我们的中间件一般一般要使用servert -stop指令停止;
程序停止后,会生成落地文件massif.out.XXX;
我们可以使用valgrind自带的ms_print查看(非图形数据,不推荐),或者安装massif-visualizer查看(图形界面,推荐)
• 配置项说明
• --heap=<yes|no> 默认yes,表示对堆空间的消耗进行监控
• --stacks=<yes|no> 默认no,表示对栈空间的消耗进行监控,注意多线程时会有多个栈
• --detailed-freq=<n> 默认10,表示详细快照的频率,当=1时表示每个快照都是详细的。
• --trace-children=<yes|no> 默认no,是否监控创建的子进程,默认只会监控创建的主进程,而不关心子进程的内容。
注:含排队机(或守护进程)的场景一般都是要添加--trace-children=yes的,同时由于存在仲裁代理可能强行kill子进程,导致子进程的监控信息无法落地,因此测试结束后,需要先kill仲裁代理的进程,然后通过servert -stop来正常停止排队机。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

样品实验Celloxide2021P环脂肪族环氧树脂TDS说明书

样品实验Celloxide2021P环脂肪族环氧树脂TDS说明书 200克 500克 1KG/瓶

c#把bitmap格式转换为其他格式图片

增加引用命名空间 using System.Drawing.Imaging; 打开对话框的方式读入bmp格式图片&#xff0c;转换为其他格式。 也可以直接传入图片名称。 OpenFileDialog ofd new OpenFileDialog();ofd.Title "打开对话框";ofd.InitialDirectory "D:/";ofd.Filt…

强化学习-DQN

网上看来很多&#xff0c;但是还是觉得这篇文章将得最好&#xff1a; 可视化强化学习解释 - Deep Q Networks&#xff0c;循序渐进 |Ketan Doshi 博客 (ketanhdoshi.github.io)

Qt串口助手

QT5 串口助手 ​ 由于C课程作业的需要&#xff0c;用QT5写了个简陋的串口助手。只作为一个简单的案例以供参考&#xff0c;默认读者具有C基础和了解简单的Qt操作。 功能展示 【用QT写了个简单的串口助手】 准备工作 Qt自带有<QSerialPort> 库, 可以方便地配置和调用…

招募 品牌设计师:最具创造力、破坏性、颠覆性

PIX Moving 寻 品牌设计师 重点要求「有破坏性」 设计需求 LOGO VI 市场方向 面向欧洲 案例参考 设计要求 &#xff5c; 这辆充满了创意和激情的 NEV 被命名为 Solo&#xff0c;它是 Z 世代用户的个人移动空间&#xff0c;强调个体的力量与价值。产品特征为去中心化创造、…

Zookeeper从零入门笔记

一、入门 1. 概述 2. 特点 3. 数据结构 4. 应用场景 统一命名服务&#xff1a;nginx也可以实现 统一配置管理&#xff1a; 统一集群管理&#xff1a; 服务器动态上下线&#xff1a; 软负载均衡&#xff1a; 二、本地 1.安装 2. 参数解读 三、集群操作 3.1.1 集群安装…

分享:大数据方向学生学徒参与条件

学生学徒制的实施旨在解决当前新技术企业招聘技能人才难和青年就业难的结构性矛盾&#xff0c;通过生态链链主企业携手院校共同解决毕业年度学生就业问题&#xff0c;按照学生个人意愿&#xff0c;建立以就业导向的学生学徒制关系&#xff0c;签订学徒培养协议确定学生就业岗位…

采购业务中的组织概述

目录 一、采购和库存管理中组织单位的概览二、企业的组织结构三、采购中组织结构3.1采购组织3.2采购组 一、采购和库存管理中组织单位的概览 1、 客户端&#xff1a;在SAP ERP系统中&#xff0c;客户端通过三位数字定义&#xff0c;并代表这独立的数据记录和独立的业务流程。客…

【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.4---9.1.6)

目录 9.1.4 设计立方体类 ​编辑 9.1.5 成员函数在类的外部实现 9.1.6 类在其他源文件的实现步骤&#xff08;实现类在不同文件的实现&#xff0c;后续引出构造函数&#xff09; 注意:类定义在同文件testclass.h中&#xff0c;而testclass.cpp是用来实现&#xff08;声明&…

JAVA基础进阶(三)

一、权限修饰符的访问权限 需要特别注意的是: 被private修饰的成员变量以及成员方法只能在本类中进行调用&#xff0c;所以在其他类中创建本类对象,无法直接访问私有成员变量和成员方法,只能通过set、get方法间接访问。被public修饰的成员变量以及成员方法可以在任意地方被调用…

CHEM 14 not know

Goals of this lab: • Create and use a calibration curve for the absorbance/concentration relationship for crystal violet • Evaluate absorbance versus time measurements to determine the order of a reaction • Analyze graphs of data to determine best linea…

微信小程序自定义tabber凸起

一、实现效果 二、下载地址 下载地址 源码有错自己修改一下就行

Jmeter之压力测试总结!

一、基本概念 1.线程组N&#xff1a;代表一定数量的并发用户&#xff0c;所谓并发就是指同一时刻访问发送请求的用户。线程组就是模拟并发用户访问。 2.Ramp-Up Period(in seconds)&#xff1a;建立所有线程的周期&#xff0c;就是告诉jmeter要在多久没启动所有线程&#xff…

JMeter 常见易错问题

1、配置错误&#xff1a; 问题&#xff1a;线程组配置错误&#xff0c;例如设置了错误的线程数或循环次数。 解决方法&#xff1a;检查线程组的配置。确保线程数&#xff08;即并发用户数量&#xff09;设置正确&#xff0c;以及循环次数符合预期。如果要模拟不同类型的用户行…

CAS原理详解

文章目录 1. 问题引入2. CAS底层详解1. Java中CAS实现2. CAS源码分析3. CAS操作存在的缺陷4. ABA问题及其解决方案 1. 问题引入 见下面代码 public class Main {private volatile static int sum0;public static void main(String[] args) throws InterruptedException {for …

TZOJ 1376 母牛的故事(递推和递归)

答案1&#xff08;递推&#xff09;&#xff1a; #include<stdio.h> int main() {int n0,i0;int a[55] { 0,1,2,3,4 }; //数组下标就相当于过了几年&#xff0c;以第四年母牛生出的第一只小母牛成年为周期&#xff0c;初始化前四年的值while (scanf("%d", …

【Docker】Swarm的overlay网络

对于理解swarm的网络来讲&#xff0c;个人认为最重要的两个点&#xff1a; 第一是外部如何访问部署运行在swarm集群内的服务&#xff0c;可以称之为入方向流量&#xff0c;在swarm里我们通过ingress来解决。 第二是部署在swarm集群里的服务&#xff0c;如何对外进行访问&…

Linux环境搭建(Ubuntu22.04)+ 配置共享文件夹(Samba)

Linux开发环境准备 搭建Linux开发环境所需要的软件如下&#xff1a; VMware虚拟机&#xff1a;用于运行Linux操作系统的虚拟机软件之一&#xff0c;VMware下载安装在文章中不做说明&#xff0c;可自行百度谢谢Ubuntu光盘镜像&#xff1a;用于源代码编译&#xff0c;有闲置计算…

自己的测试技术烂, 不学几招怎么能快速提升自己!

很多小伙伴在成功入职后, 进入测试开发发展后, 都会进入一个瓶颈过渡期, 当然能够自己意识到这个问题说明还来得及&#xff01; 那么作为测试开发人员, 如何走出舒适区, 需要学习和掌握那些内容, 从而实现自己的最终目标呢?今天我们就来说一说, 在职场中如何不断的提升自己. …

【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP

目录 第一部分、前言 1、目标效果 2、准备知识 第二部分、详细步骤 1、新建Empty工程 ​2、添加资源文件 3、搭建注册界面 4、搭建登录界面 5、编写注册界面和登录界面的代码 6、设置APP初始界面 7、连接手机&#xff0c;编译工程 第三部分、总结 1、参考资料 2、…