FreeBSD资源限制
多用户服务器上,一个测试脚本或后台任务就可能占用大量资源。FreeBSD的rctl可以按用户、进程、登录类或Jail设置资源规则,并动态调整限制。本教程使用独立测试账号,配置进程数量和虚拟内存限制,再验证规则与恢复步骤。
一、明确限制范围
本例使用以下参数:
- 测试账号:
rctldemo - 日常示例进程上限:20个
- 用户累计虚拟内存上限:512MB
- 持久化规则文件:
/etc/rctl.conf
512MB限制的是虚拟地址空间,不是物理内存占用。 vmemoryuse与表示常驻内存的memoryuse含义不同,不能互相替换。本文的额度仅供实验,不是生产环境建议值。
所有管理命令以root身份执行,并保留一个不受测试规则影响的root终端。
二、检查并启用资源统计
检查当前状态:
sysctl kern.racct.enable
如果值为1,继续后面的步骤。
如果值为0,编辑/boot/loader.conf,添加或调整为:
kern.racct.enable="1"
保存后安排重启,再次检查。该设置需要在启动阶段生效,不应只执行普通运行时修改就认为已经启用。
如果找不到该项或rctl提示不支持,应先确认当前内核是否包含相应功能,不要继续套用规则。
启用规则的开机加载:
sysrc rctl_enable="YES"
三、创建独立测试账号
先检查账号是否存在:
id rctldemo
如果不存在,创建账号:
pw useradd rctldemo -m -s /bin/sh -w no
这里不设置可用于密码登录的有效密码;root仍可通过su执行测试命令。不要将测试规则直接应用到数据库账号、网站服务账号或管理员账号。
验证执行身份:
su - rctldemo -c 'id'
四、添加资源限制
添加进程数量限制:
rctl -a user:rctldemo:maxproc:deny=20/user
添加虚拟内存限制:
rctl -a user:rctldemo:vmemoryuse:deny=512M/user
规则格式如下:
subject:subject-id:resource:action=amount/per
本例的user指定用户,deny表示拒绝超限的资源分配,末尾的/user表示按该用户累计计算,而不是每个进程各有512MB额度。规则调整会影响匹配的现有进程及后续进程。
五、检查规则与资源使用
查看测试用户的规则:
rctl user:rctldemo
查看资源使用量:
rctl -hu user:rctldemo
如需检查某个进程实际适用的规则,可将以下PID替换为真实值:
rctl -l process:1234
进程还可能受到所属用户、登录类或Jail的规则影响,因此只查看一条用户规则未必能解释全部限制。
六、验证进程数量限制
以下验证只在独立测试环境运行,确认rctldemo没有其他任务,并保留root终端。
先将该用户的进程上限临时调整为5:
rctl -r user:rctldemo:maxproc:deny=20/user
rctl -a user:rctldemo:maxproc:deny=5/user
然后执行一个有限次数的测试:
su - rctldemo -c '
for task_number in 1 2 3 4 5 6 7 8
do
sleep 15 &
done
wait
'
这段脚本最多尝试启动8个短时后台任务,不会无限创建进程。Shell自身也占用进程名额,因此能成功启动的sleep数量不一定等于限制值。达到限制时,预期会出现进程创建失败的提示;已启动任务会自行结束。
测试结束后,在root终端恢复:
rctl -r user:rctldemo:maxproc:deny=5/user
rctl -a user:rctldemo:maxproc:deny=20/user
不建议为了验证内存限制而在生产服务器执行大规模内存分配测试。先检查规则与实际资源用量,再在隔离环境中测试应用对分配失败的处理。
七、保存持久化规则
临时添加的规则需要写入/etc/rctl.conf才能在重启后加载。
如果文件已存在,先备份:
cp -p /etc/rctl.conf /root/rctl.conf.before-change
不存在时跳过备份。编辑文件并加入:
user:rctldemo:maxproc:deny=20/user
user:rctldemo:vmemoryuse:deny=512M/user
保留其他业务已有的规则,文件中只写规则本身,不写rctl -a命令。配合前面设置的rctl_enable="YES",系统启动时会加载这些配置。
本例已经通过命令添加了运行时规则,无需为了保存配置再重启整个rctl服务。停止或重启该服务可能先清除全部运行时规则,包括其他业务临时添加的限制。 修改单个用户时,优先定向增删对应规则。
八、修改和移除限制
如需将虚拟内存上限调整为1GB,先更新/etc/rctl.conf中的对应行,再更新运行时规则:
rctl -r user:rctldemo:vmemoryuse:deny=512M/user
rctl -a user:rctldemo:vmemoryuse:deny=1G/user
如果要撤销实验规则,同样需要同时删除配置文件中的条目和运行时规则。删除时核对实际额度,不要使用清空所有规则的操作处理单个账号。
九、常见问题
1. 修改规则后需要让用户重新登录吗?
使用rctl动态调整的规则可以影响匹配的现有进程,不需要依靠重新登录生效。不要将其与login.conf的登录时限制混为一谈。
2. 为什么重启后限制消失了?
先检查/etc/rctl.conf是否保存了规则,再检查rctl_enable和kern.racct.enable。临时命令、开机规则文件和启动设置需要分别确认。
3. 为什么不直接设置常驻内存硬限制?
本教程使用虚拟内存限制,便于明确分配边界。对memoryuse设置限制需要谨慎,其手册提示存在内存抖动风险;不应未经负载测试直接用于关键服务。
广告合作
QQ群号:4114653
- 本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。
- 本站原创内容未经允许不得转载,转载请注明出处“站长百科”和原文地址。