根据资料显示,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%左右:
测试内存
根据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
内存限制为1G:
程序会输出:
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的操作系统内存作为默认的最大堆大小。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。