# Linux 系统资源动态调整脚本提示词
> **适用环境**:yum(CentOS 8+ 应用 dnf)。文中命令按当时环境记录,新系统上请对照官方文档调整。
## 概述
此脚本用于动态调整 Linux 系统的 CPU、内存和磁盘利用率,确保资源使用维持在设定的达标范围内。脚本会定期检测系统资源,并根据检测结果自动调整资源使用情况,同时输出详细的日志记录。
## 功能需求
1. 资源检测 :检测当前系统的 CPU、内存和磁盘利用率。
2. 达标条件判断 :
- 达标条件 1:(15% ≤ CPU 平均利用率 ≤ 30% 或 35% ≤ 内存平均利用率 ≤ 70%)且 40% ≤ 存储平均利用率 ≤ 80%。
- 达标条件 2:若 CPU/内存一个指标达标另一个不达标,则不达标指标需满足:
- CPU:峰值利用率 ≥ 30% 或当前内存规格下已是最小 CPU 规格。
- 内存:峰值利用率 ≥ 70% 或当前 CPU 规格下已是最小内存规格。
3. 资源动态调整 :
- 如果 CPU 利用率低于 15%,自动增加系统负载以提高 CPU 使用率。
- 如果 CPU 利用率高于 30%,适当减少系统负载。
- 如果内存利用率低于 35%,增加内存使用量。
- 如果内存利用率高于 70%,释放部分内存。
- 如果存储利用率不在 40% - 80% 范围内,相应调整使用量。
4. 调整方法 :
- 通过生成适量的系统负载来提高 CPU 使用率。
- 通过分配/释放内存来调整内存使用率。
- 通过创建/删除临时文件来调整磁盘使用率。
5. 日志记录 :每次检测和调整后,输出清晰的日志,记录当前资源使用情况和采取的调整措施。
6. 自动化执行 :脚本应定期循环执行以持续维持资源在达标范围内。
yum install python3-pip python3 python3-devel -y
pip3 install psutil -i https://mirrors.aliyun.com/pypi/simple/
# python3 resource_adjustment.py
import psutil
import time
import logging
import tempfile
import os
import multiprocessing
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('resource_adjustment.log'),
logging.StreamHandler()
]
)
# 全局变量,用于存储临时文件路径
temp_files = []
# 全局变量,用于存储占用内存的对象
memory_objects = []
def get_cpu_usage():
return psutil.cpu_percent(interval=1)
def get_memory_usage():
memory = psutil.virtual_memory()
return memory.percent
def get_disk_usage():
# 修改为Linux磁盘路径
disk = psutil.disk_usage('/')
return disk.percent
def increase_cpu_load():
# 生成适量的系统负载以提高CPU使用率
import multiprocessing
import math
def stress_cpu():
# 执行一些计算任务,而不是死循环
for _ in range(1000000):
math.sqrt(256)
processes = []
# 可以根据需要调整进程数量
num_processes = multiprocessing.cpu_count() // 2
for _ in range(num_processes):
p = multiprocessing.Process(target=stress_cpu)
p.start()
processes.append(p)
for p in processes:
p.join()
logging.info("已增加CPU负载")
def decrease_cpu_load():
# 适当减少系统负载,这里简单记录日志
logging.info("已减少CPU负载")
def increase_memory_usage():
# 分配内存以提高内存使用率
global memory_objects
try:
# 创建一个大的列表来占用内存
large_list = [0] * (100 * 1024 * 1024 // 8) # 占用约100MB内存
memory_objects.append(large_list)
logging.info("已增加内存使用量")
except Exception as e:
logging.error(f"增加内存使用量时出错: {e}")
def release_memory():
# 释放部分内存
global memory_objects
if memory_objects:
memory_objects.pop()
import gc
gc.collect() # 强制垃圾回收
logging.info("已释放部分内存")
else:
logging.info("没有可释放的内存")
def increase_disk_usage():
# 创建临时文件以提高磁盘使用率
try:
temp_file = tempfile.NamedTemporaryFile(delete=False)
temp_files.append(temp_file.name)
# 写入100MB数据
temp_file.write(b'0' * 100 * 1024 * 1024)
temp_file.close()
logging.info("已增加磁盘使用量")
except Exception as e:
logging.error(f"增加磁盘使用量时出错: {e}")
def decrease_disk_usage():
# 删除临时文件以降低磁盘使用率
global temp_files
if temp_files:
file_to_delete = temp_files.pop()
try:
os.remove(file_to_delete)
logging.info("已减少磁盘使用量")
except Exception as e:
logging.error(f"减少磁盘使用量时出错: {e}")
else:
logging.info("没有可删除的临时文件")
def check_resource_usage():
cpu_usage = get_cpu_usage()
memory_usage = get_memory_usage()
disk_usage = get_disk_usage()
# 达标条件判断
condition1 = ((15 <= cpu_usage <= 30 or 35 <= memory_usage <= 70) and 40 <= disk_usage <= 80)
if not condition1:
logging.info(f"当前CPU利用率: {cpu_usage}%")
logging.info(f"当前内存利用率: {memory_usage}%")
logging.info(f"当前磁盘利用率: {disk_usage}%")
else:
logging.debug(f"资源使用满足要求,当前CPU利用率: {cpu_usage}%,内存利用率: {memory_usage}%,磁盘利用率: {disk_usage}%")
# 更激进的CPU调整逻辑
if cpu_usage < 15:
# 接近下限,增加更多进程
num_processes = multiprocessing.cpu_count()
logging.info(f"即将通过 {num_processes} 个进程增加CPU负载")
increase_cpu_load()
elif cpu_usage > 30 and not condition1:
decrease_cpu_load()
elif 15 <= cpu_usage < 20: # 接近下限,适当增加负载
num_processes = multiprocessing.cpu_count() * 3 // 4
logging.info(f"即将通过 {num_processes} 个进程增加CPU负载")
increase_cpu_load()
elif 25 < cpu_usage <= 30: # 接近上限,适当减少负载
decrease_cpu_load()
# 更激进的内存调整逻辑
if memory_usage < 35:
# 接近下限,增加更多内存
memory_size = 200 # 单位:MB
logging.info(f"即将增加 {memory_size}MB 内存使用量")
increase_memory_usage()
elif memory_usage > 70 and not condition1:
release_memory()
elif 35 <= memory_usage < 40: # 接近下限,适当增加内存
memory_size = 150 # 单位:MB
logging.info(f"即将增加 {memory_size}MB 内存使用量")
increase_memory_usage()
elif 65 < memory_usage <= 70: # 接近上限,适当释放内存
release_memory()
# 更激进的磁盘调整逻辑
if disk_usage < 40:
# 接近下限,创建更大的临时文件
# 可以修改写入的数据量,这里翻倍
try:
temp_file = tempfile.NamedTemporaryFile(delete=False)
temp_files.append(temp_file.name)
temp_file.write(b'0' * 200 * 1024 * 1024) # 写入200MB数据
temp_file.close()
logging.info("已增加磁盘使用量")
except Exception as e:
logging.error(f"增加磁盘使用量时出错: {e}")
elif disk_usage > 80:
decrease_disk_usage()
elif 40 <= disk_usage < 45: # 接近下限,适当增加磁盘使用量
increase_disk_usage()
elif 75 < disk_usage <= 80: # 接近上限,适当减少磁盘使用量
decrease_disk_usage()
if __name__ == "__main__":
while True:
check_resource_usage()
time.sleep(5) # 每5s执行一次
echo "[Unit]
Description=Resource Adjustment Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/resource_adjustment.py
WorkingDirectory=/opt
Restart=always
User=root
[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/resource_adjustment.service
systemctl daemon-reload
systemctl start resource_adjustment.service
systemctl status resource_adjustment.service