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

根据资料显示,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:

mesos对jvm进程的隔离和资源限制_第1张图片

程序会输出:

free:17
total:17
max:1020

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

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

马拉松限制(MB) jvm最大heap大小(MB)
1024 1020
2048 1849
4096 3669
8192 7310
16384 14592
32768 27305
65536 27305

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

你可能感兴趣的:(mesos,jvm,cgroups)