这是一个使用Go语言编写的系统资源占用控制服务,可以动态调整内存和CPU使用量,确保服务器资源使用率不超过设定的目标值(内存和CPU默认均为70%)。
- 动态监控内存使用情况
- 根据目标使用率自动调整内存占用
- 动态监控CPU使用情况
- 根据目标使用率自动调整CPU占用
- 定期打印系统资源使用状态
- 支持启动和停止操作
- Go 1.16或更高版本
- 互联网连接(用于安装依赖包)
- 足够的系统权限(用于获取系统内存信息)
-
克隆或下载项目到本地
-
进入项目目录
cd project/memory-monitor- 初始化Go模块
go mod init github.com/yourusername/memory-monitor- 安装系统资源监控依赖
go get github.com/shirou/gopsutil/mem
go get github.com/shirou/gopsutil/cpu- 整理依赖关系
go mod tidy- 运行服务(使用默认配置)
go run main.go- 运行服务(指定目标内存使用率)
go run main.go --memory-target 0.6- 运行服务(启用日志输出)
go run main.go --enable-log- 运行服务(指定目标内存使用率并启用日志输出)
go run main.go --memory-target 0.6 --enable-log- 运行服务(指定CPU使用率)
go run main.go --cpu-target 0.6 --enable-log- 运行服务(同时指定内存和CPU使用率)
go run main.go --memory-target 0.7 --cpu-target 0.6 --enable-log- 构建程序
go build -o memory-monitor- 运行构建后的程序(使用默认配置)
./memory-monitor- 运行构建后的程序(指定目标内存使用率)
./memory-monitor --memory-target 0.8- 运行构建后的程序(启用日志输出)
./memory-monitor --enable-log- 运行构建后的程序(指定多个参数)
./memory-monitor --memory-target 0.75 --enable-log- 运行构建后的程序(指定CPU使用率)
./memory-monitor --cpu-target 0.7 --enable-log- 运行构建后的程序(同时指定内存和CPU使用率)
./memory-monitor --memory-target 0.7 --cpu-target 0.75 --enable-log- 查看可用的命令行参数
./memory-monitor -h# 构建程序
go build -o memory-monitor
```bash
# 运行程序,目标内存使用率80%,启用日志
./memory-monitor --memory-target 0.8 --enable-log
# 运行程序,目标CPU使用率70%,启用日志
./memory-monitor --cpu-target 0.7 --enable-log
# 运行程序,同时指定内存和CPU使用率,启用日志
./memory-monitor --memory-target 0.7 --cpu-target 0.7 --enable-log
# 后台运行程序(Linux/macOS)
./memory-monitor --memory-target 0.7 --enable-log > memory-monitor.log 2>&1 &
# 后台运行程序(Windows PowerShell)
Start-Process -NoNewWindow -FilePath .\memory-monitor -ArgumentList "--memory-target 0.7", "--enable-log" -RedirectStandardOutput "memory-monitor.log" -RedirectStandardError "memory-monitor-error.log"
5. 服务启动后,将自动监控系统资源使用情况:
- 每5秒检查一次系统内存使用状态
- 当系统内存使用率超过目标值时,自动释放所有占用的内存
- 当系统内存充足(使用率低于目标值-10%)时,适当占用少量内存(最多50MB)
- 持续监控CPU使用率,自动调整CPU工作协程的工作和休息时间比例
- 如果启用了日志,每10秒输出一次当前系统资源状态报告
6. 要停止服务,使用 `Ctrl+C` 键中断程序。
## 运行状态输出
当启用日志输出(使用`--enable-log`参数)时,程序会定期(每10秒)打印系统资源状态信息,格式如下:
内存状态 - 总量: 16384.00 MB, 已用: 12288.00 MB, 使用率: 75.00%, 目标使用率: 70.00% CPU状态 - 使用率: 65.00%, 目标使用率: 70.00%, 工作协程数: 4
## 配置选项
程序支持通过命令行参数进行配置:
- `--memory-target`: 目标内存使用率(0.0-1.0),默认值为0.7(70%)
- `--cpu-target`: 目标CPU使用率(0.0-1.0),默认值为0.7(70%)
- `--enable-log`: 启用日志输出,默认关闭
其他内部配置(在`main.go`文件中可以修改):
- `safetyMargin`: 安全边际,默认值为0.1(10%),用于计算安全模式的阈值(目标值-10%)
- `maxAllocatablePerStep`: 每次最大分配内存量,默认值为50MB
- `checkInterval`: 内存检查间隔,默认每5秒检查一次内存使用情况
- `reportInterval`: 状态打印间隔,默认每10秒打印一次内存状态(仅当日志启用时)
## 工作原理
### 核心功能
1. **系统级资源监控**:
- 使用 `gopsutil/mem` 库获取真实的系统级内存使用信息,包括总内存、已用内存和空闲内存
- 使用 `gopsutil/cpu` 库获取真实的系统级CPU使用率
2. **智能内存管理**:
- **安全模式**:当系统内存使用率低于60%(目标值70% - 安全边际10%)时,服务会适当占用少量内存(最多50MB或空闲内存的10%)
- **保护模式**:当系统内存使用率超过70%时,服务会立即释放所有自身占用的内存,为系统其他进程提供更多可用内存
- **平衡模式**:当系统内存使用率在60%-70%之间时,服务保持当前状态,避免频繁的内存分配和释放
3. **智能CPU管理**:
- 根据CPU核心数量创建相应数量的工作协程
- 动态调整每个工作协程的工作和休息时间比例,以维持系统CPU使用率接近目标值
- 通过执行CPU密集型计算来占用CPU资源,根据当前使用率自动调整
4. **实时监控与报告**:定期检查系统资源状态并输出详细日志,包括当前使用率、目标上限、资源调整操作等。
### 资源调整策略
#### 内存调整策略
| 系统内存使用率 | 服务行为 | 目的 |
|---------------|----------|------|
| < 目标值-10% | 适当占用少量内存(最多50MB) | 保持服务活跃,同时不影响系统性能 |
| 目标值-10% - 目标值 | 保持当前状态,不进行调整 | 避免频繁的内存操作,减少系统开销 |
| > 目标值 | 立即释放所有占用的内存 | 减轻系统内存压力,防止内存耗尽 |
#### CPU调整策略
| 系统CPU使用率 | 服务行为 | 目的 |
|--------------|----------|------|
| < 目标值 | 增加CPU工作时间比例,减少休息时间 | 提高CPU占用率以达到目标值 |
| >= 目标值 | 增加休息时间或保持休息 | 降低CPU占用率以不超过目标值 |
**注意:** 此程序的目的是控制整个系统的资源使用率不超过设定的目标值。程序会根据系统当前的资源使用情况,动态调整自身占用的资源量,以帮助维持系统资源使用率在目标水平附近。
## 注意事项
1. **系统保护优先**:此服务的首要目标是保护系统内存不超过安全阈值,而非消耗或管理特定进程的内存。
2. **资源使用**:在系统内存充足时,服务会占用少量内存(最多50MB),这是正常行为,目的是保持服务活跃并准备随时释放。
3. **监控频率**:默认每5秒检查一次系统内存状态,每10秒输出一次状态报告。这个频率可以根据需要在代码中调整。
4. **依赖说明**:服务依赖 `github.com/shirou/gopsutil/mem` 库获取系统内存信息,该库支持跨平台(Windows、Linux、macOS)。
5. **适用场景**:
- 生产服务器的内存监控和保护
- 资源受限环境下的系统稳定性维护
- 需要确保关键服务有足够内存运行的场景
- 防止内存泄漏导致系统崩溃的预防性措施
6. **跨平台支持**:
- 支持Windows、Linux(包括CentOS和Ubuntu)系统
- 可以编译为不同平台的可执行文件
- 使用`gopsutil/mem`和`gopsutil/cpu`库获取真实的系统级资源信息
## 许可证
本项目采用MIT许可证。