服务器CPU、内存和磁盘占用脚本
一、Linux
以下是一个简单的 C 程序,它会申请一定量的内存并一直持有它:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
return 1;
}
long memory_mb = atol(argv[1]);
char *memory = malloc(memory_mb * 1024 * 1024);
if (memory == NULL) {
return 1;
}
memset(memory, 0, memory_mb * 1024 * 1024);
sleep(1000000);
return 0;
}
将这个程序保存为 `mem.c`,然后使用 gcc 编译它:
gcc -o mem mem.c
然后创建一个test.sh脚本文件,创建 CPU 、内存负载,下面是脚本
#!/bin/bash
# CPU 占用设置
NUM_CORES=$(nproc) # 获取 CPU 核心数
MIN_LOAD=35 # 设置最低 CPU 占用率,如 35%
MAX_LOAD=45 # 设置最高 CPU 占用率,如 45%
SLEEP_SECONDS=10 # 设置占用率变动的间隔时间,如10秒
# 内存占用设置
TOTAL_MEMORY_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') # 获取总内存,单位是 KB
MIN_TARGET_MEMORY_KB=$(echo "$TOTAL_MEMORY_KB*$MIN_LOAD/100" | bc) # 计算最低目标内存,单位是 KB
MAX_TARGET_MEMORY_KB=$(echo "$TOTAL_MEMORY_KB*$MAX_LOAD/100" | bc) # 计算最高目标内存,单位是 KB
while true; do
# 在最低和最高占用率之间随机选择一个目标占用率
TARGET_LOAD=$(shuf -i $MIN_LOAD-$MAX_LOAD -n 1)
NUM_WORKERS=$(echo "$NUM_CORES*$TARGET_LOAD/100" | bc)
# 占用 CPU
echo "Attempting to consume $TARGET_LOAD% of CPU..."
for ((i=0; i<$NUM_WORKERS; i++)); do
{ while true; do :; done } &
PIDS[${i}]=$! # 保存每个子进程的 PID
done
# 在最低和最高目标内存之间随机选择一个目标内存大小
TARGET_MEMORY_KB=$(shuf -i $MIN_TARGET_MEMORY_KB-$MAX_TARGET_MEMORY_KB -n 1)
TARGET_MEMORY_MB=$(echo "$TARGET_MEMORY_KB/1024" | bc)
# 占用内存
echo "Attempting to consume $TARGET_MEMORY_MB MB of memory..."
./mem $TARGET_MEMORY_MB &
MEM_PID=$! # 保存 mem 程序的 PID
# 等待一定时间后,杀掉所有子进程,并重新开始循环,以达到占用率和内存占用变动的目的
sleep $SLEEP_SECONDS
for pid in ${PIDS[*]}; do
kill -9 $pid
done
kill -9 $MEM_PID
unset PIDS # 清空 PID 数组,以便下次循环使用
done
运行:
nohup bash test.sh &
磁盘负载:
dd if=/dev/zero of=/mytestdata bs=1M count=40000
其中:
if=/dev/zero 表示输入文件为 /dev/zero,它是一个特殊的文件,读取它将给出零值字节。
of=mytestdata 表示输出文件为 "mytestdata"。
bs=1m 表示以1M为单位进行复制。
count=40000 表示复制的数量为40000,因此总大小为40GB。
二、Windows
1. 创建 CPU 负载:这个 PowerShell 脚本将在后台启动一些循环,每个循环占用一个 CPU 核心。
$processorCount = (Get-WmiObject -class Win32_computerSystem).NumberOfLogicalProcessors
$minLoad = 0.35
$maxLoad = 0.45
$workerCount = [Math]::Round($processorCount * (Get-Random -Minimum $minLoad -Maximum $maxLoad))
for($i=0; $i -lt $workerCount; $i++)
{
Start-Job -ScriptBlock { while($true){} }
}
2. 创建内存负载:这个 PowerShell 脚本将在内存中创建一个大数组,从而占用内存。
$totalMemory = (Get-WmiObject -class Win32_ComputerSystem).TotalPhysicalMemory / 1MB $minLoad = 0.35 $maxLoad = 0.45 $memoryToUse = [Math]::Round($totalMemory * (Get-Random -Minimum $minLoad -Maximum $maxLoad)) $null = new-object byte[] $memoryToUse
3.磁盘负载
fsutil file createnew largefile 53687091200
fsutil 是工具的名称
file 指示我们正在操作文件
createnew 是操作的名称,它表示我们想要创建一个新文件
largefile 是你想要创建的新文件的名称
53687091200 是新文件的大小,单位是字节。
所以,这个命令的整体意思就是:在当前目录下创建一个新文件,名为 "largefile",大小为53687091200字节。 53687091200字节等于50GB,因为1GB等于1073741824字节,所以50GB等于53687091200字节。

浙公网安备 33010602011771号