前言
本文不讨论云平台相关要求以及本文所介绍的处理方式的合理性,只提供处理相关问题的一种思路。
资源占用要求
2024年12月,某地政务云的要求如下:
资源占用审计时间:
从服务器资源交付日起,20 个工作日后。
资源占用审计要求:
- 磁盘需挂载,并且存储空间占用需超过 50%。
- CPU 占用率峰值需超过 50%。
- 内存 占用率峰值需超过 50%。
磁盘占用
Linux
fallocate
是一个用于预分配文件空间的命令行工具,它可以在支持的文件系统上创建指定大小的文件,并且在文件中预留实际磁盘空间。
# 创建一个指定大小的文件
fallocate -l 100G /data/空间占用_可删除
# 删除文件即可释放磁盘空间
# rm /data/空间占用_可删除
Windows
使用 PowerShell
创建特定大小的文件。
$filePath = "E:\空间占用_可删除"
$sizeInBytes = 100GB
$stream = [System.IO.File]::Create($filePath)
try {
$stream.SetLength($sizeInBytes)
} finally {
$stream.Close()
}
内存占用
本文中,通过 JAVA 程序来实现内存和 CPU 资源的占用。通过 JVM -Xms512m -Xmx512m
参数设置初始堆内存和最大堆内存,以达到内存占用的目的。
CPU占用
JAVA 编写 CPU 资源占用程序的主要逻辑如下(实现思路不是很严谨,但能达到目的,仅作参考!):
- 通过创建一定数量的 JAVA 线程执行计算任务来提高CPU 的使用率。JAVA 线程数占CPU 线程数的比例可粗略理解为 CPU的大致使用率上限(实际会有出入,只做参考)。比如我们的目标是CPU 使用率峰值达到 50%,那么启用的 JAVA线程数与CPU 线程数的比例可以是 0.5,为了更容易达到,可以设置成 0.6。
- 通过控制 JAVA 线程执行计算任务的随机休息时间或随机计算持续时间,可以实现 CPU 使用率的浮动效果。
- 通过划分高负载和低负载时段,减轻资源的过度浪费以及对服务器上其他程序的影响。
核心代码参考如下:
import lombok.extern.slf4j.Slf4j;
import java.security.SecureRandom;
import java.time.LocalTime;
/**
* cpu 资源消费者
*/
@Slf4j
public class CpuResourceConsumer {
private static long THREAD_COMPOTE_TIME = 2000; // 每个Java线程连续执行计算的时间(毫秒)
private static int THREAD_SLEEP_RANDOM_RANGE = 100;// 线程随机休眠时间(秒)
private static int THREAD_SLEEP_RANDOM_RANGE_HIGH = 30;
private static LocalTime HIGH_USAGE_START = LocalTime.parse("14:30"); // 高负载开始时间
private static LocalTime HIGH_USAGE_END =