forked from mirror/MCSM-Daemon
新增 CPU 配额限制
This commit is contained in:
parent
084c2958e3
commit
1c6394deaf
@ -70,7 +70,7 @@ class DockerProcessAdapter extends EventEmitter implements IInstanceProcess {
|
||||
public async destroy() {
|
||||
try {
|
||||
await this.container.remove();
|
||||
} catch (error) {}
|
||||
} catch (error) { }
|
||||
}
|
||||
|
||||
private wait() {
|
||||
@ -131,9 +131,28 @@ export default class DockerStartCommand extends InstanceCommand {
|
||||
}
|
||||
|
||||
// 内存限制
|
||||
let maxMemory = 0;
|
||||
let maxMemory = undefined;
|
||||
if (instance.config.docker.memory) maxMemory = instance.config.docker.memory * 1024 * 1024;
|
||||
|
||||
// CPU使用率计算
|
||||
let cpuQuota = undefined;
|
||||
let cpuPeriod = undefined;
|
||||
if (instance.config.docker.cpuUsage) {
|
||||
cpuQuota = instance.config.docker.cpuUsage * 10 * 1000;
|
||||
cpuPeriod = 1000 * 1000;
|
||||
}
|
||||
|
||||
// CPU 核心数校验
|
||||
let cpusetCpus = undefined;
|
||||
if (instance.config.docker.cpusetCpus) {
|
||||
const arr = instance.config.docker.cpusetCpus.split(",");
|
||||
arr.forEach((v) => {
|
||||
if (isNaN(Number(v))) throw new Error(`非法的CPU核心指定: ${v}`);
|
||||
});
|
||||
cpusetCpus = instance.config.docker.cpusetCpus;
|
||||
// Note: 检验
|
||||
}
|
||||
|
||||
// 输出启动日志
|
||||
logger.info("----------------");
|
||||
logger.info(`会话 ${source}: 请求开启实例`);
|
||||
@ -163,7 +182,10 @@ export default class DockerStartCommand extends InstanceCommand {
|
||||
Memory: maxMemory,
|
||||
Binds: [`${cwd}:/workspace/`],
|
||||
AutoRemove: true,
|
||||
PortBindings: publicPortArray
|
||||
CpusetCpus: cpusetCpus,
|
||||
CpuPeriod: cpuPeriod,
|
||||
CpuQuota: cpuQuota,
|
||||
PortBindings: publicPortArray,
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -48,14 +48,14 @@ export default class InstanceConfig {
|
||||
// Extend
|
||||
public docker: IDockerConfig = {
|
||||
image: "",
|
||||
memory: 1024,
|
||||
ports: [],
|
||||
cpu: 1,
|
||||
maxSpace: 0,
|
||||
memory: null,
|
||||
networkMode: "bridge",
|
||||
cpusetCpus: "",
|
||||
io: 0,
|
||||
network: 0,
|
||||
networkMode: "bridge"
|
||||
cpuUsage: null,
|
||||
maxSpace: null,
|
||||
io: null,
|
||||
network: null,
|
||||
};
|
||||
|
||||
public pingConfig = {
|
||||
|
@ -123,13 +123,13 @@ export default class Instance extends EventEmitter {
|
||||
if (cfg.docker) {
|
||||
this.configureParams(this.config.docker, cfg.docker, "image", String);
|
||||
this.configureParams(this.config.docker, cfg.docker, "memory", Number);
|
||||
this.configureParams(this.config.docker, cfg.docker, "cpu", String);
|
||||
this.configureParams(this.config.docker, cfg.docker, "ports");
|
||||
this.configureParams(this.config.docker, cfg.docker, "maxSpace", Number);
|
||||
this.configureParams(this.config.docker, cfg.docker, "cpusetCpus", String);
|
||||
this.configureParams(this.config.docker, cfg.docker, "io", Number);
|
||||
this.configureParams(this.config.docker, cfg.docker, "network", Number);
|
||||
this.configureParams(this.config.docker, cfg.docker, "networkMode", String);
|
||||
this.configureParams(this.config.docker, cfg.docker, "cpusetCpus", String);
|
||||
this.configureParams(this.config.docker, cfg.docker, "cpuUsage", Number);
|
||||
}
|
||||
if (cfg.pingConfig) {
|
||||
this.configureParams(this.config.pingConfig, cfg.pingConfig, "ip", String);
|
||||
@ -149,7 +149,14 @@ export default class Instance extends EventEmitter {
|
||||
configureParams(self: any, args: any, key: string, typeFn?: Function) {
|
||||
const selfDefaultValue = self[key] ?? null;
|
||||
const v = args[key] != null ? args[key] : selfDefaultValue;
|
||||
if (typeFn) {
|
||||
// 数字类型的特殊处理
|
||||
if (typeFn === Number) {
|
||||
if (v === "" || v === null)
|
||||
self[key] = null
|
||||
else
|
||||
self[key] = Number(v);
|
||||
}
|
||||
else if (typeFn) {
|
||||
self[key] = typeFn(v);
|
||||
} else {
|
||||
self[key] = v;
|
||||
|
@ -26,12 +26,12 @@ export interface IDockerConfig {
|
||||
image: string;
|
||||
memory: number; //以字节为单位的内存限制。
|
||||
ports: string[];
|
||||
cpu: number;
|
||||
maxSpace: number;
|
||||
network: number;
|
||||
io: number;
|
||||
networkMode: string;
|
||||
cpusetCpus: string; //允许执行的 CPU(例如0-3,,0,1)
|
||||
cpuUsage: number;
|
||||
}
|
||||
|
||||
// 实例具体进程接口
|
||||
|
Loading…
Reference in New Issue
Block a user