jemalloc

jvm内存诊断全集

大憨熊 提交于 2020-08-08 08:33:40
jvm内存诊断一直是一个强需求,大家能马上想到mat等工具,在诊断heap,metaspace,直接内存上是有奇效。但是介绍能解决jvm的一部分问题。 下面就来一套,全面诊断的方式。 利用nmt找出泄漏区域 java有NativeMemoryTracking帮助我们查看jvm带来的内存分配问题,这个只能看jvm带来的,如果是jni的调用申请的内存,那这个工具是没有用的。那大家可能疑惑了,那这个工具也没想象的那么有用,java各种分区,堆的,非堆的,还有直接内存的值jmx都有,想排查是否是jvm带来的似乎也可以做到。那NativeMemoryTracking的作用是什么呢? 对比现有的工具 查看内存数据的工具其实很多,我们通过NativeMemoryTracking和他们进行一下比较。 ||jstat|NativeMemoryTracking|jmx| |-|-|-|-| |是否支持命令行观察|支持|支持|不支持| |是否支持直接内存|不支持|支持|支持| |是否支持unsafe的分配|不支持|支持|不支持| 对比的最后一项,很多人可能就要提出疑问,直接内存不就是利用unsafe分配的吗,那这里怎么还写了jmx不支持呢。 直接内存的使用其实是DirectByteBuffer自己维护的内存计数。也就是这个直接内存的数据其实是java code自己维护出来的,只要跳过这些

Redis内存

半腔热情 提交于 2020-08-07 14:56:13
Redis内存消耗:自身内存 + 对象内存 + 缓冲内存 + 内存碎片 自身内存:Redis进程自身内存占用量很小,大约在3.8M左右。 对象内存:sizeof(keys) + sizeof(values),键和值的内存都需要关注 缓冲内存:主要包括客户端缓冲、复制积压缓冲区、AOF缓冲区 客户端缓冲:指所有接入到Redis服务器TCP连接的输入输出缓冲,超过1G会自动断开 复制积压缓冲区:用于实现部分复制功能补救措施的缓冲区 AOF缓冲区:Redis重写期间保存最近的写入命令,消耗内存取决于AOF重写时间及写入命令量 内存碎片:Redis默认使用jemalloc分配器、可选glibc、tcmalloc,为了更好的管理和复用内存,一般采用内存块进行分配,通常采用数据对齐或安全重启处理内存碎片超标情况 子进程内存消耗:子进程fork后与父进程享有同一物理内存,AOF/RDB期间父进程处理写请求时会复制出请求的页副本进行写操作,子进程依然读取父进程快照 Redis fork期间产生的子进程需要消耗的内存由持久化期间写入命令量决定 设置sysctl vm.overcommit_memory = 1允许内存分配所有的物理内存 排查当前系统是否支持THP,防止copy-on-write期间内存过度消耗 来源: oschina 链接: https://my.oschina.net/u

关于redis,你需要了解的几点!

﹥>﹥吖頭↗ 提交于 2020-08-06 08:04:33
一、关于 redis key: 1、是二进制安全的,也就是说,你可以使用任何形式的二进制序列来作为key,比如一个string,或者一个jpg图片的数据,需要说明的是,空字符串也是一个有效的key。 2、不建议使用过长的key,影响内存占用及数据查性能,对于过长的key,可以通过hash(例如SHA1)处理转换。 3、建议使用有意义及统一格式的key。 4、最大允许key大小为512M。 二、String 类型应用: 1、作为原子计数器:incr、decr、incrby 2、结合append命令,作为基于时间的增量序列。 3、随机访问及获取值区域,getrange、setrange。 附:需要注意的是append及range操作容易引起内存浪费和碎片化问题。 三、hash 类型:ziplist or hashtable 1、单个hash最多支持2 32 - 1个键值对。 2、关于hash类型的内部编码: ziplist(压缩列表) & hashtable(哈希表) 配置:hash-max-ziplist-entries(hash类型最大kv数据,默认512)、hash-max-ziplist-value(单个v值最大值, 默认64) redis 采用何种结构取决于hash中元素数及元素值得大小,当同时满足小于配置时,redis使用ziplist编码存储

深入学习Redis(1):Redis内存模型

血红的双手。 提交于 2020-08-05 05:27:02
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有很大帮助,例如: 1、估算Redis内存使用量。目前为止,内存的使用成本仍然相对较高,使用内存不能无所顾忌;根据需求合理的评估Redis的内存使用量,选择合适的机器配置,可以在满足需求的情况下节约成本。 2、优化内存占用。了解Redis内存模型可以选择更合适的数据类型和编码,更好的利用Redis内存。 3、分析解决问题。当Redis出现阻塞、内存占用等问题时,尽快发现导致问题的原因,便于分析解决问题。 这篇文章主要介绍Redis的内存模型(以3.0为例),包括Redis占用内存的情况及如何查询、不同的对象类型在内存中的编码方式、内存分配器(jemalloc)、简单动态字符串(SDS)、RedisObject等;然后在此基础上介绍几个Redis内存模型的应用。 在后面的文章中,会陆续介绍关于Redis高可用的内容,包括主从复制、哨兵、集群等等,欢迎关注。 系列文章 深入学习Redis(1)

Redis开发与运维:SDS与44字节深入理解

女生的网名这么多〃 提交于 2020-08-04 23:39:46
对于上一篇文章,我又自己总结归纳并补充了一下,有了第二篇。 概览 <<左移 开始之前,我们先准备点东西:位运算 i<<n 总结为 i*2^n 所以 1<<5 = 2^5 1<<8 = 2^8 1<<16 = 2^16 1<<32 = 2^32 1<<64 = 2^64 SDS 5种数据类型 Redis 3.2 以后SDS数据类型有5个 #define SDS_TYPE_5 0 #define SDS_TYPE_8 1 #define SDS_TYPE_16 2 #define SDS_TYPE_32 3 #define SDS_TYPE_64 4 结合上面的位运算,我们也能理解这5个数据类型的命名规则。 外部类型String 找 SDS结构 我们现在有定义了5种SDS数据类型,那么如何根据字符串长度找这些类型呢? 或者说输入的字符串长度和类型有什么关系?下面我们来看一看他们之间的关系。 再来看看源码: static inline char sdsReqType(size_t string_size) { if (string_size < 1<<5) return SDS_TYPE_5; if (string_size < 1<<8) return SDS_TYPE_8; if (string_size < 1<<16) return SDS_TYPE_16; #if (LONG

Linux(服务器编程):36---C/C++内存池设计(仿Nginx内存池设计)

二次信任 提交于 2020-08-04 11:15:20
一、内存池概述 服务器会频繁地对内存进行申请和释放,频繁地操作将带来如下的缺点: 服务器性能降低,因为需要频繁地申请和释放内存 内存碎片化多 等等...... 市场上开源的比较好用的内存池有: tcmalloc:MySQL使用的 jemalloc:Tomcat使用的 Nginx也有一套自己的内存池(本文就是仿照Nginx的内存池设计的) 二、内存池设计 因为内存页的大小为4K,因此在设计内存池的时候,我们将认为: <4k的内存:称为小内存块 >4K的内存:称为大内存快 struct mp_large_s(大内存块结构) 当我们申请的内存大于4K时,就会申请一个大的内存块,这个结构体就是大内存结构 该结构不是真正存储内存的,真正的内存是由其alloc成员所指向的 如上结构图所示(蓝色部分): alloc:指向真正的大内存块地址 next:指向下一个struct mp_large_s结构的指针 //大内存块节点 struct mp_large_s { void *alloc; //指向该大内存快的实际存储区域 struct mp_large_s *next; //指向下一块大内存快 }; struct mp_node_s(大内存块结构) 当我们申请的内存小于4K时,就会申请一个小的内存块,这个结构体就是小内存结构 与struct mp_large_s结构一样,该结构不是真正存储内存的

CentOS7离线安装devtoolset-9并编译redis6.0.5

旧时模样 提交于 2020-07-29 03:54:22
首先参照https://www.cnblogs.com/wdw984/p/13330074.html,来进行如何安装Centos和离线下载rpm包。 离线下载jemalloc,上传到CentOS的/data/rpm/jemalloc目录 因为redis6.0.5推荐使用jemalloc管理内存,所以我们先安装jemalloc,按照以下顺序安装rpm包 rpm -ivh audit-libs-python- 2.8 . 5 - 4 .el7.x86_64.rpm rpm -ivh scl-utils- 20130529 - 19 .el7.x86_64.rpm rpm -ivh checkpolicy- 2.5 - 8 .el7.x86_64.rpm rpm -ivh libsemanage-python- 2.5 - 14 .el7.x86_64.rpm rpm -ivh libcgroup- 0.41 - 21 .el7.x86_64.rpm rpm -ivh python-IPy- 0.75 - 6 .el7.noarch.rpm rpm -ivh setools-libs- 3.3 . 8 - 4 .el7.x86_64.rpm rpm -ivh policycoreutils-python- 2.5 - 34 .el7.x86_64.rpm rpm -ivh rh

Redis的内存和实现机制

断了今生、忘了曾经 提交于 2020-07-24 04:31:32
1. Reids内存的划分 数据 内存统计在used_memory中 进程本身运行需要内存 Redis主进程本身运行需要的内存占用,代码、常量池等 缓冲内存,客户端缓冲区、复制积压缓冲区、AOF缓冲区。有jemalloc分配内存,会统计在used_memory中 内存碎片 Redis在分配、回收物理内存过程中产生的。内存碎片不会统计在used_memory中。如果Redis服务器中的内存碎片已经很大,可以通过安全重启的方式减小内存碎片:因为重启之后,Redis重新从备份文件中读取数据,在内存中进行重排,为每个数据重新选择合适的内存单元,减小内存碎片。 2. Redis的数据存储的细节 涉及到内存分配器jemalloc, 简单动态字符串(SDS),5种值类型对象的内部编码,redisObject, DictEntry: Redis 是key-value数据库,因此对每个键值对都会有一个dictEntry,里面存储了指向Key和Value的指针;next指向下一个dictEntry,与本Key-Value无关 Key: 并不是以字符串存储,而是存储在SDS结构中 RedisObject: 5种值对象不是直接以对应的类型存储的,而是被封装为redisObject来存储 jemalloc: 无论是DictEntry对象,还是redisObject, SDS对象,都需要内存分配器 2.1

redis-6.0.1 docker下安装

眉间皱痕 提交于 2020-05-06 23:22:33
1. 下载最新 redis image ( 此处为Redis server v=6.0.1 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=0 ) docker pull redis:latest 2.运行 redis 服务 docker run -itd -v /usr/local/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/redis/data:/data --name mh-redis redis:latest redis-server /usr/local/etc/redis/redis.conf 3.添加 redis 配置文件 #bind 127.0.0.1 //允许远程连接 #daemonize yes #redis3.2版本后新增protected-mode配置,默认是yes #关闭protected-mode模式,此时外部网络可以直接访问 #开启protected-mode保护模式,需配置bind ip或者设置访问密码 protected-mode yes #持久化 appendonly yes #密码 requirepass 123456 #日志 #logfile "/data/redis6/logs/redis.log

CentOS7下安装Redis5.0.2

限于喜欢 提交于 2020-04-30 15:11:42
1、下载redis 地址 http://download.redis.io/releases/redis-5.0.2.tar.gz 2、解压tar -zxf redis-5.0.2.tar.gz 3、缺少gcc环境需要yum install gcc -y 3.1 make编译 3.2 报错: [root@lang redis-5.0.2]# make cd src && make all make[1]: Entering directory `/usr/local/redis-4.0.10/src' CC adlist.o In file included from adlist.c:34: zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory zmalloc.h:55:2: error: #error "Newer version of jemalloc required" make[1]: *** [adlist.o] Error 1 make[1]: Leaving directory `/usr/local/redis-4.0.10/src' make: *** [all] Error 2 redis解压目录下有个README.md文件中有如下一段话: Selecting a non