mesos对jvm进程的隔离和资源限制

P_Chou水冗

根据资料显示,jdk版本必须为Java 8u131及以上 ,实测采用8u201没毛病:

java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

mesos-slave isolation模式

之前之所以不能限制jvm,是由于slave的默认isolation并不是cgroup,需要通过slave启动参数启用:

/usr/sbin/mesos-slave --master=zk://localhost:2181/mesos   --work_dir=/var/lib/mesos   --isolation=cgroups/cpu,cgroups/mem   --cgroups_enable_cfs

参考Mesos isolation cgroups/cpu & cgroups/mem

测试代码

package com.eoitek.dc;

public class Main {


    private static class LoopThread implements Runnable {
        public void run() {
            while(true) {}
        }
    }

    public static void main(String[] args) {

        if ( args.length > 0 && args[0].equals("m") ) {
            System.out.println("free:" + Runtime.getRuntime().freeMemory() / 1024 / 1024);
            System.out.println("total:" + Runtime.getRuntime().totalMemory() / 1024 / 1024);
            System.out.println("max:" + Runtime.getRuntime().maxMemory() / 1024 / 1024);
            while ( true ) {}
        }

        try {
            if ( args.length > 0 ) {
                int threadcount = Integer.parseInt(args[0]);
                for (int i = 0; i < threadcount; i++) {
                    Thread t = new Thread(new LoopThread());
                    t.start();
                }
            }
        }
        catch (Exception  ex) { }
    }

}

这个代码传入m会打印出jvm内存总量信息,传入数字会启动若干的死循环线程,模拟cpu占用率很高的场合。

测试CPU

首先测试CPU,启动marathon任务:

/usr/lib/jdk1.8.0_201/bin/java  -jar mesos-test.jar 4

理论上这个进程的cpu占用可以达到400%,此时限制cpu核数为1,通过top观察进程的cpu占用基本被限制在100%左右:

image.png

测试内存

根据jdk版本的不同,需要指定一些jvm的启动参数,具体的,采用如下命令启动任务:

export JAVA_HOME=/usr/lib/jdk1.8.0_201 && /usr/lib/jdk1.8.0_201/bin/java -XX:MaxRAMFraction=1 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -jar mesos-test.jar m

image.png

内存限制为1G:

image.png

程序会输出:

free:17
total:17
max:1020

可以看到jvm正确的识别了内存总量为1G。

在上述jvm启动参数中,有一个MaxRAMFraction,这个参数决定了jvm究竟使用多少内存作为默认的最大堆内存。不同的jvm在这方面有不同的实现,可以参考容器中的JVM资源该如何被安全的限制?。这篇文章主要测试的是openjdk,针对hotspot,当MaxRAMFraction设置为1的时候,我的测试如下:

马拉松限制(MB)jvm最大heap大小(MB)
10241020
20481849
40963669
81927310
1638414592
3276827305
6553627305

如果不设置MaxRAMFraction,一般jvm会用1/4的操作系统内存作为默认的最大堆大小。

阅读 922

全干工程师
分享和记录个人技术经验,由于接触的东西比较杂,可能什么都写,看官见谅

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发

5k 声望
238 粉丝
0 条评论
你知道吗?

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发

5k 声望
238 粉丝
宣传栏