服务器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字节。