Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
0f2c6b6a
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0f2c6b6a
编写于
3月 20, 2018
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Streams: improve MEMORY USAGE computation, include CGs.
上级
55771304
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
56 addition
and
15 deletion
+56
-15
src/object.c
src/object.c
+56
-15
未找到文件。
src/object.c
浏览文件 @
0f2c6b6a
...
...
@@ -708,7 +708,31 @@ char *strEncoding(int encoding) {
}
}
/* =========================== Memory introspection ========================== */
/* =========================== Memory introspection ========================= */
/* This is an helper function with the goal of estimating the memory
* size of a radix tree that is used to store Stream IDs.
*
* Note: to guess the size of the radix tree is not trivial, so we
* approximate it considering 128 bytes of data overhead for each
* key (the ID), and then adding the number of bare nodes, plus some
* overhead due by the data and child pointers. This secret recipe
* was obtained by checking the average radix tree created by real
* workloads, and then adjusting the constants to get numbers that
* more or less match the real memory usage.
*
* Actually the number of nodes and keys may be different depending
* on the insertion speed and thus the ability of the radix tree
* to compress prefixes. */
size_t
streamRadixTreeMemoryUsage
(
rax
*
rax
)
{
size_t
size
;
size
=
rax
->
numele
*
sizeof
(
streamID
);
size
+=
rax
->
numnodes
*
sizeof
(
raxNode
);
/* Add a fixed overhead due to the aux data pointer, children, ... */
size
+=
rax
->
numnodes
*
sizeof
(
long
)
*
30
;
return
size
;
}
/* Returns the size in bytes consumed by the key's value in RAM.
* Note that the returned value is just an approximation, especially in the
...
...
@@ -804,21 +828,8 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
}
}
else
if
(
o
->
type
==
OBJ_STREAM
)
{
stream
*
s
=
o
->
ptr
;
/* Note: to guess the size of the radix tree is not trivial, so we
* approximate it considering 64 bytes of data overhead for each
* key (the ID), and then adding the number of bare nodes, plus some
* overhead due by the data and child pointers. This secret recipe
* was obtained by checking the average radix tree created by real
* workloads, and then adjusting the constants to get numbers that
* more or less match the real memory usage.
*
* Actually the number of nodes and keys may be different depending
* on the insertion speed and thus the ability of the radix tree
* to compress prefixes. */
asize
=
sizeof
(
*
o
);
asize
+=
s
->
rax
->
numele
*
64
;
asize
+=
s
->
rax
->
numnodes
*
sizeof
(
raxNode
);
asize
+=
s
->
rax
->
numnodes
*
32
*
7
;
/* Add a few child pointers... */
asize
+=
streamRadixTreeMemoryUsage
(
s
->
rax
);
/* Now we have to add the listpacks. The last listpack is often non
* complete, so we estimate the size of the first N listpacks, and
...
...
@@ -845,6 +856,36 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
asize
+=
lpBytes
(
ri
.
data
);
}
raxStop
(
&
ri
);
/* Consumer groups also have a non trivial memory overhead if there
* are many consumers and many groups, let's count at least the
* overhead of the pending entries in the groups and consumers
* PELs. */
if
(
s
->
cgroups
)
{
raxStart
(
&
ri
,
s
->
cgroups
);
raxSeek
(
&
ri
,
"^"
,
NULL
,
0
);
while
(
raxNext
(
&
ri
))
{
streamCG
*
cg
=
ri
.
data
;
asize
+=
sizeof
(
*
cg
);
asize
+=
streamRadixTreeMemoryUsage
(
cg
->
pel
);
asize
+=
sizeof
(
streamNACK
)
*
raxSize
(
cg
->
pel
);
/* For each consumer we also need to add the basic data
* structures and the PEL memory usage. */
raxIterator
cri
;
raxStart
(
&
cri
,
cg
->
consumers
);
while
(
raxNext
(
&
cri
))
{
streamConsumer
*
consumer
=
cri
.
data
;
asize
+=
sizeof
(
*
consumer
);
asize
+=
sdslen
(
consumer
->
name
);
asize
+=
streamRadixTreeMemoryUsage
(
consumer
->
pel
);
/* Don't count NACKs again, they are shared with the
* consumer group PEL. */
}
raxStop
(
&
cri
);
}
raxStop
(
&
ri
);
}
}
else
if
(
o
->
type
==
OBJ_MODULE
)
{
moduleValue
*
mv
=
o
->
ptr
;
moduleType
*
mt
=
mv
->
type
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录