Hadoop-2.6.0 CPU CGroup实现分析

简介: 一、概述       Hadoop-2.6.0中对CPU CGroups的实现,主要是通过CgroupsLCEResourcesHandler来实现的,通过它的int*()系列方法初始化一些参数和环境,比如CGroups的路径等,然后在启动容器内的可执行文件前由LinuxContainerExecutor调用preExecute()方法,进行setupLimits()即设置限额操作,而在容器内的可执行退出后(无论成功还是失败)由LinuxContainerExecutor调用postExecute()方法,进行clearLimits()即清除限额操作。

一、概述

       Hadoop-2.6.0中对CPU CGroups的实现,主要是通过CgroupsLCEResourcesHandler来实现的,通过它的int*()系列方法初始化一些参数和环境,比如CGroups的路径等,然后在启动容器内的可执行文

件前由LinuxContainerExecutor调用preExecute()方法,进行setupLimits()即设置限额操作,而在容器内的可执行退出后(无论成功还是失败)由LinuxContainerExecutor调用postExecute()方法,进行

clearLimits()即清除限额操作。

二、实现细节

      1、CgroupsLCEResourcesHandler配置

                   通过参数yarn.nodemanager.linux-container-executor.resources-handler.class配置

                   配置为org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler即可

                   参数默认值是org.apache.hadoop.yarn.server.nodemanager.util.DefaultLCEResourcesHandler。

      2、setupLimits()核心实现

                  参见如下代码注释:

/*
  * Next three functions operate on all the resources we are enforcing.
  */
 
private  void  setupLimits(ContainerId containerId,
                          Resource containerResource)  throws  IOException {
   String containerName = containerId.toString();
 
   if  (isCpuWeightEnabled()) {
     
     // 取container申请到资源中的VCores,注意用的是虚拟core
     int  containerVCores = containerResource.getVirtualCores();
     
     // 创建CGroup,其实就是在CGroup路径中创建与CPU和容器名称相关的路径
     createCgroup(CONTROLLER_CPU, containerName);
 
     // 对应隔离方式(一),即shares
     int  cpuShares = CPU_DEFAULT_WEIGHT * containerVCores;
     
     // 更新CGroup,其实就是在上述路径中将数值cpuShares写入shares文件
     // 这个cpuShares的值就是container申请到资源中的VCores * 1024
     updateCgroup(CONTROLLER_CPU, containerName,  "shares" ,
         String.valueOf(cpuShares));
     
     // 对应隔离方式(二),即cfs_period_us、cfs_quota_us
     // 这个是需要参数yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage设置为true的
     if  (strictResourceUsageMode) {
       int  nodeVCores =
           conf.getInt(YarnConfiguration.NM_VCORES,
             YarnConfiguration.DEFAULT_NM_VCORES);
       if  (nodeVCores != containerVCores) {
         float  containerCPU =
             (containerVCores * yarnProcessors) / ( float ) nodeVCores;
         int [] limits = getOverallLimits(containerCPU);
         
         // 更新CGroup,其实就是在上述路径中将数值limits[0]和limits[1]分别写入cfs_period_us文件和cfs_quota_us文件
         updateCgroup(CONTROLLER_CPU, containerName, CPU_PERIOD_US,
           String.valueOf(limits[ 0 ]));
         updateCgroup(CONTROLLER_CPU, containerName, CPU_QUOTA_US,
           String.valueOf(limits[ 1 ]));
       }
     }
   }
}

      3、clearLimits()核心实现

                  参见如下代码注释:

private  void  clearLimits(ContainerId containerId) {
   if  (isCpuWeightEnabled()) {
     // 删除Container对应路径和文件
     deleteCgroup(pathForCgroup(CONTROLLER_CPU, containerId.toString()));
   }
}
相关文章
|
4月前
|
分布式计算 Hadoop
Hadoop系列 mapreduce 原理分析
Hadoop系列 mapreduce 原理分析
36 1
|
8月前
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
1356 5
|
6月前
|
Web App开发 缓存 JavaScript
Node.js 应用高 CPU 占用率的分析方法
Node.js 应用高 CPU 占用率的分析方法
114 0
|
2月前
|
机器学习/深度学习 编解码 缓存
CPU型号分析避坑指南——2、游戏电脑与办公电脑CPU该如何选择
CPU型号分析避坑指南——2、游戏电脑与办公电脑CPU该如何选择
50 0
|
4月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
53 0
|
21天前
|
存储 监控 Linux
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
48 0
|
2月前
|
数据采集 存储 分布式计算
使用Hadoop和Nutch构建音频爬虫:实现数据收集与分析
使用Hadoop和Nutch构建音频爬虫:实现数据收集与分析
|
4月前
|
并行计算 Linux 计算机视觉
DeepFace【部署 04】轻量级人脸识别和面部属性分析框架deepface使用Docker部署CPU+GPU两个版本及cuDNN安装
DeepFace【部署 04】轻量级人脸识别和面部属性分析框架deepface使用Docker部署CPU+GPU两个版本及cuDNN安装
184 0
|
5月前
|
Java
分析JAVA应用CPU占用过高的问题
分析JAVA应用CPU占用过高的问题
38 0
|
5月前
|
存储 缓存 Linux
高效利用CPU缓存一致性:优化技巧与策略分析
高效利用CPU缓存一致性:优化技巧与策略分析

相关实验场景

更多