内存管理函数
内存管理函数仅25.5.0及以上集群版本支持。
fabricsql_total_memory_detail()
描述:用于查看所有后端actor节点的内存使用情况。
返回值类型:record
函数返回信息如下:
名称 |
类型 |
描述 |
---|---|---|
nodename |
text |
节点名称。 |
memorytype |
text |
内存的名称,包括以下几种:
|
memorymbytes |
integer |
内存使用的大小,单位MB。 |
shared_memory_context(actor_name cstring)
描述:查询指定actor进程中共享内存上下文的统计信息。
参数:actor_name,表示actor名称。
返回值类型:record
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
select * from shared_memory_context('coordinator1') order by totalsize desc limit 10; contextname | level | parent | totalsize | freesize | usedsize -------------------------------------+-------+---------------------------------+-----------+----------+---------- Query resource track memory context | 2 | Workload manager memory context | 67174520 | 64320 | 67110200 RawMemory | 1 | ProcessMemory | 23525840 | 0 | 23525840 builtin proc name Lookup Table | 2 | builtin_procGlobalMemoryContext | 425984 | 261152 | 164832 ProcessMemory | 0 | | 196608 | 76992 | 119616 builtin pro Oid Lookup Table | 2 | builtin_procGlobalMemoryContext | 196608 | 41664 | 154944 PoolerMemoryContext | 1 | ProcessMemory | 73728 | 56832 | 16896 Node Pool | 3 | PoolerCoreContext | 73640 | 25888 | 47752 ThreadGroup Hash Table | 1 | ProcessMemory | 65536 | 39936 | 25600 Aio Sub Memory Context 6 | 2 | Aio Memory Context | 65536 | 63872 | 1664 Aio Sub Memory Context 5 | 2 | Aio Memory Context | 65536 | 63872 | 1664 (10 rows) |
shared_memory_context_chunk(actor_name cstring, contextname char(64))
描述:查询指定actor、名字为contextname的共享内存上下文申请的所有chunk信息。
参数:
- actor_name, 指定actor的名字
- contextname,表示内存上下文名称。
返回值类型:record
示例:
1 2 3 4 5 6 |
select * from shared_memory_context_chunk('executor0_es_group', 'StreamInfoContext') ; parent | level | file_name | line_number | chunk_size | request_count | total_size ---------------+-------+----------------------+-------------+------------+---------------+------------ ProcessMemory | 1 | mcxt.cpp | 1010 | 8192 | 1 | 8192 ProcessMemory | 1 | streamThreadPool.cpp | 35 | 1024 | 1 | 1024 (2 rows) |
fabricsql_session_memory_detail()
描述:用于查看对应actor或者所有后端actor节点的线程内存使用情况,以MemoryContext维度来统计。
其中内存上下文“TempSmallContextGroup”,记录当前线程中所有内存上下文字段“totalsize”小于8192字节的信息汇总,并且内存上下文统计计数记录到“usedsize”字段中。所以在结果中,“TempSmallContextGroup”内存上下文中的“totalsize”和“freesize”是该线程中所有内存上下文“totalsize”小于8192字节的汇总总和,usedsize字段表示统计的内存上下文个数。
参数说明:
- fabricsql_session_memory_detail(),无参数,查询CN和所有DN进程中所有线程的内存上下文的统计信息。
- fabricsql_session_memory_detail(actor_name),入参为actor_name,输出指定CN或DN进程中所有线程的内存上下文的统计信息。
返回值类型:record
函数返回信息如下:
名称 |
类型 |
描述 |
---|---|---|
sessid |
text |
线程启动时间+线程标识(字符串信息为timestamp.threadid)。 |
sesstype |
text |
线程名称。 |
contextname |
text |
内存上下文名称。 |
level |
smallint |
当前上下文在整体内存上下文中的层级。 |
parent |
text |
父内存上下文名称。 |
totalsize |
bigint |
当前内存上下文的内存总数,单位Byte。 |
freesize |
bigint |
当前内存上下文中已释放的内存总数,单位Byte。 |
usedsize |
bigint |
当前内存上下文中已使用的内存总数,单位Byte;“TempSmallContextGroup”内存上下文中该字段含义为统计计数。 |
session_memory_context_chunk(actor_name cstring, tid int64, contextname char(64))
描述:查询指定actor上某个线程创建的某个内存上下文申请的所有chunk信息。
参数说明:
- actor_name, 表示actor名字。
- tid,表示线程ID。
- contextname,表示内存上下文名称。
返回值类型:record
示例:
1 2 3 4 5 6 7 8 |
select * from session_memory_context_chunk('executor0_es_group', 139736895414560, 'Node Pool') order by total_size desc ; parent | level | file_name | line_number | chunk_size | request_count | total_size -------------------+-------+--------------+-------------+------------+---------------+------------ PoolerCoreContext | 3 | dynahash.cpp | 147 | 2048 | 1 | 2048 PoolerCoreContext | 3 | dynahash.cpp | 147 | 256 | 1 | 256 PoolerCoreContext | 3 | dynahash.cpp | 147 | 32584 | 1 | 32584 PoolerCoreContext | 3 | dynahash.cpp | 147 | 4096 | 3 | 12288 (4 rows) |
jemalloc_heap_stats(actor_name cstring)
描述:查询jemalloc提供的内存统计信息。
参数:actor_name, 表示actor名字。
返回值类型:record
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
select * from jemalloc_heap_stats( 'coordinator1' ); actor_name | stats --------------+------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------- coordinator1 | ___ Begin jemalloc statistics ___ | Version: "5.2.1-6-gd04ec97dec5e84ac24f32c29053aa94479402b6d" | Build-time option settings | config.cache_oblivious: true | config.debug: false | config.fill: true | config.lazy_lock: false | config.malloc_conf: "tcache:true,background_thread:true,percpu_arena:phycpu,dirty_decay_ms:1000,muzzy_decay_ms:1000" | config.opt_safety_checks: false | config.prof: false | config.prof_libgcc: false | config.prof_libunwind: false | config.stats: true | config.utrace: false |
jemalloc_heap_profiling(actor_name cstring, type int)
功能说明:对DataArtsFabric SQL actor进程中malloc等内存分配进行采样,并输出采样结果。
参数 |
类型 |
含义 |
---|---|---|
actor_name |
字符串 |
actor名字。 |
type |
整数 |
1:开启内存trace,记录malloc等调用栈信息。 0:关闭内存trace,返回本次所记录的malloc等调用栈的采样信息。 |
返回值类型:
- actor_name:actor名字。
- profiling:内存分配采样信息。
备注:
- 如果失败提示信息为“Memory profiling failed, check if $MALLOC_CONF contain 'prof:true'.”,说明未设置环境变量MALLOC_CONF=prof:true,原因是未使用带内存采样功能的jemalloc库。请在使用gov_client启动CN的参数中添加-j选项。
- 如果失败提示信息为“Type %d is not supported. The valid range is 0-1.”,说明用户输入参数错误,正确数值为0或1。
输出内存调用栈信息
操作步骤:
- 输出内存调用栈信息,在DataArtsFabric SQL进程所在目录输出trace文件。
1
SELECT profiling FROM jemalloc_heap_profiling('coordinator1', 0);
- 将查询结果另存为trace文件。
- 使用jemalloc中提供的jeprof工具,解析日志信息。
方式1:以TEXT格式输出。
jeprof --text --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 >prof.txt
方式2:以PDF格式输出。
jeprof --pdf --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 > prof.pdf
- 解析内存调用栈信息,需要依靠DataArtsFabric SQL源码进行分析,需要将trace文件返回给研发工程师进行分析。
- 分析trace文件,需要使用jeprof工具,该工具由Jemalloc生成。在常规使用中,需要依赖perl环境,如果需要生成pdf调用图,需要安装与操作系统匹配的GraphViz工具。
示例
使用gov_client -j重新启动数据库。
在数据库运行期间,打开内存trace记录功能:
1
|
SELECT profiling fromjemalloc_heap_profiling('coordinator1', 1); |
在数据库运行期间,关闭内存trace记录功能:
1
|
SELECT profiling fromjemalloc_heap_profiling('coordinator1', 0); |
将查询结果复制到trace文件中,以text格式或PDF格式输出:
1 2 |
jeprof --text --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 >prof.txt jeprof --pdf --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 > prof.pdf |