没有合适的资源?快使用搜索试试~ 我知道了~
glusterfs的那些事-3.51
需积分: 0 0 下载量 200 浏览量
2022-08-04
00:04:23
上传
评论
收藏 319KB PDF 举报
温馨提示
![preview](https://dl-preview.csdnimg.cn/86317340/0001-3b99b03b2428fea444ade5cf360eb233_thumbnail.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
试读
18页
glusterfs的那些事-3.51
资源详情
资源评论
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86317340/bg1.jpg)
118
3.5.
内存跟踪调用
前面提到了关于 inode 和一些接口的事情,那么这一节主要想了解一下关于
内存相关的,因为内存泄露的问题,在系统开发中会时不时地出现,尤其是因为
glusterfs 使用 C 语言进行开发的,并没有 java 和 python 这些语言天然自带
的内存回收管理机制。
3.5.1. mem_acct
在前面介绍 xlator 的内容中,提到了关于_xlator 结构,这个就是每个功能
模块的数据结构定义,在这个结构里面,有一个和该模块的内存相关的变量,如
下所示。
1.
struct _xlator {
2.
...
3.
int32_t (*mem_acct_init)(xlator_t *this);
4.
struct mem_acct *mem_acct;
5.
...
6.
}
在这个结构里面的 mem_acc_init 是一个函数,在 xlator 初始化的时候和
调用的时候,会记录该 xlator 的一些内存相关的信息,那么这里还有一个相关
的数据结构,就是 men_acct 了,这个结构定义在 mem-pool.h 文件中,这里
的定义如下所示。
1.
struct mem_acct_rec {
2.
const char *typestr;
3.
uint64_t size;
4.
uint64_t max_size;
5.
uint64_t total_allocs;
6.
uint32_t num_allocs;
7.
uint32_t max_num_allocs;
![](https://csdnimg.cn/release/download_crawler_static/86317340/bg2.jpg)
119
8.
gf_lock_t lock;
9.
...
10.
};
11.
12.
struct mem_acct {
13.
uint32_t num_types;
14.
gf_atomic_t refcnt;
15.
struct mem_acct_rec rec[0];
16.
};
从上面的内容中可以看到,这里记录了总的内存容量,最大可申请的容量等
变量,那么下面就来简单了解一下,每个 xlator 初始化的时候的函数调用。
3.5.2. xlator_init
每一个 xlator 在初始化的时候,需要调用 xlator_init 函数,这个函数定义
在 xlator.c 中,在这个函数中,就会对该 xlator 的内存做一些初始化的工作,
下面来简单了解一下。
1. int
2. xlator_init(xlator_t *xl)
3. {
4. ...
5. if (xl->mem_acct_init)
6. xl->mem_acct_init(xl);
7. ...
8. }
这里就是会调用 xlator 的 mem_acct_init 函数,那么这里和前面提到的
xlator_api 中的 mem_acct_init 就对应上了,这里会关联每个 xlator 的对应
的函数,例如对于 afr 来说,这里就是 afr.c 中的 mem_acct_init 函数了,如
下所示。
1. int32_t
![](https://csdnimg.cn/release/download_crawler_static/86317340/bg3.jpg)
120
2.
mem_acct_init(xlator_t *this)
3.
{
4.
int ret = -1;
5.
6.
if (!this)
7.
return ret;
8.
9.
ret = xlator_mem_acct_init(this, gf_afr_mt_end + 1);
10.
11.
if (ret != 0) {
12.
return ret;
13.
}
14.
15.
return ret;
16.
}
那么这里调用的 xlator_mem_acct_init 中的第二个参数 gf_afr_mt_end
又是什么呢?这个是每个 xlator 定义的 mem types,因为对于不同的模块来
说,需要关注的内存的类型是不同的,例如 afr 模块,这里需要考虑定义不同的
内存类型的,这里的定义在 afr-mem-types.h 文件中, 那么接着这里进入到
xlator_mem_acct_init 函数中查看一下实现。
1.
int
2.
xlator_mem_acct_init(xlator_t *xl, int num_types)
3.
{
4.
int i = 0;
5.
int ret = 0;
6.
...
7.
xl->mem_acct = MALLOC(sizeof(struct mem_acct) +
8.
sizeof(struct mem_acct_rec) * n
um_types);
9.
10.
...
11.
xl->mem_acct->num_types = num_types;
12.
GF_ATOMIC_INIT(xl->mem_acct->refcnt, 1);
13.
14.
for (i = 0; i < num_types; i++) {
![](https://csdnimg.cn/release/download_crawler_static/86317340/bg4.jpg)
121
15.
memset(&xl->mem_acct->rec[i], 0, sizeof(struct me
m_acct_rec));
16.
ret = LOCK_INIT(&(xl->mem_acct->rec[i].lock));
17.
if (ret) {
18.
fprintf(stderr, "Unable to lock..errno : %d",
errno);
19.
}
20.
#ifdef DEBUG
21.
INIT_LIST_HEAD(&(xl->mem_acct->rec[i].obj_list));
22.
#endif
23.
}
24.
25.
return 0;
26.
}
那么这里会做一些安全检查,并且调用 MALLOC,这个是一个宏定义,最后
还是会调用 malloc 系统函数,然后申请一些内容,接着就是会进行 memset,
也就是一些简单的信息设置。
那么做完了这些,对于一个 xlator 来说,内存初始化部分基本算完成了,
而在系统运行中,这里要申请内存的话,就要使用到另外一个东西,叫做
GF_CALLOC,在下一节中将会讲解。
3.5.3. GF_CALLOC
这里 GF_CALLOC 是一个宏定义,这里的定义在 mem-pool.h 文件中,定
义如下所示。
1. #define GF_CALLOC(nmemb, size, type) __gf_calloc(nmemb, s
ize, type, #type)
2.
3. #define GF_MALLOC(size, type) __gf_malloc(size, type, #ty
pe)
4.
5. #define GF_REALLOC(ptr, size) __gf_realloc(ptr, size)
剩余17页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rpm](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![avatar](https://profile-avatar.csdnimg.cn/f0552c2ae1d7495389fb9d2ece3acaf7_weixin_35813719.jpg!1)
鲸阮
- 粉丝: 19
- 资源: 303
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- ch05-卷积神经网络(CNN).zip
- 操作系统实验二:存储管理(分析XV6分页存储地址变换)
- 一个MATLAB画图的进阶示例,展示如何绘制具有颜色映射的三维表面图,并添加图例和注释
- 前程无忧大数据.xlsx
- JavaMail-jar
- 推荐系统实战练习项目和源码.rar
- 微机原理与接口技术HQFC-A系列USB实验
- 联想笔记本维修图纸:Lenovo V130-15IKB Wistron LV315KB 17807 17807-1 17807
- 一个MATLAB GUI进阶示例,展示如何创建一个简单的用户界面,该界面使用户能够输入两个数值,执行加法运算,并显示结果
- JavaScript 基础学习1(js引入方式、基础使用、核心语法、复合类型) 示例代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0