性能分析与调优: Linux 内存观测工具

2024-01-09

目录

一、实验

1.环境

2.vmstat

3.PSI

4.swapon

5.sar

6.slabtop

7.numstat

8.ps

9.top

10.pmap

11.perf

12.bpftrace

二、问题

1.接口读写报错

2.slabtop如何安装

3.numactl如何安装

4.numad启动服务与关闭NUMA

5. perf如何安装

6. kernel-lt-doc与kernel-lt-tools-libs-devel如何安装

7.bpftrace如何安装

8. drsnoop如何使用


一、实验

1.环境

(1)主机

表1-1 主机

主机 架构 组件 IP 备注
prometheus

监测

系统

prometheus、node_exporter 192.168.204.18
grafana 监测GUI grafana 192.168.204.19
agent

监测

主机

node_exporter 192.168.204.20

(2)内存观测工具

表1-2 内存观测工具

序号 工具 描述
1 vmstat 虚拟内存和物理内存统计信息
2 PSI 内存压力滞留信息
3 swapon 交换设备使用率
4 sar 历史统计信息
5 slabtop 内核slab分配器统计信息
6 numastat NUMA分析
7 ps 进程状态
8 top 监测每个进程的内存使用率
9 pmap 进程地址空间统计信息
10 perf 内存PMC和跟踪点分析
11 bpftrace 用于内存分析的跟踪程序

2.vmstat

(1) 每秒1次,共5次输出

[root@agent ~]# vmstat 1 5

(2)-S 选项将输出单位修改为MB(m表示1 000 000, M表示 1 048 576)

[root@agent ~]# vmstat -Sm 1 5

[root@agent ~]# vmstat -SM 1 5

(3) -a 选项可以输出非活动inactive和活动页active缓存的明细

[root@agent ~]# vmstat -a 1 5

3.PSI

(1) 显示是否有内存压力,和过去5分钟内的变化情况

cat /proc/pressure/memory

some开头的一行显示了一些任务(线程)受到影响的时间,full开头的一行显示了所有可运行任务受到影响的时间

4.swapon

(1) 显示配置的交换设备以及使用率

[root@agent ~]# swapon

5.sar

(1) -B 换页统计信息

每秒1次,共5次

[root@agent ~]# sar -B 1 5

(2)-H 巨型页统计信息

每秒1次,共5次

[root@agent ~]# sar -H 1 5

(3)-r 内存使用率

每秒1次,共5次

[root@agent ~]# sar -r 1 5

(4)-S 交换空间统计信息

每秒1次,共5次

[root@agent ~]# sar -S 1 5

(5)-W 交换统计信息

[root@agent ~]# sar -W 1 5

6.slabtop

(1) 输出内核slab缓存使用情况

每5s显示一次

[root@agent ~]# slabtop -d 5

7.numstat

(1)查询CPU插槽系数

为非统一内存访问(NUMA)系统提供统计数据

[root@agent ~]# numastat

8.ps

(1) 列出包括内存使用同统计信息在内的所有进程细节

[root@agent ~]# ps aux

(2)数据列用SVR4 方式的-o选择

[root@agent ~]# ps -eo pid,pmem,vsz,rss,comm

9.top

(1) 显示内存使用统计信息

[root@agent ~]# top -o %MEM

10.pmap

(1) 列出一个进程的内存映射,显示其大小、权限和映射对象

[root@agent ~]# pmap -x 755

(2)-X 显示更多的细节

[root@agent ~]# pmap -X $(pgrep mysqld) | head -2

(3)-XX 显示内核提供的“一切”

[root@agent ~]# pmap -XX $(pgrep mysqld) | head -2

11.perf

(1) 采样整个系统的缺页(RSS增长)机器栈踪迹,按下CTRL+C组合键结束

[root@agent ~]# perf record -e page-faults -a -g 

(2)记录pid为755的进程在60秒内发生的所有却也及其栈踪迹

[root@agent ~]# perf record -e page-faults -c 1 -p 755 -g -- sleep 60

(3)通过brk记录栈的增长,按下CTRL+C组合键结束

[root@agent ~]# perf record -e syscalls:sys_enter_brk -a -g

(4)记录NUMA系统上的页迁移情况

[root@agent ~]# perf record -e migrate:mm_migrate_pages -a

(5)使用栈踪迹来跟踪kswapd唤醒时间,按下CTRL+C组合键结束

[root@agent ~]# perf record -e vmscan:mm_vmscan_wakeup_kswapd -ag

12.bpftrace

(1)按代码路径对进程堆扩张情况(brk)计数

[root@agent ~]# bpftrace -e 'tracepoint:syscalls:sys_enter_brk { @[ustack,comm] = count(); }'

(2)按跟踪点对vmscan操作数量计数

[root@agent ~]# bpftrace -e 'tracepoint:vmscan:*  { @[probe] = count(); }'

(3)按进程对swapins操作数量计数

[root@agent ~]# bpftrace -e 'kprobe:swap_readpage { @[comm,pid] = count(); }'

(4) 对页迁移数量计数

[root@agent ~]# bpftrace -e 'tracepoint:migrate:mm_migrate_pages  { @  = count(); }'

(5)跟踪内存压缩事件

[root@agent ~]# bpftrace -e 't:compaction:mm_compaction_begin  { time(); }'

(6)列出内核kmem的跟踪点

[root@agent ~]# bpftrace -l 't:mm_*'

(7)列出所有内存子系统(mm)的跟踪点

[root@agent ~]# bpftrace -l 't:mm_*'

二、问题

1.接口读写报错

(1)报错

提示“不支持的操作”或 "Operation not supported"

(2)原因分析

查看当前内核版本

5.4 版本的内核在 "psi_proc_init" 函数中没有进行 "psi_enable" 的判断,就直接创建了 "/proc" 下的这些文件,导致可以看到而不能使用。

(3)解决方法

此问题已在 5.6 版本里修复了,如下面的commit。

sched/psi: create /proc/pressure and /proc/pressure/{io|memory|cpu} o… · torvalds/linux@3d81768 · GitHub

2.slabtop如何安装

(1)安装

yum install procps-ng

(2)使用

slabtop -d 5              #每5s显示一次

(3)参数

选项 说明
-d n / --delay=n 设置显示的时间间隔
-s S / --sort=S 设置排序规则。a,以活动对象数目排序;b,以每个slab对象数目排序;c,以缓存大小排序;l,以slab数量排序;v,以多动的slab排序;n,以名字排序;o,以对象数目排序;p,以每slab的页数排序;u,以缓存利用率排序
-o /--once 只显示一次,之后退出
-V / --version 显示版本信息,并且退出
--help 显示帮助信息,并且退出

设置排序规则

[root@agent ~]# slabtop -s S

只显示一次,之后退出

显示版本信息

[root@agent ~]# slabtop -V

显示帮助信息

[root@agent ~]# slabtop --help

3.numactl如何安装

(1)安装

yum -y install numactl

(2) 使用

numactl -H      #查看当前服务器的NUMA配置。

(3)参数

--show:可以查看当前的numa策略,

-H:可以显示各Node中内存使用情况

--membind:只从某节点分配内存,当某节点内存不足,则会分配失败,格式:

numactl --membind=nodes program(nodes写你要分配的节点0或1或者其它节点数,后面是程序,可以写绝对路径,也可写服务启动脚本)

--numactl:把进程绑定到某节点上,用法如下:

numactl --cpunodebind=nodes program(nodes为Cpu节点,后面跟程序,)

--physcpubind:把进程绑定到某核心上,如果程序运行,用法如下(参数太长就简写了,其它简写参数自己Man):

numactl -C 1,3 httpd

--localalloc:指令永远在当前节点分配内存,用法:

numactl -l httpd

--preferred:如果指定的内存无法分配足够的空间,可以指定去某一个节点的内存分配,格式如下:

numactl --preferred=0 http

4.numad启动服务与关闭NUMA

(1)numad

numad是一个自动numa亲和度管理进程。监控NUMA拓扑和资源使用,来动态提高NUMA资源分配和管理。


(2)启动命令

service numad start

(3)关闭NUMA

方法一:通过bios关闭

BIOS:interleave = Disable / Enable

方法二:通过OS关闭

①编辑 /etc/default/grub 文件,加上:numa=off

GRUB_CMDLINE_LINUX="crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"

②重新生成 /etc/grub2.cfg 配置文件

grub2-mkconfig -o /etc/grub2.cfg

③ 重启操作系统

reboot

④ 确认

# dmesg | grep -i numa

# cat /proc/cmdline

5. perf如何安装

(1)查看当前可用的内核发行版本

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

(2)安装

yum --enablerepo=elrepo-kernel install perf

6. kernel-lt-doc与kernel-lt-tools-libs-devel如何安装

(1)查看当前可用的内核发行版本

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

(2) 安装依赖包

yum --enablerepo=elrepo-kernel install kernel-lt-doc \
kernel-lt-tools-libs-devel

7.bpftrace如何安装

(1)查询

rpm -qa | grep bcc-static
rpm -qa | grep bcc-tools
rpm -qa | grep bpftrace 
rpm -qa | grep bpftrace-tools
rpm -qa | grep  bpftrace-doc

(2)添加repo

curl https://repos.baslab.org/rhel/7/bpftools/bpftools.repo --output /etc/yum.repos.d/bpftools.repo 

(2)安装

 yum install bpftrace bpftrace-tools bpftrace-doc bcc-static -y

8. drsnoop如何使用

(1) 跟踪通过直接回收释放内存的方法,显示受影响的进程和延时

drsnoop -T
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

性能分析与调优: Linux 内存观测工具 的相关文章

  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案

随机推荐

  • 智慧农业之新导物联RFID果园苗圃系统-新导物联

    新导物联RFID果园苗圃系统是一种利用射频识别技术 RFID 来管理果园和苗圃的系统 该系统通过在植物或容器上附加RFID标签 将每个植物或容器与唯一的识别代码相关联 使用RFID果园苗圃系统的主要目的是实现对植物和容器的自动化追踪和管理
  • 【数据压缩】基于哈夫曼编码的数据压缩算法matlab,输出哈夫曼编码树

    目录 1 算法仿真效果 2 MATLAB源码 3 算法概述 3 1 哈夫曼树构建 3 2 哈夫曼编码生成
  • 职场生存能力最强的5类人:如何成为职场中的佼佼者?

    职场生存能力最强的5类人 如何成为职场中的佼佼者 在职场中 生存能力强的人往往更容易获得成功 他们具备各种能力和特质 使他们能够在激烈的竞争中脱颖而出 本文将介绍职场生存能力最强的5类人 看看你是否具备这些特点 一 适应能力强的人 在职场中
  • Jmeter扩展函数?年薪50W+的测试大佬教你怎么玩

    很多同学 都问我 老师 我的 jmeter 里面 怎么没有 MD5 函数 base64 函数也没有 我是不是用了假的 jmeter 哈哈哈 不是的 jmeter 的函数 有自带函数和扩展函数两大块 自带函数 就是 jmeter 官方自带的
  • 计算机丢失mfc140.dll怎么办?解决mfc140.dll缺失的3种方法分享

    计算机丢失mfc140 dll怎么办 在使用微软办公软件的时候 可能会弹出一个错误提示框说 找不到mfc140 dll 无法继续执行代码 为了不影响工作效率 我们可能需要亲自动手尝试修复这一问题 以下是一些mfc140 dll缺失的3种方法
  • INT201 形式语言与自动机笔记(上)

    Lec1 Overview Alphabet and String 字母表与字符串 Alphabet 字母表 a finite nonempty set of symbols String word a finite sequence of
  • 如何处理不稳定的自动化测试?

    abluecolor 在解决这个问题之前 请停止编写更多测试 因为这将花费你较高的测试维护成本 你需要尽快行动起来对不稳定的原因进行深入研究 找到不稳定的根因 并且尝试在流程 环境和代码方面做一些优化工作解决它 MasterKindew 如
  • mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

    文章目录 场景 使用JacksonTypeHandler实现类型转换 自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中 mybatisPlus默认实现了JacksonTy
  • Stable Diffusion运行时自动重启的小程序

    Stable Diffusion在运行过程中 常常因为各种原因导致服务挂掉 所以希望能定时检查程序是否存活 如果dead则重启一下 思路 stable diffusion运行时需要使用GPU 如果GPU没有在用 并且GPU对应的进程也找不到
  • 多进程之Binder的意外死亡及权限校验

    Android多进程系列 Android 多进程通讯之几个基本问题 Android多进程之Binder的使用 Android多进程之手动编写Binder类 Android多进程之Binder解绑监听的问题 Android 多进程之Messe
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Ubuntu下git提示:终止提交因为提交说明为空。

    这么简单的问题居然搜索了一会儿 现在的网络环境越来越差了 解决方法 gedit git config global core editor gedit s the paramater s means set the gedit mode t
  • 使用匿名binder实现client向server端的死亡通知

    一 引言 因为binder是跨进程通信 难免会遇到服务端出现异常挂死的情况 这个时候需要通知到客户端进行相应的处理 在网络通信中是非常常见的机制 当然 在binder中 Android也为我们写好了相关的框架 但通过binder源码分析 你
  • IBinder 解析

    远程对象的基础接口 是一个为了在执行进程中和进程间调用时的高性能 而设计的轻量级 远程调用 机制的核心部分 这个接口描述了和远程对象交互的抽象协议 不要直接实现这个接口 而是通过继承 Binder 来实现 IBinder的关键 API 是与
  • 如何避免过度努力带来的负面影响

    在快节奏的现代职场中 我们经常听到关于 努力 的话题 有些人认为 只有通过不断地努力和投入 才能够获得成功 然而 如果过度用力 可能会带来一些负面影响 本文将探讨职场中过度用力的负面影响以及如何避免这些问题 首先 让我们来看一下过度用力的负
  • Mockito3.x详解

    目录 Mockito 1 简单示例 2 打桩测试 3 参数匹配器 4 调用次数验证 5 通过打桩为无返回值函数抛出异常 6 验证调用顺序 7 验证从未发生过的交互
  • 手写转文字扫描软件有哪些?方便又好用的工具谁不喜欢?

    大家有没有仔细数过 你们在从小到大的学习生涯中使用了多少笔记本 反正我是经常被我妈催着把以前的笔记本丢掉 但是它们承载的可都是我学生时代的记忆 就连当时觉得复杂难懂的内容 其实也挺有意思的 所以 我一直在思考 到底有什么方法可以让我在不占用
  • Binder机制知识点

    引言 在Android领域 Binder作为进程间通信的核心机制 是每位Android技术人员都应该深入了解的重要知识点 本文将从面试官的角度出发 围绕Android Binder展开一系列高级疑难问题 通过问题分析与问题简答 旨在帮助大家
  • 静态关键字:static

    static的作用 static是静态的意思 可以修饰成员变量和成员方法 static修饰成员变量表示该成员变量只在内存中只存储一份 可以被共享访问 修改 成员变量 分为2类 静态成员变量 有static修饰 属于类 内存中加载一次 常表示
  • 性能分析与调优: Linux 内存观测工具

    目录 一 实验 1 环境 2 vmstat 3 PSI 4 swapon 5 sar 6 slabtop 7 numstat 8 ps 9 top 10 pmap 11 perf 12 bpftrace 二 问题 1 接口读写报错 2 sl