当前位置: 首页 > news >正文

Linux 多用户服务器限制单用户最大内存使用(systemd user.slice)

在多用户共享服务器(特别是科研服务器)上,有时某个用户运行了内存泄漏的 Python 或深度学习程序,导致整台服务器内存被吃满,其他人无法 SSH 登录。
本文记录一种系统级的用户内存限制方案,让每个用户最多只能使用系统内存的某个比例(例如 90%)。


🧠 一、基本原理:systemd user.slice

在使用 systemd 的 Linux 系统中(Ubuntu 18.04+ / CentOS 7+),每个登录用户都会被分配到独立的 slice(cgroup 组)。
路径一般为:

/sys/fs/cgroup/user.slice/user-<UID>.slice/

systemd 支持通过配置文件或命令限制每个 slice 的资源,比如:

  • MemoryMax:最大可用内存;
  • CPUQuota:CPU 时间限制;
  • IOWeight:I/O 优先级。

这样可以在用户层面聚合限制所有进程的总内存使用量


⚙️ 二、配置步骤

1️⃣ 检查用户 slice 是否存在

先查看目标用户(如 hehf)的 slice 状态:

systemctl status user-$(id -u hehf).slice

示例输出:

○ user-1002.slice - User Slice of UID 1002Loaded: loadedDrop-In: /usr/lib/systemd/system/user-.slice.d└─10-defaults.confActive: inactive (dead)

说明该用户的 slice 存在,但当前没有活跃进程(inactive)。


2️⃣ 创建全局内存限制配置

创建 user-.slice.d 目录(注意中间有个 “-”):

sudo mkdir -p /etc/systemd/system/user-.slice.d/

然后编辑配置文件:

sudo nano /etc/systemd/system/user-.slice.d/90-memory.conf

写入以下内容(限制所有用户最多使用系统内存的 90%):

[Slice]
MemoryMax=90%

3️⃣ 重新加载 systemd 配置

sudo systemctl daemon-reexec
sudo systemctl daemon-reload

这样配置会自动应用到所有新启动的 user.slice


4️⃣ 验证配置是否加载

再次查看用户 slice:

systemctl status user-$(id -u hehf).slice

此时应看到新增的 drop-in:

Drop-In: /usr/lib/systemd/system/user-.slice.d└─10-defaults.conf/etc/systemd/system/user-.slice.d└─90-memory.conf

🧩 三、为什么是 inactive (dead)?

当输出中出现:

Active: inactive (dead)

说明该用户当前没有登录系统,也没有在后台运行进程。
只有当该用户登录系统或启动进程时,systemd 才会激活对应的 slice。

👉 解决方法:让目标用户登录一次,例如:

ssh hehf@<服务器IP>

登录后再查看:

systemctl status user-$(id -u hehf).slice

应该显示为:

● user-1002.slice - User Slice of UID 1002Active: active since Sun 2025-10-26 22:34:05 CST; 1min ago

🧪 四、验证内存限制是否生效

确认 cgroup 路径存在:

cat /sys/fs/cgroup/user.slice/user-$(id -u hehf).slice/memory.max

若返回类似:

96757023232

说明限制已生效(约 90GB ≈ 90% 内存)。


🧰 可选:为单个用户自定义上限

如果你希望为不同用户设置不同限制,例如:

sudo systemctl set-property user-hehf.slice MemoryMax=60G
sudo systemctl set-property user-ps.slice MemoryMax=100G

即可针对性配置。


⚡ 五、测试脚本(触发内存限制)

切换到目标用户:

sudo -u hehf bash

新建脚本 test_mem.py

# test_mem.py
a = []
while True:a.append(' ' * 10**7)

运行:

python3 test_mem.py

当用户占用超过 MemoryMax 限额后,systemd 会自动终止该进程:

Memory cgroup out of memory: Killed process 12345 (python3)

🪄 六、常见问题与注意事项

问题原因解决方案
user-xxxx.slice inactive用户未登录SSH 登录一次激活
/sys/fs/cgroup/.../memory.max 不存在cgroup 未挂载登录后自动生成
只对 root 无效root 无限制可单独配置 root.slice
内存限制无效未 reload systemd执行 systemctl daemon-reexec && systemctl daemon-reload

📜 七、参考命令备查

# 查看所有用户 slice
systemctl list-units --type=slice# 查看单用户 slice 状态
systemctl status user-$(id -u username).slice# 查看内存限制参数
systemctl show user-$(id -u username).slice | grep Memory# 手动设置限制
sudo systemctl set-property user-username.slice MemoryMax=60G

🧭 八、总结

功能命令 / 配置
全局限制所有用户内存上限/etc/systemd/system/user-.slice.d/90-memory.conf
按用户单独限制systemctl set-property user-USERNAME.slice MemoryMax=XXG
生效sudo systemctl daemon-reexec && sudo systemctl daemon-reload
验证`systemctl show user-$(id -u USERNAME).slice

最终效果

  • 每个普通用户最多只能使用系统总内存的 90%;
  • 超过限制自动被 systemd 杀掉,不会拖垮整个服务器;
  • 不影响 root 和系统服务。
http://www.dtcms.com/a/531822.html

相关文章:

  • 食品公司网站设计项目雨蝶直播免费直播
  • SQL 调试不再靠猜:Gudu SQL Omni 让血缘分析一键可视化
  • RV1126 NO.34:OPENCV的交叉编译和项目Makefile讲解
  • FreeRTOS---进阶知识4---通用链表
  • jvm逃逸问题的分析以及给出解决方案?
  • PHP 表单:深入浅出地掌握表单处理
  • Linux(Ubuntu)操作系统下文件的解压
  • HTTP 1.0版本的webserver自主实现
  • 【开题答辩全过程】以 基于微信小程序的个性化饮品定制点餐系统设计与实现为例,包含答辩的问题和答案
  • kotlin - 显示heic图片
  • 做网站域名是什么意思网站不备案会怎样
  • A2A+MCP构建智能体协作生态:下一代分布式人工智能架构解析
  • SpringBoot 的三类配置文件
  • 创造模式物品栏——多物品栏
  • Docker中部署多个ASP.NET Core实例
  • HarmonyOS生物识别认证深度解析:从指纹到人脸的安全实践
  • GitHub等平台形成的开源文化正在重塑加热d
  • C++新特性概览
  • dify 配置 deepseek Credentials validation failed with status code 402
  • 【自然语言处理】Transformer模型
  • 使用 RapidXML 实现 C++ 中的 XML 文件读取与生成,特别适合需要快速处理 XML 的场景
  • 基于Reactor模式的高性能C++仿Muduo库:Server服务器模块实现
  • 常州市网站建设设计公众号开发和小程序开发哪个简单
  • 【Android】DrawerLayout实现侧边导航栏
  • 缓存查询逻辑及问题解决
  • 襄阳网站seo公司江津网站建设口碑
  • 【中望3D 2025】配置【vs2022】开发环境
  • 基于定制开发开源AI智能名片S2B2C商城小程序的全方位种草模式研究
  • 实现Callable接口(了解即可)
  • 从入门到实操:贝叶斯分析完整技术步骤与核心R包指南