容器中JVM获取真实的CPU核数

基于 libsysconfcpus的方案,可以为各个版本的JDK提供一个通用的解决方案。

libsysconfcpus.so的原理是截获JVM获取CPU核数所用的系统调用sysconf(_SC_NPROCESSORS_CONF),改为读取环境变量LIBSYSCONFCPUS返回。

首先,从libsysconfcpus获取并编译so文件,放入镜像中。

然后,编写类似的脚本,完成两件事情:

  1. 定义环境变量LD_PRELOAD,将libsysconfcpus.so放在最前面达到截获的目的。

  2. 我们的系统在部署容器的时候,会额外传入一个环境变量"CONTAINER_CORE_LIMIT"代表分配的CPU核数(需按自己的情况修改),脚本将其转换为libsysconfcpus所需的环境变量。

注意:当JVM是以-server启动时,至少需要2核,否则在启动时会被死锁。

#!/bin/sh

if [ "x$CONTAINER_CORE_REQUEST" != "x" ]; then
LIBSYSCONFCPUS="$CONTAINER_CORE_REQUEST"
if [ ${LIBSYSCONFCPUS} -lt ]; then
LIBSYSCONFCPUS=
fi
export LIBSYSCONFCPUS
fi
export LD_PRELOAD="/usr/local/lib/libsysconfcpus.so:$LD_PRELOAD"

dockerfile 中添加

RUN git clone https://github.com/obmarg/libsysconfcpus.git /opt/libsysconfcpus && \
cd /opt/libsysconfcpus && \
./configure && \
make && make install && rm -rf /opt/libsysconfcpus

容器中JVM获取真实的CPU核数的更多相关文章

  1. 容器中的JVM资源该如何被安全的限制?

    前言 Java与Docker的结合,虽然更好的解决了application的封装问题.但也存在着不兼容,比如Java并不能自动的发现Docker设置的内存限制,CPU限制. 这将导致JVM不能稳定服务 ...

  2. 从Spring容器中获取Bean。ApplicationContextAware

    引言:我们从几个方面有逻辑的讲述如何从Spring容器中获取Bean.(新手勿喷) 1.我们的目的是什么? 2.方法是什么(可变的细节)? 3.方法的原理是什么(不变的本质)? 1.我们的目的是什么? ...

  3. 获取Spring容器中的Bean

    摘要 SpringMVC框架开发中可能会在Filter或Servlet中用到spring容器中注册的java bean 对象,获得容器中的java bean对象有如下方法 Spring中的Applic ...

  4. spring源码 — 二、从容器中获取Bean

    getBean 上一节中说明了容器的初始化,也就是把Bean的定义GenericBeanDefinition放到了容器中,但是并没有初始化这些Bean.那么Bean什么时候会初始化呢? 在程序第一个主 ...

  5. 通过JNDI从服务器容器中获取资源_Spring JNDI+Mysql+Tomcat

    通过JNDI从服务器容器中获取DataSource资源 (由容器管理,不要关闭它,容器自己会处理)上一篇我们使用的是dbcp,这里使用JNDI: 使用JNDI连接数据: 在Spring可以注释 < ...

  6. FastJson序列化Json自定义返回字段,普通类从spring容器中获取bean

    前言: 数据库的字段比如:price:1 ,返回需要price:1元. 这时两种途径修改: ① 比如sql中修改或者是在实体类转json前遍历修改. ②返回json,序列化时候修改.用到的是fastj ...

  7. [十]SpringBoot 之 普通类获取Spring容器中的bean

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  8. springboot中spring.profiles.active来引入多个properties文件 & Springboot获取容器中对象

    1.    引入多个properties文件 很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据, ...

  9. Spring:获取容器中的Bean

    某些情况下我们要获取 IOC 容器中指定注解.类型.名字的 Bean 要获取 IOC 容器中指定条件的 Bean 可以通过 ApplicationContext 相应的方法 @Autowired pr ...

随机推荐

  1. AngularJS初始化Select选择框

    一.引入 之前一个离职的同事负责的项目大量的引入了AngularJS的JS框架,后来我接手相关他项目里的功能.由于对AngularJS不是太熟,在他的功能上进行二次开发就比较费劲了,印象比较深的一个就 ...

  2. c# DataReader转换为Json

    /// <summary> /// DataReader转换为Json /// </summary> /// <param name="dataReader&q ...

  3. Java程序设计概述

    摘要:1996年Java第一次发布就引起了人们的广大关注.本文简要地介绍一下Java语言的发展历史. 一.Java程序设计平台 Java是一种优秀的程序设计语言.一旦一种语言应用于某个领域,与现存代码 ...

  4. canvas-2drawRectFun.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Python简单的网络编程

    OSI 模型介绍 应用层 -- 对接受的数据进行解释.加密与解密.压缩与解压缩 会话层 -- 通过传输层(端口号: 传输端口和接受端口) 建立数据传输的通路 传输层 -- 定义了一些传输数据的协议和端 ...

  6. 洛谷P1742 最小圆覆盖(计算几何)

    题意 题目链接 Sol 暴力做法是\(O(n^3)\)枚举三个点然后check一下是否能包含所有点 考虑一种随机算法,首先把序列random_shuffle一下. 然后我们枚举一个点\(i\),并维护 ...

  7. 从零开始学习html(八)CSS选择器——下

    六.子选择器 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...

  8. 关注的Elasticsearch大牛博客

    1.http://wangnan.tech/ 2.https://elasticsearch.cn/people/wood 3.https://www.jianshu.com/u/244399b1d7 ...

  9. 3.网络编程-tcp的服务器简单实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/1/13 22:03 # @Author : ChenAdong # @ema ...

  10. 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome

    给 Linux 系统"减肥",系统垃圾清理  2013/10/16  linux  系统安装与配置管理  评论  15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...