背景:
没背景,纯属技术探索。
思路:
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
总结:
这次没总结,怎么用你们看着来。