YASDB内存占用简介

参数配置:

默认参数配置:DBMS_PARAM高级包生成配置参数

数据库内存配置,使用默认参数步骤:

1、DBMS_PARAM.OPTIMIZE(); //生成默认参数,使用总内存的80%

2、SELECT DBMS_PARAM.SHOW_RECOMMEND() FROM dual; //查看生成的参数

3、EXEC DBMS_PARAM.APPLY_RECOMMEND(); //应用参数,需要重启yasdb

文档路径:YashanDB Doc (yasdb.com)

内存占用计算参数:

DATA_BUFFER_SIZE VM_BUFFER_SIZE SHARE_POOL_SIZE LARGE_POOL_SIZE SCOL_DATA_BUFFER_SIZE COLUMNAR_VM_BUFFER_SIZE 主要是上面这些参数配置内存的总和 + 256M(其他小块内存)

问题:VIRT超过RES十几个G

如下图所示,yasdb满负荷运行后,0任务跑的情况下,virt内存:31.2g,实际内存:21.7g,虚拟内存比实际内存大了10g左右,虚拟内存远大于实际使用内存。

YASDB内存使用情况

yasdb参数配置,如下图:

按照yasdb主要内存占用计算:

DATA_BUFFER_SIZE(18306M) + VM_BUFFER_SIZE(2382M) + SHARE_POOL_SIZE(512M) + LARGE_POOL_SIZE(1G) + SCOL_DATA_BUFFER_SIZE(128M) + COLUMNAR_VM_BUFFER_SIZE (128M) = 22480M(21.95g)

RES 21.7g的内存使用和yasdb内存总占用数相符合。

VIRT内存为什么远远大于RES

VIRT:SWAP+RES(虚拟内存大小,包括进程使用的库、代码、数据等,如果申请100M,则增加100M大小)

RES:进程使用的,未被换出的物理内存(包括共享内存大小,如果申请100M,使用10M,则实际为10M)

mmap查看yasdb使用情况

如下图:

strace -f -e "brk,mmap,munmap" -p 2051595

yasdb没有使用mmap等映射接口。

pmap工具,查看进程内存映射信息

pmap命令用于报告进程的内存映射关系(查看进程的内存映像信息)

选项:

  • -x, --extended:显示扩展格式

  • -d, --device:显示设备格式

  • -X:显示比 -x 选项更多的详细信息。注意:格式根据 /proc/PID/smaps 更改

  • -p, --show-path:在映射列中显示文件的完整路径

  • -h, --help:显示帮助信息并退出

  • -V, --version:显示版本信息并退出

扩展格式和设备格式域:

  • Address: start address of map 映像起始地址

  • Kbytes: size of map in kilobytes 映像大小

  • RSS: resident set size in kilobytes 驻留集大小

  • Dirty: dirty pages (both shared and private) in kilobytes 脏页大小

  • Mode: permissions on map 映像权限: r=read, w=write, x=execute, s=shared, p=private (copy on write)

  • Mapping: file backing the map , or ‘[ anon ]’ for allocated memory, or ‘[ stack ]’ for the program stack. 映像支持文件,[anon]为已分配内存 [stack]为程序堆栈

  • Offset: offset into the file 文件偏移

  • Device: device name (major:minor) 设备名

pmap -d ${pid}

glibc分配内存机制

  • 导致这种问题的原因是使用glibc的Arena内存池分配了大量的虚拟内存。

  • glibc大于2.1.1版本时,在glibc分配内存的时候,大内存从从中央分配区分配,小内存则在线程创建时,从缓存区分配。

  • 为了解决分配内存的性能的问题,就引入了这个叫做arena的memory pool。而恰好,在64bit系统下面,它的缺省配置为64M。

  • 一个进程可以最多有cores * 8个arena,假如服务器是4核的,那么最多有4 * 8=32个arena,也就是32 * 64 = 2048M内存

参考文档:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/6.0_release_notes/compiler

glibc版本:

内核数 cores:

MALLOC_ARENA_MAX:

环境变量,控制arena内存池个数。

查看状态:

cat /proc/pid/status

测试arena内存池代码程序:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <pthread.h> bool kill_th = false; void *th_func(void *arg){ int s = 0;
//int size = 1024*1024*139;
int size2 = 1024;
//char *pbuf;
while(!kill_th){
if(s == 0){
//pbuf = (char *)malloc(size);
// free(pbuf); char *pbuf2 = (char *)malloc(size2);
free(pbuf2);
s = 1;
} sleep(1);
}
//free(pbuf);
} void create_thread(){
pthread_t tid;
int nums = 256;
for(int i = 0; i< nums;i++){
pthread_create(&tid,NULL,th_func,NULL);
pthread_detach(tid);
} while(getchar()){
kill_th = true;
getchar();
break;
}
return ;
} int main(int argc,const char **argv) {
create_thread();
return 0;
}

超过64M大小的空间不从arena内存池申请。

编译:gcc test.c -lpthread

ulimit -a:

运行测试程序 : ./a.out:

默认MALLOC_ARENA_MAX

arena池默认个数:16 * 8 = 128

默认,cat /proc/$pid/environ,如下图:

该文件没有MALLOC_ARENA_MAX参数

● 256个线程

内存使用情况:

pmap -p pid 信息如下:pmap_malloc_arena_max_normal.txt

arena内存池:127 *(65344K + 192K)

线程栈空间:256 * 8192K

8192K * 256 + 64M*127 = 10176M,

再加上其它小空间,符合虚拟内存使用情况。

● 256个线程退出

内存使用情况:

pmap映射进程信息:pmap_maloc_arena_normal_thread_exit.txt

arena内存池:127 *(65344K + 192K)= 8128M

栈空间:仅剩主线程空间

可以看出,线程退出后,arena空间并没有释放。

export MALLOC_ARENA_MAX = 4

MALLOC_ARENA_MAX 值: cat /proc/$pid/environ:

可以看到参数MALLOC_ARENA_MAX 配置为4

● 256个线程

top信息:

pamp -p pid信息: pmap_malloc_arena_max=4.txt

线程栈空间:256*8M

arena内存池:3 * (65344K + 192k)

● 256线程退出

top信息:

pamp -p pid信息,如下图:

arena内存池:3 * (65344K + 192k)

yasdb的内存映射情况

参数

WORK_AREA_STACK_SIZE 2M

WORK_AREA_HEAP_SIZE 512K

得知栈空间大小为2M,堆空间为512K

分析pmap信息

pmap -p {pid}(yasdb),文件:pmap_yasdb.txt

arena内存池:97 * (65024K+512k) + 5 * (65216K+320k) + 1*(64576K +960K ) + 1 * (53824K + 11712K) + 23 *(64896K + 640K) = 127 * 64M = 8128 M

栈空间:390 * 1984K + 9 * 8192K = 827.625M

其它:lib库映射空间等

总共相加,大概可以得出与多出的虚拟内存相等。

配置线程参数一些接口

每个线程都会分配一个栈(默认8M,可配置)和一个堆空间。

pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setstacksize(&attr, stackSize); //配置线程属性->栈空间大小

prctl(PR_SET_NAME, name); //设置线程名

pthread_detach(tid); //线程退出后,自动释放空间。如果没有配置这个需要主动释放pthread_exit。不然会一直占用虚拟内存

ulimit -a可看堆栈默认值,也可配置堆栈默认值。

【YashanDB知识库】virt虚拟内存远大于res内存问题分析的更多相关文章

  1. 进程物理内存远大于Xmx的问题分析

    问题描述 最近经常被问到一个问题,”为什么我们系统进程占用的物理内存(Res/Rss)会远远大于设置的Xmx值”,比如Xmx设置1.7G,但是top看到的Res的值却达到了3.0G,随着进程的运行,R ...

  2. [转载]Java进程物理内存远大于Xmx的问题分析

    进程物理内存远大于Xmx的问题分析 问题描述 最近经常被问到一个问题,”为什么我们系统进程占用的物理内存(Res/Rss)会远远大于设置的Xmx值”,比如Xmx设置1.7G,但是top看到的Res的值 ...

  3. Java 进程占用 VIRT 虚拟内存超高的问题研究

    1. 现象 最近发现线上机器 java 8 进程的 VIRT 虚拟内存使用达到了 50G+,如下图所示: 2. 不管用的 -Xmx 首先第一想到的当然使用 java 的 -Xmx 去限制堆的使用.但是 ...

  4. Oracle内存全面分析

    Oracle内存全面分析 Oracle的内存配置与oracle性能息息相关.而且关于内存的错误(如4030.4031错误)都是十分令人头疼的问题.可以说,关于内存的配置,是最影响Oracle性能的配置 ...

  5. Windows内存性能分析(一)内存泄漏

    判断内存性能表现主要是为了解决如下两个问题: 1. 当前web应用是否存在内存泄漏,如果有,问题的程度有多大? 2. 如果web应用的代码无法进一步改进,当前web应用所在的服务器是否存在内存上的瓶颈 ...

  6. 性能分析 | Linux 内存占用分析

    这篇博客主要介绍 linux 环境下,查看内存占用的两种方式:使用 ps,top等命令:查看/proc/[pid]/下的文件.文章简要介绍了命令的使用方法与一些参数意义,同时对/proc/[pid]/ ...

  7. 【Android】Eclipse Memory Analyzer 进行堆内存溢出分析

    MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件.     不同厂家的 JVM 所生成的堆转储文件在数据存储格式以及数据存储内容上有很多区别,但是比较主流的厂家和格式,例如 Sun, HP, ...

  8. 《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读

    堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要清除的对象, ...

  9. Metaspace 之一:Metaspace整体介绍(永久代被替换原因、元空间特点、元空间内存查看分析方法)

    回顾 根据JVM内存区域的划分,简单的画了下方的这个示意图.区域主要分为两大块,一块是堆区(Heap),我们所New出的对象都会在堆区进行分配,在C语言中的malloc所分配的方法就是从Heap区获取 ...

  10. Linux内存技术分析(下)

    Linux内存技术分析(下) 五.内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 page 管理 slab(kmalloc.内存池) 用 ...

随机推荐

  1. Nginx性能调优5招35式不可不知的策略实战

    Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能.稳定性.丰富的功能以及低资源消耗而受到青睐.今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟 ...

  2. CM3调试系统简析

    CM3 调试系统简析 **"一直以来,单片机的调试一直不是很突出的主题,很多简单些的程序在开发中,甚至都没有调试的概念,而只是把生成的映像直接烧入片子,再根据错误症状来判断问题,然后修改程序 ...

  3. 10分钟快速掌握分布式版本控制系统GIT命令集【形成知识体系篇】

    任务要求 要求全部使用git命令实现 1.创建本地仓库,项目名称为hniu_site 2.在仓库下创建多级(目录)文件夹cn/hniu/班级名称(例如软件2108,cn/hniu/rj2108) 3. ...

  4. 诺基亚8110 4G手机强制格式化方法

    关机状态下,先按住上键,再按住开机键,出现开机动画时松开开机键,出现硬割界面下键选择第一个wipe用开机键确认yes,再次出现硬格界面,下键选择第二个wipe用开机键确认yes,再次出现硬格界面开机键 ...

  5. [oeasy]python020在游戏中体验数值自由_勇闯地下城_终端文字游戏

    继续运行 回忆上次内容 上次使用shell环境中的命令 命令 作用 cd 改变文件夹 pwd 显示当前文件夹 ls 列出当前文件夹下的内容 最终 进入 目录 找到 游戏   如果git clone 根 ...

  6. oeasy教您玩转vim - 14 - # 行头行尾

    行头行尾 回忆上节课内容 我们这次了解了 大词 和 小词 小词 就是我们常规意义的词 被 =." 等标点分开的词 大词 里面包括了 =." 等标点 只能被空格.tab.换行分割 W ...

  7. Odoo 自定义form表单按钮点击事件处理程序

    实践环境 Odoo 14.0-20221212 (Community Edition) 代码实现 方案1 通过研究发现,点击odoo form表单按钮时,会调用odoo14\odoo\addons\w ...

  8. JavaScript 监听组合按键

    JavaScript监听组合按键   by:授客 QQ:1033553122 1.   思路 如图,通过监听并打印键盘keydown事件,得到图示内容,观察发现, 当按下的组合键包含Ctrl键时,ct ...

  9. linux中grep的用法详解

    linux中grep的用法详解 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是 ...

  10. 【Mybatis】10 实现分页 & 分页插件

    回顾SQL分页查询 也就是说,在查询结果的最后控制返回的起始位置&记录数量 参数1:返回的开始位置 参数2:要返回的记录数 但是,如果说是只写了一个参数,直接表示参数2处理 LIMIT  [s ...