linux控制其他程序使用cpu低于50%——笔记

若存在此目录,说明支持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