服务器CPU、内存和磁盘占用脚本

一、Linux

以下是一个简单的 C 程序,它会申请一定量的内存并一直持有它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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 编译它:

1
gcc -o mem mem.c

  然后创建一个test.sh脚本文件,创建 CPU 、内存负载,下面是脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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

  运行:

1
nohup bash test.sh &

  磁盘负载:

1
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 核心。

1
2
3
4
5
6
7
8
9
10
$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 脚本将在内存中创建一个大数组,从而占用内存。

1
2
3
4
5
6
$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.磁盘负载

1
fsutil file createnew largefile 53687091200

fsutil 是工具的名称
file 指示我们正在操作文件
createnew 是操作的名称,它表示我们想要创建一个新文件
largefile 是你想要创建的新文件的名称
53687091200 是新文件的大小,单位是字节。
所以,这个命令的整体意思就是:在当前目录下创建一个新文件,名为 "largefile",大小为53687091200字节。 53687091200字节等于50GB,因为1GB等于1073741824字节,所以50GB等于53687091200字节。

 

posted @   自律™  阅读(726)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示