zoukankan      html  css  js  c++  java
  • linux进程VIRT虚拟内存数值高

    VIRT高是因为分配了太多地址空间导致。

    一般来说不用太在意VIRT太高,因为你有16EB的空间可以使用。

    如果你实在需要控制VIRT的使用,设置环境变量MALLOC_ARENA_MAX,例如:
    hadoop推荐值为4,因为YARN使用VIRT值监控资源使用。

    解决办法就是:
    export MALLOC_ARENA_MAX=1

    原因:
    如果应用程序每次分配内存的时候都通过系统调用 mmap,sbrk等来分配,效率会很低,所以glibc 中实现了一个内存池,应用程序使用内存的时候通过glibc的内存池来提供,早期的 glibc 版本中,只有一个内存池,称为 main arena,在多线程场景中,每次分配和释放需要进行加锁。后来为了降低锁的粒度,从glibc 2.10版本开始引入了 thread arena,线程在申请内存的时候,glibc 为他创建一个 thread arena,这个内存池的大小一般是64M,thread arena被不被某个线程独占,全部的 thread arena被加入到环形链表,被所有线程共享使用。
    环境变量 MALLOC_ARENA_MAX 用来控制进程可以创建的 thread arena 数量上限(默认为 cpu core*8),在 Hadoop 中这个值设置为 4,有人发现要设置为1,否则控制不住。其实这个值大于1时只是推荐值,1是强制值。
    当设置为1,相当于禁用了 thread arena,arena_lookup每次都会返回 main arena, 不会创建任何 thread arena。

  • 相关阅读:
    sgg_3_hibernate详解
    sgg_2_hibernate开发步骤
    sgg_1_hibernate概述
    cookie
    exchange 普通用户可以创建通讯组
    DC 维护常用工具命令DCdiag
    cp 复制不覆盖
    powershell 结果输出显示为……
    获得用户完整的autodiscover配置文件
    【转】outlook 2016 配置自动发现
  • 原文地址:https://www.cnblogs.com/bjguanmu/p/15606378.html
Copyright © 2011-2022 走看看