新增 CPU 配额限制

This commit is contained in:
Suwings 2022-01-23 11:46:19 +08:00
parent 084c2958e3
commit 1c6394deaf
4 changed files with 42 additions and 13 deletions

View File

@ -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,
}
});

View File

@ -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 = {

View File

@ -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;

View File

@ -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-30,1
cpuUsage: number;
}
// 实例具体进程接口