/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.jstorm.container.cgroup.core; import java.io.IOException; import com.alibaba.jstorm.container.CgroupUtils; import com.alibaba.jstorm.container.Constants; import com.alibaba.jstorm.container.SubSystemType; public class MemoryCore implements CgroupCore { public static final String MEMORY_STAT = "/memory.stat"; public static final String MEMORY_USAGE_IN_BYTES = "/memory.usage_in_bytes"; public static final String MEMORY_MEMSW_USAGE_IN_BYTES = "/memory.memsw.usage_in_bytes"; public static final String MEMORY_MAX_USAGE_IN_BYTES = "/memory.max_usage_in_bytes"; public static final String MEMORY_MEMSW_MAX_USAGE_IN_BYTES = "/memory.memsw.max_usage_in_bytes"; public static final String MEMORY_LIMIT_IN_BYTES = "/memory.limit_in_bytes"; public static final String MEMORY_MEMSW_LIMIT_IN_BYTES = "/memory.memsw.limit_in_bytes"; public static final String MEMORY_FAILCNT = "/memory.failcnt"; public static final String MEMORY_MEMSW_FAILCNT = "/memory.memsw.failcnt"; public static final String MEMORY_FORCE_EMPTY = "/memory.force_empty"; public static final String MEMORY_SWAPPINESS = "/memory.swappiness"; public static final String MEMORY_USE_HIERARCHY = "/memory.use_hierarchy"; public static final String MEMORY_OOM_CONTROL = "/memory.oom_control"; private final String dir; public MemoryCore(String dir) { this.dir = dir; } @Override public SubSystemType getType() { // TODO Auto-generated method stub return SubSystemType.memory; } public static class Stat { public final long cacheSize; public final long rssSize; public final long mappedFileSize; public final long pgpginNum; public final long pgpgoutNum; public final long swapSize; public final long activeAnonSize; public final long inactiveAnonSize; public final long activeFileSize; public final long inactiveFileSize; public final long unevictableSize; public final long hierarchicalMemoryLimitSize; public final long hierarchicalMemswLimitSize; public final long totalCacheSize; public final long totalRssSize; public final long totalMappedFileSize; public final long totalPgpginNum; public final long totalPgpgoutNum; public final long totalSwapSize; public final long totalActiveAnonSize; public final long totalInactiveAnonSize; public final long totalActiveFileSize; public final long totalInactiveFileSize; public final long totalUnevictableSize; public final long totalHierarchicalMemoryLimitSize; public final long totalHierarchicalMemswLimitSize; public Stat(String output) { String[] splits = output.split("\n"); this.cacheSize = Long.parseLong(splits[0]); this.rssSize = Long.parseLong(splits[1]); this.mappedFileSize = Long.parseLong(splits[2]); this.pgpginNum = Long.parseLong(splits[3]); this.pgpgoutNum = Long.parseLong(splits[4]); this.swapSize = Long.parseLong(splits[5]); this.inactiveAnonSize = Long.parseLong(splits[6]); this.activeAnonSize = Long.parseLong(splits[7]); this.inactiveFileSize = Long.parseLong(splits[8]); this.activeFileSize = Long.parseLong(splits[9]); this.unevictableSize = Long.parseLong(splits[10]); this.hierarchicalMemoryLimitSize = Long.parseLong(splits[11]); this.hierarchicalMemswLimitSize = Long.parseLong(splits[12]); this.totalCacheSize = Long.parseLong(splits[13]); this.totalRssSize = Long.parseLong(splits[14]); this.totalMappedFileSize = Long.parseLong(splits[15]); this.totalPgpginNum = Long.parseLong(splits[16]); this.totalPgpgoutNum = Long.parseLong(splits[17]); this.totalSwapSize = Long.parseLong(splits[18]); this.totalInactiveAnonSize = Long.parseLong(splits[19]); this.totalActiveAnonSize = Long.parseLong(splits[20]); this.totalInactiveFileSize = Long.parseLong(splits[21]); this.totalActiveFileSize = Long.parseLong(splits[22]); this.totalUnevictableSize = Long.parseLong(splits[23]); this.totalHierarchicalMemoryLimitSize = Long.parseLong(splits[24]); this.totalHierarchicalMemswLimitSize = Long.parseLong(splits[25]); } } public Stat getStat() throws IOException { String output = CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_STAT)).get(0); Stat stat = new Stat(output); return stat; } public long getPhysicalUsage() throws IOException { return Long.parseLong(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_USAGE_IN_BYTES)).get(0)); } public long getWithSwapUsage() throws IOException { return Long.parseLong(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_MEMSW_USAGE_IN_BYTES)).get(0)); } public long getMaxPhysicalUsage() throws IOException { return Long.parseLong(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_MAX_USAGE_IN_BYTES)).get(0)); } public long getMaxWithSwapUsage() throws IOException { return Long.parseLong(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_MEMSW_MAX_USAGE_IN_BYTES)).get(0)); } public void setPhysicalUsageLimit(long value) throws IOException { CgroupUtils.writeFileByLine(Constants.getDir(this.dir, MEMORY_LIMIT_IN_BYTES), String.valueOf(value)); } public long getPhysicalUsageLimit() throws IOException { return Long.parseLong(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_LIMIT_IN_BYTES)).get(0)); } public void setWithSwapUsageLimit(long value) throws IOException { CgroupUtils.writeFileByLine(Constants.getDir(this.dir, MEMORY_MEMSW_LIMIT_IN_BYTES), String.valueOf(value)); } public long getWithSwapUsageLimit() throws IOException { return Long.parseLong(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_MEMSW_LIMIT_IN_BYTES)).get(0)); } public int getPhysicalFailCount() throws IOException { return Integer.parseInt(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_FAILCNT)).get(0)); } public int getWithSwapFailCount() throws IOException { return Integer.parseInt(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_MEMSW_FAILCNT)).get(0)); } public void clearForceEmpty() throws IOException { CgroupUtils.writeFileByLine(Constants.getDir(this.dir, MEMORY_FORCE_EMPTY), String.valueOf(0)); } public void setSwappiness(int value) throws IOException { CgroupUtils.writeFileByLine(Constants.getDir(this.dir, MEMORY_SWAPPINESS), String.valueOf(value)); } public int getSwappiness() throws IOException { return Integer.parseInt(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_SWAPPINESS)).get(0)); } public void setUseHierarchy(boolean flag) throws IOException { CgroupUtils.writeFileByLine(Constants.getDir(this.dir, MEMORY_USE_HIERARCHY), String.valueOf(flag ? 1 : 0)); } public boolean isUseHierarchy() throws IOException { int output = Integer.parseInt(CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_USE_HIERARCHY)).get(0)); return output > 0; } public void setOomControl(boolean flag) throws IOException { CgroupUtils.writeFileByLine(Constants.getDir(this.dir, MEMORY_OOM_CONTROL), String.valueOf(flag ? 1 : 0)); } public boolean isOomControl() throws IOException { String output = CgroupUtils.readFileByLine(Constants.getDir(this.dir, MEMORY_OOM_CONTROL)).get(0); output = output.split("\n")[0].split("[\\s]")[1]; int value = Integer.parseInt(output); return value > 0; } }