提升CPU平均使用率(自用)

背景:

没背景,纯属技术探索。

思路:

1、在不影响业务正常开展的前提下,提升CPU的利用率。

2、两种方式实现,纯bash脚本和java程序。两者思路都差不多。

3、进行服务管理,开机自启。

开干:

方式1:纯bash脚本

vim basic.sh

bash 复制代码
#!/bin/bash

TARGET_PERCENT=10

CPU_CORES=$(nproc)

echo "检测到 $CPU_CORES 个 CPU 核心,开始提升至约 ${TARGET_PERCENT}% 的利用率..."
echo "按 Ctrl+C 终止脚本,优化将自动清除。"

PIDS=""
cleanup() {
    echo -e "\n正在清理进程..."
    for pid in $PIDS; do
        kill -9 "$pid" 2>/dev/null
    done
    exit 0
}
trap cleanup SIGINT SIGTERM

for i in $(seq 1 "$CPU_CORES"); do
    (
        BUSY_MS=${TARGET_PERCENT}
        SLEEP_MS=$((100 - TARGET_PERCENT))
        
        BUSY_SEC="0.0${BUSY_MS}"
        SLEEP_SEC="0.0${SLEEP_MS}"

        while true; do
            timeout "${BUSY_SEC}" dd if=/dev/zero of=/dev/null 2>/dev/null
            
            sleep "${SLEEP_SEC}"
        done
    ) &
    PIDS="$PIDS $!"
done

wait

脚本不写注释,自己看。赋予执行权限,并运行。

使用方式:

修改:

bash 复制代码
[root@localhost cpu]# ./basic.sh 
检测到 16 个 CPU 核心,开始提升至约 10% 的利用率...
按 Ctrl+C 终止脚本,优化将自动清除。
^C
正在清理进程...

[root@localhost cpu]# ./basic.sh
检测到 16 个 CPU 核心,开始提升至约 40% 的利用率...
按 Ctrl+C 终止脚本,优化将自动清除。

bash开机自启,服务管理这里就不多赘述。参考之前的文章。

方式2:java程序

vim basic.java 纯JDK工具包,无额外引入,不存在漏洞或风险。

bash 复制代码
import java.util.ArrayList;
import java.util.List;

public class basic {

    private static final int TARGET_PERCENT = 10;
    private static final int PERIOD_MS = 50;

    private static volatile boolean running = true;

    public static void main(String[] args) {
        int targetPercent = TARGET_PERCENT;
        if (args.length > 0) {
            try {
                targetPercent = Integer.parseInt(args[0]);
                if (targetPercent < 1 || targetPercent > 100) {
                    System.err.println("错误:参数必须在 1~100 之间");
                    System.exit(1);
                }
            } catch (NumberFormatException e) {
                System.err.println("错误:请输入有效的整数参数");
                System.exit(1);
            }
        }

        int cores = Runtime.getRuntime().availableProcessors();
        System.out.println("按 Ctrl+C 终止程序,优化将自动清除。");

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            running = false;
            System.out.println("\n正在清理优化线程...");
        }));

        int busyMs = PERIOD_MS * targetPercent / 100;
        int sleepMs = PERIOD_MS - busyMs;

        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < cores; i++) {
            Thread t = new Thread(new CpuWorker(busyMs, sleepMs));
            t.start();
            threads.add(t);
        }

        for (Thread t : threads) {
            try {
                t.join();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    static class CpuWorker implements Runnable {
        private final int busyMs;
        private final int sleepMs;

        public CpuWorker(int busyMs, int sleepMs) {
            this.busyMs = busyMs;
            this.sleepMs = sleepMs;
        }

        @Override
        public void run() {
            while (running) {
                long busyEndTime = System.nanoTime() + (busyMs * 1_000_000L);
                while (System.nanoTime() < busyEndTime) {
                    Math.sqrt(12345.6789);
                }

                try {
                    Thread.sleep(sleepMs);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        }
    }
}
1、java源码不写注释,自己看,保存,编译,运行。
bash 复制代码
[root@localhost cpu]# javac basic.java 
[root@localhost cpu]# ls
basic.class  basic$CpuWorker.class  basic.java  basic.sh
[root@localhost cpu]# java basic
按 Ctrl+C 终止程序,优化将自动清除。

[root@localhost cpu]# java basic 60
按 Ctrl+C 终止程序,优化将自动清除。

默认10%

可自定义

2、生成jar文件,方便使用及管理。
bash 复制代码
[root@localhost cpu]# ls
basic.class  basic$CpuWorker.class  basic.java  basic.sh
[root@localhost cpu]# jar cvfe basic.jar basic basic.class basic\$CpuWorker.class
added manifest
adding: basic.class(in = 2616) (out= 1565)(deflated 40%)
adding: basic$CpuWorker.class(in = 853) (out= 614)(deflated 28%)
[root@localhost cpu]# ll
total 20
-rw-r--r-- 1 root root 2616 Jul 16 10:22 basic.class
-rw-r--r-- 1 root root  853 Jul 16 10:22 basic$CpuWorker.class
-rw-r--r-- 1 root root 2778 Jul 16 10:30 basic.jar
-rw-rw-rw- 1 root root 2425 Jul 16 10:20 basic.java
-rwxr-x--x 1 root root  772 Jul 16 10:17 basic.sh

运行

bash 复制代码
[root@localhost cpu]# java -jar basic.jar
按 Ctrl+C 终止程序,优化将自动清除。
^C
正在清理优化线程...
[root@localhost cpu]# java -jar basic.jar 80
按 Ctrl+C 终止程序,优化将自动清除。

默认10%

可自定义

3、进行服务管理,并设置开机自启

由于这次的目录在 /app/script/cpu,并且系统服务默认是以 root 用户运行的,我们直接把路径和用户写进服务文件即可。

1. 创建并写入服务文件
bash 复制代码
cat > /etc/systemd/system/basic.service << 'EOF'
[Unit]
Description=Mdmbasic CPU Load Service
After=network.target

[Service]
# 使用 simple 类型,让 systemd 直接管理这个 Java 进程
Type=simple
# 指定 JAR 包的绝对路径,注意这里必须写全路径
ExecStart=/usr/local/java/jdk8u462-b08/bin/java -jar /app/script/cpu/basic.jar
# 停止服务时发送 kill 信号
KillSignal=SIGINT
# 意外退出时自动重启
Restart=always
RestartSec=5
# 以 root 用户运行(确保有权限访问目录)
User=root

[Install]
WantedBy=multi-user.target
EOF
2. 重新加载系统服务配置
bash 复制代码
systemctl daemon-reload
3. 启动服务并查看状态
bash 复制代码
# 启动服务
systemctl start basic

# 查看运行状态(如果显示 active (running) 说明启动成功)
systemctl status basic
4. 设置开机自启
bash 复制代码
systemctl enable basic

5、日常管理命令备忘:
  • 停止程序sudo systemctl stop basic
  • 重启程序sudo systemctl restart basic
  • 查看程序报错日志sudo journalctl -u basic -f

注意 :如果你之前在 start.sh 里给 java -jar 附加了参数(比如 20),请把上面配置里的 ExecStart 那一行改为:

ExecStart=/usr/local/java/jdk8u462-b08/bin/java -jar /app/script/cpu/basic.jar 20

总结:

这次没总结,怎么用你们看着来。

相关推荐
晓晓_za8986682 小时前
开源 GEO 优化源码二次开发:贴牌改造与业务模块扩展实践
java·运维·服务器·开发语言·性能优化·开源
SCandL1522 小时前
k8s service
linux·容器·kubernetes
云计算DevOps-韩老师3 小时前
【MySQL运维DBA】【SQL基础系列002篇】
运维·mysql·dba
DBA大董3 小时前
TDengine3.0 DBA常用的运维命令和SQL2
运维·数据库·时序数据库·dba·tdengine
会飞的土拨鼠呀3 小时前
Linux的存储使用率应该如何计算
linux·运维·服务器
Elastic 中国社区官方博客4 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
aaaBsBsBsB5 小时前
k8s pod管理
运维·docker·容器
weixin_511255215 小时前
NGINX常用配置
linux·服务器·nginx
志栋智能5 小时前
迈向真正的超自动化巡检
运维·自动化
荣合技术服务5 小时前
电脑多,单个加域麻烦?下载此AD域加域助手,批量加域速度快
运维·服务器·ad域控