Skip to content

Commit

Permalink
Merge pull request #772 from Super-Lzzx/develop
Browse files Browse the repository at this point in the history
mem_watcher:修改README.md
  • Loading branch information
chenamy2017 committed Apr 25, 2024
2 parents bd96bbb + 19f7e48 commit acbf12c
Show file tree
Hide file tree
Showing 8 changed files with 20 additions and 386 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,21 @@
memwatcher是一款基于eBPF的内存监测工具,其设计的目的就是为了可以让用户能够在主机环境上可以快捷的检测到Linux内存的详细信息。
通过高效的数据收集和精准的监控能力,帮助用户可以有效的监控主机内存情况。
使用了eBPF(Extended Berkeley Packet Filter)来监控内核中的几个关键事件,主要涉及到内存管理方面的几个功能:
第一:`get_page_from_freelist:`

- 监控页面分配过程中的某些关键参数。
- 捕获了页面分配时的一些重要信息,比如所用的gfp_mask、order、alloc_flags等。
本项目是内存性能分析工具集合,采用libbpf编写。现有工具procstat(进程内存状态报告),sysstat(系统内存状态报告),paf(内存页面状态报告),pr(内存回收状态报告)和memleak(内存泄漏检测)。

第二:`shrink_page_list:`
- procstat的跟踪点为finish_task_switch,在任务切换完成时执行相应的操作。在 Linux 内核中,任务切换是指操作系统从一个进程或线程切换到另一个进程或线程的过程。该跟踪点在每次任务切换完成时被调用。这使得内核开发人员能够在任务切换时执行特定的操作或者监控任务切换的行为。

- 监控页面收缩(shrink)过程中的一些参数。
- 捕获了页面收缩时的关键参数,如nr_to_reclaim、nr_reclaimed等。
- sysstat的跟踪点为get_page_from_freelist,其功能是从空闲页列表中获取页面。在 Linux 内核中,"页" 是内存管理的基本单位,用于存储数据和代码。"空闲页列表" 是管理系统内存的一种机制,用于跟踪可用的物理内存页。

第三:`finish_task_switch:`
- paf的跟踪点也为get_page_from_freelist,经过分析,页面申请失败分析工具的理想挂载点应该是慢速路径的入口函数(__alloc_pages_slowpath)。但是这个函数不允许ebpf程序挂载,所有将函数挂载点选在快速路径的入口函数get_page_from_freelist上。为了确保数据确实是在页面申请失败的情况下才会打印数据,对alloc_pages_nodemask函数的返回值进行挂载,当alloc_pages_nodemask函数没有返回页面结构体page时,也就是页面申请失败的情况下单元提取的数据。

- 监控进程切换完成时的内存相关参数。
- 捕获了进程切换时的一些内存使用情况,如pid、vsize、rss等。
- pr的跟踪点是shrink_page_list,shrink_page_list函数是页面回收后期指向函数,主要操作是遍历链表中每一个页面,根据页面的属性确定将页面添加到回收队列、活跃链表还是不活跃链表。监测系统的页面回收和写回情况,对系统内存使用和性能优化非常重要。整体来说,这些参数可以帮助系统管理员或开发人员了解系统内存管理的情况,包括页面回收的效率、脏页处理情况以及写回操作的进度。

第四:`get_page_from_freelist:`

- 监控页面分配的另一方面,可能是为了提供更全面的内存分配情况。
- 捕获了更多与页面分配相关的内存统计信息,如anon_inactive、file_inactive等。
- memleak用于跟踪内核内存分配和释放的情况,并记录相关的统计信息。eBPF 提供了一种高效的机制来监控和追踪系统级别的事件,包括内存的分配和释放。通过 eBPF,可以跟踪内存分配和释放的请求,并收集每次分配的调用堆栈。然后,分析这些信息,找出执行了内存分配但未执行释放操作的调用堆栈,这有助于程序员找出导致内存泄漏的源头。

通过收集这些信息,可以用于监控系统内存的使用情况、诊断内存相关的性能问题以及进行性能优化。

第五:

内存泄露是指程序在申请内存后,无法释放或未能及时释放,从而导致系统内存的不断消耗,最终导致程序的崩溃或性能的下降。这种现象一般发生在程序中有大量的动态内存分配和释放操作,如果程序员忘记或者疏忽了释放内存,就有可能导致内存泄露。

eBPF 提供了一种高效的机制来监控和追踪系统级别的事件,包括内存的分配和释放。通过 eBPF,可以跟踪内存分配和释放的请求,并收集每次分配的调用堆栈。然后,分析这些信息,找出执行了内存分配但未执行释放操作的调用堆栈,这有助于程序员找出导致内存泄漏的源头。

------
Expand All @@ -40,6 +29,7 @@ eBPF 提供了一种高效的机制来监控和追踪系统级别的事件,包

目前,传统的内存性能分析工具通过读取proc文件系统下的数据,经过简单的处理后呈现给用户,方便管理人员随时了解系统状况。然而这些工具的灵活性非常差,单个工具输出的信息有限。系统维护人员在分析性能问题时常常需要借助多个工具才能进行。步骤繁琐且工具本身对系统性能也有一定影响。随着ebpf技术在系统可观测上的发展,利于ebpf非侵入式的数据获取方式已被大多数企业、高校认可并取得了一定的研究成果。ebpf的可编程性可以让管理人员灵活的获取系统的运行数据,而且在数据的提取粒度上有着传统工具无法比拟的优势。现在,ebpf作为Linux内核顶级子系统,已经成为实现Linux内核可观测性、网络和内核安全的理想技术。


------

# mem_watcher据体代码的分析。
Expand Down Expand Up @@ -89,6 +79,8 @@ eBPF 提供了一种高效的机制来监控和追踪系统级别的事件,包

![](./image/7.png)

### 可以解决的问题
首先,通过监测这些指标,可以及时发现内存使用异常或泄漏问题,针对性地进行性能优化和内存管理,确保系统运行的高效性和稳定性。其次,了解进程的内存占用情况有助于有效管理系统资源,避免资源浪费和冲突,提高整体资源利用率。此外,当系统出现内存相关的故障或异常时,通过分析这些指标可以快速定位问题所在,有针对性地进行故障排除和修复,缩短系统恢复时间。结合这些指标可以进行性能调优,优化内存分配和释放策略,提升系统的响应速度和整体性能表现。
## sysstat

### 采集信息:
Expand Down Expand Up @@ -174,6 +166,9 @@ struct mempolicy *get_task_policy(struct task_struct *p)
■ 当前剩余内存总量的统计需要遍历所有内存管理区来统计,但是由于内存管理区的空闲页面信息存储在数组第一个位置,使用指针指向时,统计到的数据不准确,使用变量统计会出现数据类型错误的报告。
### 可以解决的问题
通过提取内存指标,可以及时发现潜在问题,如内存泄漏,从而采取相应措施。此外,了解各种内存类型的使用情况有助于合理分配资源,提高系统效率,并确保数据一致性。
## paf
### 采集信息
Expand Down Expand Up @@ -259,7 +254,8 @@ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,
■ 因为内存管理区的剩余内存空间处在vm_stat数组第一位,经过分析,使用指针提取的数组第一个数据总是存在差异,需要调整。
■ 对打印的标志位需要进一步解析,方便快速确认当前申请页面类型。
### 可以解决的问题
可以帮助监控系统内存的使用情况,预测内存不足的可能性,以及在必要时触发相应的内存回收机制来保证系统的稳定性和性能。
## pr
Expand Down Expand Up @@ -295,6 +291,9 @@ shrink_page_list
shrink_page_list函数是页面回收后期指向函数,主要操作是遍历链表中每一个页面,根据页面的属性确定将页面添加到回收队列、活跃链表还是不活跃链表.这块遍历的链表是在上一级函数 shrink_inactive_list中定义的临时链表,因为一次最多扫描32个页面,所有链表最多含有32个页面。在shrink_page_list这个函数中还有一个重要操作是统计不同状态的页面数量并保存在scan_control结构体中。而工具数据提取的位置就是找到这个结构体并获取有关性能指标。因为这个提取的数据都是内核函数实时更改的,所有具有较高准确性。
scan_control结构体是每次进行内存回收时都会被回收进程重新定义,所有会看到数据是一个增长状态,之后有回归0,这和挂载点也有一定关系。
### 可以解决的问题
监测系统的页面回收和写回情况,对系统内存使用和性能优化非常重要。整体来说,这些参数可以帮助系统管理员或开发人员了解系统内存管理的情况,包括页面回收的效率、脏页处理情况以及写回操作的进度。
## memleak
### 功能
Expand All @@ -318,6 +317,8 @@ scan_control结构体是每次进行内存回收时都会被回收进程重新
定义了一个 `uprobe`(用户空间探测点):
`free_ente`r:此探测点附加到 `free` 函数的入口点。它从 allocs 映射中检索与正在释放的地址相关的分配信息。然后,它更新 `combined_allocs` 映射以反映释放。
### 可以解决的问题
可以帮助用户准确的找出内存泄露的位置,更好的排查出所存在的问题。
# 工具的使用方法说明
Expand Down Expand Up @@ -436,7 +437,7 @@ stack_id=0x3c14 with outstanding allocations: total_size=8 nr_allocs=2
------
## 测试环境

deepin20.6,Linux-5.17;
ubuntu20.2,Linux-5.17;

libbpf:[libbpf-bootstrap](https://github.com/libbpf/libbpf-bootstrap)

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading

0 comments on commit acbf12c

Please sign in to comment.