提升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

总结:

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

相关推荐
宵时待雨1 小时前
linux笔记归纳9:进程间通信
linux·服务器·笔记
Zhang~Ling1 小时前
深入学习Linux: 命令行参数与环境变量详解
linux·服务器
会飞的小新1 小时前
《深入理解 DDR Memory Margin》系列之第四章 从 Bit Error 到 ECC——服务器为什么能够发现内存错误?
运维·服务器
Shadow(⊙o⊙)1 小时前
日志与线程池
linux·c++·算法
无锡银洲自动化1 小时前
烟气监测取样频繁堵管?防堵取样器解决工业运维通病
运维·产品运营
樂禮1 小时前
Windows-Arch Linux 键鼠共享 & 剪贴板同步配置
linux·运维·windows
CHANG_THE_WORLD1 小时前
Linux C 多线程 TCP 并发服务器:从 `accept()` 到工作线程的完整解析
linux·服务器·c语言
影视飓风TIM2 小时前
Linux基础入门笔记:命令、内核架构与压缩传输全梳理
linux·笔记·架构
敲上瘾2 小时前
Linux系统调用mmap文件映射与malloc简单模拟实现指南
linux·服务器·c语言·缓存