• TcMalloc,A Big Surprise!


    Tcmalloc早有耳闻,没有进行过细节的了解,直到最近有同事在几个模块中使用,才领略到它的强大!

    场景:
    模块多线程并发处理输入数据,大量使用各种STL容器,运行内存30G。
    程序重启,导入历史后,处理速度变慢,数个小时候后才能回到正常处理速度,处理速度慢期间,cpu idle高

    分析:
    重启后,缓存的内存被收回,大量内存需要重新分配,cpu频繁锁在malloc上

    解决:
    1. 使用STL内存分配器:__mt_alloc
    参考:http://blog.csdn.net/yfkiss/article/details/6633337
    2. 使用tcmalloc

    使用Tcmalloc:
    下载编译google-perftool(performance tool,includes TCMalloc, heap-checker, heap-profiler and cpu-profiler.)
    将tcmalloc通过“-ltcmalloc”链接器标志接入模块

    Tcmalloc概述
    tcmalloc将内存请求分为两类,大对象请求和小对象请求,大对象为>=32K的对象。|
    tcmalloc会为每个线程分配线程局部缓冲
    对于小对象请求,可以直接从线程局部缓冲区获取,如果线程局部缓冲区没有空闲内存,则从central heap中一次性获取一连串小对象。
    tcmalloc对于小内存,按8的整数次倍分配,对于大内存,按4K的整数次倍分配。
    这样做有两个好处,一是分配的时候比较快。二是短期的收益比较大,分配的小内存至多浪费7个字节,大内存则4K
    当某个线程缓存当缓存中所有对象的总共大小超过2MB的时候,会对他进行垃圾收集。垃圾收集阈值会自动根据线程数量的增加而减少,这样就不会因为程序有大量线程而过度浪费内存。

    内存泄露检测
    使用Tcmalloc的程序,用valgrind无法检测内存泄露,可以使用google-perftools提供的heap checker
    使用方法:
    export  HEAPCHECK=TYPE
    TYPE可以为:minimal、normal、strict、draconian

    更细节可以参考:http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html

    Tcmalloc在不需要增加任何开发代价的情况下,就可以使得程序有可能在性能上有一个飞跃,so, try it~

  • 相关阅读:
    使用jenkins发布docker容器
    使用jenkins构建和部署前端(jenkins是k8s集群中搭建)
    kubernetes的ingress-nginx使用案例
    使用jenkins的SSH Publishers远程执行
    kubernetes集群:向pod里的/etc/hosts添加解析
    kubernetes集群:nacos搭建
    JavaBean的概念
    Statement与PreparedStatement的区别
    JDBC的概念&使用步骤
    session的用法
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318235.html
Copyright © 2020-2023  润新知