Linux系统物理内存碎片可视化监控工具
本项目主要开发一款Linux系统物理内存碎片可视化监控工具,用于对当前运行系统中物理内存碎片化程度进行可视化监控和记录。 本项目主要实现的功能有:
定时收集当前系统环境中物理内存碎片化程度信息,定时时间可配置;
记录内存碎片化数据信息;
使用一种可视化工具对当前收集的物理内存碎片化信息进行直观展示。
这里主要是基于BCC进行开发,在内核态使用 eBPF ,用户态使用 Python进行开发。
本项目基于BCC进行开发,因此需要安装BCC环境,参考文档,这里介绍一下在Ubuntu下和 openeuler下配置 BCC 的环境。
一般来说,要使用这些功能,需要 Linux 内核版本 4.1 或更高版本,内核版本通过uname -r
来查看
sudo apt update
这里根据自己的ubuntu版本来选择
# For Focal (20.04.1 LTS)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm12 llvm-12-dev libclang-12-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev arping netperf iperf
# For Hirsute (21.04) or Impish (21.10)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm12 llvm-12-dev libclang-12-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev arping netperf iperf
# For Jammy (22.04)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev libdebuginfod-dev arping netperf iperf
# For Lunar Lobster (23.04)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm15 llvm-15-dev libclang-15-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev libdebuginfod-dev arping netperf iperf libpolly-15-dev
# For Mantic Minotaur (23.10)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm16 llvm-16-dev libclang-16-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev libdebuginfod-dev arping netperf iperf libpolly-16-dev
# For other versions
sudo apt-get -y install zip bison build-essential cmake flex git libedit-dev \
libllvm3.7 llvm-3.7-dev libclang-3.7-dev python zlib1g-dev libelf-dev python3-setuptools \
liblzma-dev arping netperf iperf
# For Lua support
sudo apt-get -y install luajit luajit-5.1-dev
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd
No module named 'setuptools'
解决办法:python默认是没有安装setuptools这个模块的,进行安装 sudo apt-get install python3-setuptools
cd bcc/tools
ls
执行ls
会发现有很多python文件,执行sudo python3 biolatency.py
此时则代表环境配置成功
在安装 openEuler 系统时,我们最好勾选“ 软件选择 ==> 已选环境的附加软件 ==> 开发工具”,这样会免去安装很多开发工具,例如 git、python3 等
如果没有勾选,我们可以通过以下命令安装相应的开发工具:
sudo dnf install git -y
sudo dnf update
sudo dnf install python3 python3-pip
一般来说,要使用这些功能,需要 Linux 内核版本 4.1 或更高版本,内核版本通过uname -r
来查看
执行命令
sudo dnf update
sudo dnf install bcc
通过这两条命令更新软件包并会自动安装 bcc开发的相关环境及工具,例如bpf-tools、python3-bpfcc、llvm-libs、clang-libs
等。
安装完成之后,我们进入到默认的安装目录/usr/share/bcc
中,可以看到有个文件夹tools
。
通过cd /usr/share/bcc/tools
进入该文件夹下,使用sudo运行一个二进制文件结果如下报错,我们需要去执行sudo dnf install kernel-devel-$(uname -r)
安装当前运行内核版本的开发包即可解决。
再次执行sudo ./execsnoop
,终端输出数据,如下图,说明bcc环境通过软件包的形式配置好了
在openeuler环境下和Ubuntu环境下类似,这里介绍的是openeuler环境下如何使用内存碎片化工具。
通过git clone git@gitee.com:gyxforeveryoung/PilotGo-plugin-MFD.git
克隆项目代码到本地,进入到PilotGo-plugin-MFD文件夹中。
.
├── img
├── README.en.md
├── README.md
└── src
├── bpf
│ ├── extfraginfo.c
│ └── fraginfo.c
├── extfrag.py
├── extfrag_user.py
└── __pycache__
└── extfrag.cpython-311.pyc
extfrag.py
文件,用于实现提取相应格式的数据函数
extfrag_user.py
文件,用于实现命令行接口
extfraginfo.c
实现监测外碎片化事件
fraginfo.c
统计系统中所有内存节点中的所有 zone
对于不同 order
的碎片化程度
采集的碎片化程度信息如下:
zone
的名称,有DMA/NORMAL/DMA32等extfrag_index
指数unusable_index
指数采集的节点信息如下:
pgdat
的起始页帧号采集的外碎片化事件信息如下:
运行sudo python3 ./extfrag_user.py
之后,遇到如下报错:
这个错误,我们需要去extfrag.py
代码中修改:
extfrag.py
使用from bpf import BPF
导入bpfextfrag.py
使用from bpfcc import BPF
导入bpf避免每次都要显式使用 python
命令来运行脚本,你可以为脚本添加一个 shebang 行,然后确保脚本具有可执行权限。
extfrag_user.py
和extfrag.py
添加一个 shebang 行#!/usr/bin/env python3
chmod +x extfrag_user.py
chmod +x extfrag.py
现在可以使用sudo ./extfrag_user.py
来直接运行脚本
sudo ./extfrag_user.py -h
查看帮助函数sudo ./extfrag_user.py -n
查看node节点的信息sudo ./extfrag_user.py -z -d 2
查看所有区域的详细信息sudo ./extfrag_user.py
查看 node节点的所有区域内存碎片化程度信息sudo ./extfrag_user.py -b
进行展示碎片化指数sudo ./extfrag_user.py -v
可视化UMA架构下的所有区域的碎片化程度信息sudo ./extfrag_user.py -n
查看node节点的信息sudo ./extfrag_user.py -z -d 2
查看所有区域的详细信息sudo ./extfrag_user.py -d 2 -i 1
仅查看node_id=1的内存碎片化程度信息sudo ./extfrag_user.py -d 2 -c Normal
仅查看zone名称为 Normal 的内存碎片化程度信息sudo ./extfrag_user.py -b
展示碎片化程度sudo ./extfrag_user.py -v
可视化NUMA架构下的所有区域的碎片化程度信息sudo ./extfrag_user.py -s
查看系统中发生外碎片化的进程的详细信息以及发生外碎片化的次数内存碎片化监测工具,监测的主要是每个zone当中对于不同的order的内存碎片化程度,我们这里使用stress-ng加压测试,来判断我们的内存碎片化工具是否能够根据采集到zone的信息去动态改变
stress-ng工具通过sudo dnf install stress-ng
安装,具体使用方法请参考文档。
重启系统后,在第一个终端运行内存碎片化监测工具,重新开启一个终端使用 stress-ng 进行加压,来观察系统的内存碎片化程度是否会增加。
sudo ./extfrag_user.py -v
查看压测前的内存碎片化程度终端2执行命令stress-ng --vm 5 --vm-bytes 3G
进行加压测试,使用 5 个进程占用 3G 内存
间隔20s,运行sudo ./extfrag_user.py -v
查看压测后的内存碎片化程度
sudo ./extfrag_user.py -v
查看压测前的内存碎片化程度终端2执行命令stress-ng --vm 5 --vm-bytes 5G
进行加压测试,使用 5 个进程占用 5G 内存
间隔40s,运行sudo ./extfrag_user.py -v
查看压测后的内存碎片化程度
通过对于加压前后对比系统内的内存碎片化结果,我们可以看出,在加压后,内存碎片化程度会显著增加。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。