若存在此目录,说明支持CPU控制器
bash
ls /sys/fs/cgroup/cpu/
bash
# 1. 创建默认控制组(限制50% CPU)
sudo mkdir /sys/fs/cgroup/cpu/cpu.default
# 配置CPU限制:周期100ms(100000微秒)内,最多使用50ms(50000微秒),即50%
echo 50000 | sudo tee /sys/fs/cgroup/cpu/cpu.default/cpu.cfs_quota_us
echo 100000 | sudo tee /sys/fs/cgroup/cpu/cpu.default/cpu.cfs_period_us
# 2. 创建专属控制组(不限制CPU)
sudo mkdir /sys/fs/cgroup/cpu/cpu.java
# 配置为无限制(-1表示不限制)
echo -1 | sudo tee /sys/fs/cgroup/cpu/cpu.my_config/cpu.cfs_quota_us
echo 100000 | sudo tee /sys/fs/cgroup/cpu/cpu.my_config/cpu.cfs_period_us
创建cpu_control.sh
bash
#!/bin/bash
# 获取所有进程PID(排除内核进程,PID>1)
ALL_PIDS=$(pgrep -d ' ' -x -P 1 -o '.*' 2>/dev/null)
# 遍历所有进程,分类到不同组
for pid in $ALL_PIDS; do
# 跳过已终止的进程
if ! ps -p $pid >/dev/null; then
continue
fi
cmd=$(ps -p $pid -o comm=)
# 这里=="java"自己改成不限制的程序,现在是不限制java进程
if [[ "$cmd" == "java" ]]; then
# 特定非限制进程:加入cpu.my_config组
echo $pid | sudo tee /sys/fs/cgroup/cpu/cpu.my_config/cgroup.procs >/dev/null
else
# 所有进程:加入cpu.default组(限制50%)
echo $pid | sudo tee /sys/fs/cgroup/cpu/cpu.default/cgroup.procs >/dev/null
fi
done
#赋权限
bash
chmod +x /path/to/cpu_control.sh
创建服务文件,这个配置是五秒自动执行一次
bash
sudo vim /etc/systemd/system/cgroup-java-control.service
bash
[Unit]
Description=限制进程 50% CPU
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do /path/to/cpu_control.sh; sleep 5; done'
Restart=always
[Install]
WantedBy=multi-user.target
启动并设置开机自启
bash
sudo systemctl daemon-reload
sudo systemctl start cpu-control
sudo systemctl enable cpu-control