[MD]
# ServerGuard — BDS 内存优化插件
> 让你的基岩版服务器内存占用稳定、不膨胀。
---
## 为什么需要优化?
BDS 在 Linux 上使用 glibc 的 ptmalloc2 内存分配器。它有一个致命问题:**内存只涨不降**。
玩家进出 → 区块加载/卸载 → 大量内存分配和释放 → glibc 把空闲内存留在 arena 里不还给操作系统 → RSS 持续增长 → 服务器越来越卡。
这不是 BDS 的 bug,是 glibc malloc 的设计缺陷。MySQL、Redis 都踩过同样的坑,它们的解决方案都是换分配器。
---
## 优化方案
### 一、替换内存分配器
用 **jemalloc** 替换 glibc malloc。jemalloc 是 Redis、Firefox、Facebook 的默认分配器,核心优势是**后台线程自动回收空闲内存**。
```bash
# 安装
sudo apt install libjemalloc2
# 启动 BDS 时加载 jemalloc
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 \
MALLOC_CONF="background_thread:true,dirty_decay_ms:30000,muzzy_decay_ms:30000" \
./bedrock_server
```
### 二、配置优化
```properties
# 降低视距,减少 90% 区块内存
view-distance=10
# 提高压缩阈值,降低 CPU 开销
compression-threshold=256
```
### 三、安装 ServerGuard 插件
负责运行时监控和主动内存回收(见下文)。
---
## 实测效果
> 测试环境:Ubuntu 24.04 / 8 核 / 14GB / BDS 1.26.44 / 20 个模拟玩家 / view-distance=20
| 指标 | glibc(默认) | jemalloc | 改善 |
|:----:|:------------:|:--------:|:----:|
| 虚拟内存 | 1,471 MB | 679 MB | **↓ 54%** |
| 峰值后回落 | ❌ 不下降 | ✅ 自动回落 | ✅ |
| 长期趋势 | 持续增长 | 稳定 | ✅ |
jemalloc 在玩家加载区块时内存达到峰值,随后**后台线程自动回收**,RSS 逐步回落并稳定。glibc 达到峰值后**再也不下降**。
---
## ServerGuard 插件
### 功能
| 功能 | 说明 |
|------|------|
| 📊 内存监控 | 每 30 秒记录 RSS / 虚拟内存 / TPS / MSPT 到日志文件 |
| ♻️ 主动回收 | 每 2 分钟调用 `malloc_trim(0)`,归还空闲内存给操作系统 |
| 👋 玩家离开回收 | 玩家退出后延迟 30 秒触发内存回收 |
| ⚠️ TPS 告警 | TPS 低于 15 时控制台输出警告 |
| 🔴 内存告警 | RSS 超过阈值时控制台输出警告 |
| 📈 性能日志 | CSV 格式记录,方便绘制趋势图 |
### 安装
```bash
# 将 .whl 文件放入 plugins 目录
cp endstone_server_guard-*.whl /path/to/bedrock_server/plugins/
# 重启服务器
```
### 日志位置
```
plugins/server_guard/logs/
├── serverguard.log # 监控日志
└── performance.csv # 性能数据(CSV)
```
### 控制台策略
正常运行时控制台**完全静默**,所有数据写入文件。只有以下情况才输出到控制台:
- 🔴 RSS 超过 2GB → `[Memory WARNING]`
- 🔴 RSS 超过 3GB → `[Memory CRITICAL]`
- 🟡 TPS 低于 15 → `[TPS LOW]`
- 🟢 malloc_trim 回收显著 → `[Trim] 350MB → 280MB`
---
## 完整部署
```bash
# 1. 安装 jemalloc
sudo apt install libjemalloc2
# 2. 创建启动脚本
cat > start.sh << 'EOF'
#!/bin/bash
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
export MALLOC_CONF="background_thread:true,dirty_decay_ms:30000,muzzy_decay_ms:30000"
cd "$(dirname "$0")"
./bedrock_server
EOF
chmod +x start.sh
# 3. 安装 EndStone(可选,用于加载插件)
pip install endstone
# 4. 安装 ServerGuard 插件
cp endstone_server_guard-*.whl plugins/
# 5. 修改配置
sed -i 's/view-distance=.*/view-distance=10/' server.properties
sed -i 's/compression-threshold=.*/compression-threshold=256/' server.properties
# 6. 启动
./start.sh
```
---
## FAQ
**Q: 内存回收会影响玩家游玩吗?**
不会。回收的是已经释放、没人使用的空闲内存,不触碰正在使用的数据。回收操作是微秒级的 `madvise` 系统调用,不暂停游戏。
**Q: Windows 上能用吗?**
jemalloc 方案仅支持 Linux。Windows 可用 mimalloc DLL 注入替代,后续支持。
---
*ServerGuard v1.0.0 · 基于 EndStone 0.11 · 适配 BDS 1.26.44*
[/MD]