RustDesk Server系统资源限制:使用cgroups控制容器与服务资源占用

RustDesk Server系统资源限制:使用cgroups控制容器与服务资源占用

【免费下载链接】rustdesk-server RustDesk Server Program 【免费下载链接】rustdesk-server 项目地址: https://gitcode.com/gh_mirrors/ru/rustdesk-server

引言:失控的远程桌面服务器资源占用问题

你是否遇到过RustDesk Server在高并发场景下CPU占用率飙升至100%?或因内存泄漏导致服务器频繁OOM重启?作为一款开源远程桌面解决方案,RustDesk Server(包含hbbs信号服务器与hbbr中继服务器)在企业级部署中常面临资源争抢问题。本文将系统讲解如何通过Linux cgroups技术,为RustDesk Server构建多维度资源防护体系,确保300+并发连接下的服务稳定性。

读完本文你将掌握:

  • 基于cgroups v2的CPU/内存/IO资源限制实践
  • 容器化与原生服务两种部署模式的资源隔离方案
  • 资源监控告警与动态调整策略
  • 生产环境故障排查与优化案例

RustDesk Server资源消耗特征分析

核心组件资源占用模型

RustDesk Server由两个核心二进制程序构成:

  • hbbs(信号服务器):负责用户认证、设备注册与NAT穿透协调,CPU密集型,内存占用稳定
  • hbbr(中继服务器):处理P2P失败后的流量中继,网络IO密集型,内存随并发连接线性增长

通过分析src/main.rssrc/rendezvous_server.rs源码可知,默认配置下服务不设资源限制,可能导致:

  • 高峰期hbbr进程因大量中继连接耗尽系统内存
  • hbbs的事件循环线程占用过多CPU资源,影响其他服务

典型部署架构的资源挑战

mermaid

Linux cgroups v2基础与部署准备

核心概念与组件

Control Groups(控制组)是Linux内核提供的资源隔离机制,v2版本相比v1具有统一层次结构和更好的内存管理能力:

子系统功能关键文件
cpu限制CPU时间分配cpu.max、cpu.weight
memory控制内存使用量memory.max、memory.swap.max
io限制磁盘IO带宽io.max、io.weight
pids限制进程数量pids.max

环境检查与工具安装

# 检查内核支持情况
grep cgroup2 /proc/filesystems

# 安装cgroup管理工具
apt install -y systemd-container cgroup-tools

# 验证cgroups v2挂载状态
mount | grep cgroup2

原生服务部署的cgroups资源控制

系统服务配置改造

RustDesk官方提供的systemd服务文件(systemd/rustdesk-hbbs.servicesystemd/rustdesk-hbbr.service)未包含资源限制。通过以下改造实现基础隔离:

[Service]
# 基础CPU限制(最高占用1核)
CPUQuota=100%
# 内存硬限制(4GB)与软限制(2GB)
MemoryMax=4G
MemoryHigh=2G
# 进程数限制
TasksMax=512
# IO优先级设置(值越低优先级越高)
IOSchedulingClass=2
IOSchedulingPriority=7

高级cgroup配置(手动创建控制组)

对于更精细的控制,可手动创建cgroup层级:

# 创建RustDesk专用控制组
mkdir -p /sys/fs/cgroup/rustdesk/{hbbs,hbbr}

# 配置hbbs CPU限制(20%权重,周期100ms)
echo "20000 100000" > /sys/fs/cgroup/rustdesk/hbbs/cpu.max
# 配置hbbs内存限制(2GB)
echo "2G" > /sys/fs/cgroup/rustdesk/hbbs/memory.max

# 将服务进程加入控制组
echo $(pidof hbbs) > /sys/fs/cgroup/rustdesk/hbbs/cgroup.procs

Docker容器部署的资源隔离方案

docker-compose.yml资源限制配置

基于官方docker-compose.yml模板,添加资源限制参数:

services:
  hbbs:
    # ... 原有配置 ...
    deploy:
      resources:
        limits:
          cpus: '1.0'    # 限制1核CPU
          memory: 2G     # 内存硬限制
        reservations:
          cpus: '0.5'    # 保证0.5核CPU
          memory: 1G     # 内存软限制
    environment:
      - CGROUP_PARENT=/rustdesk/hbbs  # 指定cgroup父目录

  hbbr:
    # ... 原有配置 ...
    deploy:
      resources:
        limits:
          cpus: '2.0'    # 中继服务需要更多CPU
          memory: 4G
        reservations:
          cpus: '1.0'
          memory: 2G
    environment:
      - CGROUP_PARENT=/rustdesk/hbbr

容器IO限制与设备控制

services:
  hbbr:
    # ... 其他配置 ...
    devices:
      - /dev/net/tun:/dev/net/tun  # 仅暴露必要设备
    blkio_config:
      weight: 500  # 相对IO权重(默认500)
      device_read_bps:
        - path: /dev/sda
          rate: "100mb"  # 限制读速率

资源监控与动态调整策略

实时监控cgroup指标

# 监控hbbs CPU使用情况
watch -n1 cat /sys/fs/cgroup/rustdesk/hbbs/cpu.stat

# 监控hbbr内存使用
watch -n1 cat /sys/fs/cgroup/rustdesk/hbbr/memory.current

Prometheus + Grafana监控方案

# prometheus.yml配置片段
scrape_configs:
  - job_name: 'cgroups'
    static_configs:
      - targets: ['localhost:9255']
  - job_name: 'rustdesk'
    static_configs:
      - targets: ['localhost:21114']  # hbbs metrics端口

关键监控指标:

  • container_cpu_usage_seconds_total:CPU累计使用时间
  • container_memory_usage_bytes:内存当前使用量
  • rustdesk_hbbr_active_connections:当前中继连接数

动态调整脚本示例

#!/bin/bash
# 根据连接数动态调整hbbr内存限制

CONNS=$(curl -s http://localhost:21114/metrics | grep rustdesk_hbbr_active_connections | awk '{print $2}')
CGROUP_PATH="/sys/fs/cgroup/rustdesk/hbbr"

if [ $CONNS -gt 200 ]; then
  echo "4G" > $CGROUP_PATH/memory.max
elif [ $CONNS -lt 50 ]; then
  echo "2G" > $CGROUP_PATH/memory.max
fi

生产环境故障排查与优化案例

案例1:hbbr内存泄漏导致OOM

现象:hbbr进程定期OOM被kill,cgroup内存使用持续增长
排查

# 查看内存使用历史
grep -i 'out of memory' /var/log/syslog
# 分析cgroup内存统计
cat /sys/fs/cgroup/rustdesk/hbbr/memory.stat

解决方案

  1. 升级至最新版本(修复已知内存泄漏)
  2. 配置memory.swap.max=0禁用交换分区
  3. 设置memory.high=3G触发内核内存回收

案例2:CPU资源争抢导致连接延迟

优化配置

# hbbs cpu子系统配置
cpu.max=50000 100000  # 50% CPU时间
cpu.weight.nice=10    # 低优先级(值越大优先级越低)

# 配置CPU核心绑定
taskset -cp 2-3 $(pidof hbbr)  # 将hbbr绑定到2-3核

总结与最佳实践

推荐资源配置方案

部署模式组件CPU限制内存限制关键优化点
原生服务hbbs1核/50%权重2GBCPUQuota=100%
原生服务hbbr2核/75%权重4GB开启内存交换限制
Dockerhbbs1核2GB--cpuset-cpus=0
Dockerhbbr2核4GB--memory-swappiness=0

实施建议

  1. 渐进式限制:先宽松限制(如实际使用量120%),逐步收紧
  2. 监控先行:部署前收集一周基线数据,确定合理阈值
  3. 分层防御:同时使用cgroup限制与应用层配置(如src/main.rs中的rmem参数)
  4. 定期审计:每月审查资源使用趋势,调整限制策略

通过本文介绍的cgroups技术与配置方案,可有效解决RustDesk Server在高并发场景下的资源失控问题。建议结合业务实际负载,构建弹性资源管理体系,在稳定性与资源利用率间取得平衡。

【免费下载链接】rustdesk-server RustDesk Server Program 【免费下载链接】rustdesk-server 项目地址: https://gitcode.com/gh_mirrors/ru/rustdesk-server

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值