tcmalloc

Install tcmalloc on CentOS

∥☆過路亽.° 提交于 2021-02-08 06:14:37
问题 I installed tcmalloc on CentOS using the command: sudo yum install google-perftools And it proceeds correctly. But I cannot find any installed perftools libraries in /usr/lib/ , so I cannot set LD_PRELOAD variable. Then, when I tried to compile with flag -ltcmalloc , the compiler did not recognize it, which quite made sense. What else should I specify to use tcmalloc on CentOS? Thanks. 回答1: You can always build from source. I have done that with my centos 8. Source code can be found here:

Install tcmalloc on CentOS

徘徊边缘 提交于 2021-02-08 06:08:39
问题 I installed tcmalloc on CentOS using the command: sudo yum install google-perftools And it proceeds correctly. But I cannot find any installed perftools libraries in /usr/lib/ , so I cannot set LD_PRELOAD variable. Then, when I tried to compile with flag -ltcmalloc , the compiler did not recognize it, which quite made sense. What else should I specify to use tcmalloc on CentOS? Thanks. 回答1: You can always build from source. I have done that with my centos 8. Source code can be found here:

详解Go中内存分配源码实现

匆匆过客 提交于 2021-02-07 02:44:30
转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com 本文使用的go的源码15.7 介绍 Go 语言的内存分配器就借鉴了 TCMalloc 的设计实现高速的内存分配,它的核心理念是使用多级缓存将对象根据大小分类,并按照类别实施不同的分配策略。TCMalloc 相关的信息可以看这里: http://goog-perftools.sourceforge.net/doc/tcmalloc.html。 即如果要分配的对象是个小对象(<= 32k),在每个线程中都会有一个无锁的小对象缓存,可以直接高效的无锁的方式进行分配; 如下:对象被分到不同的内存大小组中的链表中。 如果是个大对象(>32k),那么页堆进行分配。如下: 虽然go内存分配器最初是基于tcmalloc的,但是现在已经有了很大的不同。所以上面的一些结构会有些许变化,下面再慢慢絮叨。 因为内存分配的源码比较复杂,为了方便大家调试,所以在进行源码分析之前,先看看是如何断点汇编来进行调试的。 断点调试汇编 目前Go语言支持GDB、LLDB和Delve几种调试器。只有Delve是专门为Go语言设计开发的调试工具。而且Delve本身也是采用Go语言开发,对Windows平台也提供了一样的支持。本节我们基于Delve简单解释如何调试Go汇编程序。项目地址: https:/

用最少人力玩转万亿级数据,我用的就是MongoDB!

。_饼干妹妹 提交于 2021-01-28 12:40:07
本文根据杨亚洲老师在〖deeplus直播第258期〗线上分享演讲内容整理而成。 (文末有获取本期PPT&回放的方式,不要错过) 杨亚洲 OPPO MongoDB负责人 负责OPPO数万亿级数据量文档数据库MongoDB内核研发、性能优化及运维工作,一直专注于分布式缓存、高性能服务端、数据库、中间件等相关研发。 本文主要 分享内容如下: MongoDB在OPPO互联网推广经验分享-如何把一个淘汰边缘的数据库逐步变为公司主流数据库; 谈谈当前国内对MongoDB误解(丢数据、不安全、难维护)? MongoDB跨机房多活方案-实现成本、性能、一致性"三丰收"; MongoDB线程模型瓶颈及其优化方法; 并行迁移:MongoDB内核扩容迁移速率数倍/数十倍提升优化实践; 百万级高并发读写/千亿级数据量MongoDB集群性能数倍提升优化实践; 万亿级数据量MongoDB集群性能数十倍提升优化实践; 磁盘800%节省-记某服务接口千亿级数据迁移MongoDB,近百台SSD服务器节省原理; 展望:借助MongoDB完善的分布式、高可用、机房多活等功能,如何实现NoSQL、NewSQL融合; 其他-那些年我们踩过的坑。 一、如何把MongoDB从淘汰边缘变为公司主流数据库? 背景 入职前多个大数据量业务使用MongoDB,使用中经常超时抖动; 多个核心业务忍受不了抖动的痛苦,准备迁移回MySQL;

C++应用程序性能优化(七)——内存池技术

冷暖自知 提交于 2020-12-12 13:45:31
C++应用程序性能优化(七)——内存池技术 一、内存池简介 1、C++内存池简介 内存池(Memory Pool)是一种内存分配方式,是在真正使用内存前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。 通用内存分配和释放的缺点如下: (1)使用malloc/new申请分配堆内存时系统需要根据最先匹配、最优匹配或其它算法在内存空闲块表中查找一块空闲内存;使用free/delete释放堆内存时,系统可能需要合并空闲内存块,因此会产生额外开销。 (2)频繁使用时会产生大量内存碎片,从而降低程序运行效率。 (3)造成内存泄漏。 内存池(Memory Pool)是代替直接调用malloc/free、new/delete进行内存管理的常用方法,当申请内存空间时,会从内存池中查找合适的内存块,而不是直接向操作系统申请。 内存池技术的优点如下: (1)堆内存碎片很少。 (2)内存申请/释放比malloc/new方式快。 (3)检查任何一个指针是否在内存池中。 (4)写一个堆转储(Heap-Dump)到硬盘。 (5)内存泄漏检测(memory-leak detection),当没有释放分配的内存时,内存池(Memory Pool)会抛出一个断言(assertion)。

tcmalloc编译使用

喜你入骨 提交于 2020-08-17 11:06:23
一、编译 https://github.com/gperftools/gperftools/releases 如上链接页面下载需要版本的代码; cd /home/code/; tar -zxvf gperftools-2.7.90.tar.gz; cd gperftools-2.7.90; ../configure --prefix=/usr/local/lib --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal make && make install 可根据需求打开关闭指定的模块。 google-perftools的组件,包括TCMalloc、heap-checker、heap-profiler和cpu-profiler共4个组件。 编译完成生成lib库在–prefix指定的路径,文件名:libtcmalloc_minimall.so 二、使用 1)静态链接 在编译选项的最后加入 /usr/local/lib/libtcmalloc_minimal.a 即可链接静态库 2)动态链接 在编译选项这里插入 -L/usr/local/lib -ltcmalloc_minimal 即可; 3)、重启进程即可使用

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

TCMalloc:线程缓存的Malloc

为君一笑 提交于 2020-08-06 09:59:59
动机 TCMalloc要比glibc 2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试过的malloc都快。ptmalloc在一台2.8GHz的P4机器上(对于小对象)执行一次malloc及free大约需要300纳秒。而TCMalloc的版本同样的操作大约只需要50纳秒。malloc版本的速度是至关重要的,因为如果malloc不够快,应用程序的作者就很有可能在malloc之上写一个自己的自由列表。这就可能导致额外的代码复杂度,以及更多的内存占用――除非作者本身非常仔细地划分自由列表的大小并经常从自由列表中清除空闲的对象。 TCMalloc也减少了多线程程序中的锁争用情况。对于小对象,几乎已经达到了零争用。对于大对象,TCMalloc尝试使用粒度较好和有效的自旋锁。ptmalloc同样是通过使用每线程各自的场地来减少锁争用,但是ptmalloc2使用每线程场地有一个很大的问题。在ptmalloc2中,内存可能会从一个场地移动到另一个。这有可能导致大量空间被浪费。例如,在一个Google的应用中,第一阶段可能会为其URL标准化的数据结构分配大约300MB内存。当第一阶段结束后,第二阶段将从同样的地址空间开始。如果第二个阶段被安排到了一个与第一阶段什?用的场地不同的场地,这个阶段不会复用任何第一阶段留下的的内存,并会给地址空间添加另外一个300MB

关于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开发与运维: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