虚拟cpu

虚拟的cpu代码并发数,如果一个container拥有2个vcpu,那么该container就可以真正的在同一时间运行两个线程,而不是靠切时间片而达到的逻辑并发。所以一般虚拟的cpu需要和物理cpu的个数保持一致

yarn的计算单元称为YCUs,其实就是把1个cpu分为n份,通常情况控制在1:1000左右,也就是说一个一核cpu可以被yarn分为1000个左右的YCUs,并在使用yarn的时候,可以配置使用多少YCUs。例如500个YCUs,那么其实得到的大概是1/2个核的cpu。

cpu不像内存一样,内存掌控着程序的生死,而cpu只是决定程序执行的速度。

  1. 通过控制cpu的功率就可以限制线程的执行速度。比如通过CGgroups限制。
  2. 分配给一个线程超过1个cpu是没有意思的,纯粹是浪费行为。
  3. 在一些IO密集型的任务里,就不需要给每个线程分配一个完整的cpu,可以尝试着分配1/2的cpu,利用YCUs就可以做到。

虚拟内存

yarn和虚拟内存的关联

yarn的一些关于虚拟内存的配置

key

默认

解释

yarn.nodemanager.vmem-check-enabled

true

是否对app进行虚拟内存监控

yarn.nodemanager.vmem-pmem-ratio

5

虚拟内存上限系数,乘数是应用物理内存上限

yarn默认开启了对应用虚拟内存的检测,虚拟内存可以通过top来看到VIRT,当应用使用的虚拟内存超过了yarn限制的虚拟内存上限,那么yarn会把这个应用杀死。虚拟内存上限的计算公式为:yarn.nodemanager.vmem-pmem-ratio*物理内存。遇到这类虚拟内存超过yarn限制的问题,常见的策略有:

  1. 关闭yarn对应用虚拟内存的检查

也就是把`yarn.nodemanager.vmem-check-enabled`配置为false

  1. 调高yarn对应用虚拟内存限制的系数

把` yarn.nodemanager.vmem-pmem-ratio`配置更大一点

  1. 减少应用对虚拟内存的使用

这块牵扯的内容稍微多一些,先给个结论,修改linux的环境变量`export MALLOC_ARENA_MAX=4`,下面详细解释一下应用的虚拟内存使用

什么是虚拟内存

操作系统将磁盘空间当做内存空间供给程序使用

# 查看某个进程的虚拟内存使用

pmap -x pid

为什么虚拟内存分配了很多

我们知道Linux下glibc的内存管理机制用了一个很奇妙的东西,叫arena。在glibc分配内存的时候,大内存从从中央分配区分配,小内存则在线程创建时,从缓存区分配。为了解决分配内存的性能的问题,就引入了这个叫做arena的memory pool,其原理就是通过为每个线程构建一个arena,来避免多线程同时竞争一个arena。而在64bit系统下面,它的缺省配置为64M。一个进程可以最多有cores*8个arena,假如服务器是4核的,那么最多有4*8=32个arena,也就是32*64 = 2048M内存

查资料发现这是 glibc 在版本 2.10 引入的 arena 新功能导致。CentOS 6/7 的 glibc 大都是 2.12/ 2.17 了,所以都会有这个问题。这个功能对每个线程都分配一个分配一个本地arena来加速多线程的执行。

在 glibc 的 arena.c 中使用的 mmap() 调用就和之前的示例代码类似:

p2 = (char *)mmap(aligned_heap_area, HEAP_MAX_SIZE, PROT_NONE,

MAP_NORESERVE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)

之后,只有很小的一部分地址被映射到了物理内存中:

mprotect(p2, size, PROT_READ | PROT_WRITE)

因此在一个多线程程序中,会有相当多的 64MB 的 arena 被分配。这个可以用环境变量 MALLOC_ARENA_MAX 来控制。在64位系统中的默认值为 128,也就是单个进程最多可以申请128个arena。

由于Java 程序由于自己维护堆的使用,导致调用 glibc 去管理内存的次数较少。更糟的是 Java 8 开始使用 metaspace 原空间取代永久代,而元空间是存放在操作系统本地内存中,这就导致线程一多,每个线程都要使用一点元空间,也就是每个线程都分配一个64MB的 arena,导致巨大的虚拟地址被分配。

可以减小MALLOC_ARENA_MAX,比如

export MALLOC_ARENA_MAX=4

参考

https://yq.aliyun.com/articles/227924

https://unix.stackexchange.com/questions/379644/glibc-memory-alloction-arenas-and-debugging

https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=zh_us

yarn虚拟cpu和虚拟内存的更多相关文章

  1. Java向服务端转身 系统平台所对应的机器语言 虚拟CPU的机器语言字节码 bytecode

    小结: 1.虚拟CPU的模拟器:java虚拟机 JVM Java将虚拟机(VM)作为插件集成到浏览器中,将编译后的Java程序(Applet)在虚拟机上运行,这种技术 当初是为了增强浏览器的功能. J ...

  2. wmware7安装xp错误:虚拟CPU已经入关闭状态

    wm7安装xp错误提示: 虚拟CPU已经入关闭状态.这会造成物理计算机重新启动.这可能是虚拟机操作系统的错误或VMware Workstation软件中的一个配置不正确. 这种情是硬盘模式为AHCI模 ...

  3. vmware 虚拟 CPU 性能计数器事件与主机 CPU 不兼容。

    错误提示:虚拟 CPU 性能计数器事件与主机 CPU 不兼容. 点放弃 如果是暂时状态选关机, 丢失掉运行状态,即可保留硬盘内容重新开机

  4. 物理CPU,物理核,逻辑CPU,虚拟CPU(vCPU)区别 (转)

    在做虚拟化时候,遇到划分CPU的问题,因此考虑到CPU不知道具体怎么划分,查询一些资料后就写成本文. a. 物理CPU:物理CPU是相对于虚拟CPU而言的概念,指实际存在的处理器,就是我们可以看的见, ...

  5. 记一次yarn导致cpu飙高的异常排查经历

    yarn就先不介绍了,这次排坑经历还是有收获的,从日志到堆栈信息再到源码,很有意思,下面听我说 问题描述: 集群一台NodeManager的cpu负载飙高. 进程还在但是看日志已经不再向Resourc ...

  6. sparkStreaming运行yarn,提交任务报错

    op.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302) ...

  7. kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装

    kvm简介 kvm最初由Quramnet公司开发,2008年被RedHat公司收购.kvm全称基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块 ...

  8. 在 Docker 里跑 Java,你必须知道的那些事儿!(转)

    原文 https://www.jianshu.com/p/0897d0581872 背景:众所周知,当我们执行没有任何调优参数(如“java-jar mypplication-fat.jar”)的 J ...

  9. Small Private Cloud Deployment Solution

    项目背景 为用户提供可访问的桌面虚拟机,方便软件研发人员日常办公,软件开发,编译等工作.主要操作包括Visor制图.程序开发测试以及使用office软件办公. 目前阶段需要支持100台虚拟机(4VCP ...

随机推荐

  1. shidebing——QandA:解决一个需求20171214

    list1 = [ {'eip': 60, 'day': '2014-7-5'}, {'etans': 96, 'day': '2014-7-5'}, {'etans': 30, 'day': '20 ...

  2. java注解使用

    1:定义注解 package chapter20.one; import java.lang.annotation.ElementType; import java.lang.annotation.R ...

  3. JSP表单提交与接收

    JSP表单提交与接收 在Myeclipse中新建web project,在webroot中新建userRegist1.jsp,代码如下 <%@ page contentType="te ...

  4. mysql 简单主从

    主服务器master [root@localhost ~]# vim /etc/my.cnf [mysqld] log-bin=mysql-bin #必须开启log-bin server-id=129 ...

  5. 简单的应用可以用storyBoard

    可是问题,你不知道你的项目有多复杂,storyBoard跳转控制有代码这么灵活吗? 1. 假是是根据推送来推出页面呢? 2. 假如我要根据不同情况不停地推出不同的页面呢?storyBoard怎么确定关 ...

  6. unity3d-小案例之角色简单漫游

    准备资源 我这里从网上下载一个角色模型,里面有一组动画.有站立.奔跑.杀怪等 我们来实现角色的前后左后移动,即键盘上的WSDA键,这里因为没有行走的动画.索性就用奔跑代替了!! 暂时先不计较代码冗余的 ...

  7. 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

    如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何 ...

  8. EL—表达式

    El的数据访问操作: 1:获取变量名(四大作用域中的变量?六大作用域?) 只能从这六个区域中拿数据!!! 2:获取对象的属性值 3:获取集合元素 4:执行表达式 1:获取变量名(四大作用域中的变量) ...

  9. Azkaban学习笔记(一)

    1. 任务调度概述 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 现成的开源调 ...

  10. 新项目新工作空间新仓库新setting文件

     maven项目涉及到仓库,本地jar包存放在本地仓库中,新项目新工作空间新仓库新setting文件,可以避免很多问题,不同项目工程的版本可能不一样,所涉及的jar包版本可能也不一样,不分开会有一些冲 ...