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

 

posted @ 2023-07-31 00:42  自律™  阅读(286)  评论(0编辑  收藏  举报