限制 FreeBSD 之 Jail 資源


這陣子因為 NASA 課程需求需要用到 Jail 來限制資源,

本來想說用 rctl 來限制 Jail 的使用量,但卻發現沒有效果:

[email protected]:~ # rctl -a jail:myJail:maxproc:deny=10/jail 

研究了好一陣子,才發現 iocage 建立的 Jail Name 竟然和 Hostname 不同,要使用 jls -v 來查出這個 Jail 的真正名字:

[email protected]:~ # jls -v
   JID  Hostname                      Path
        Name                          State
        CPUSetID
        IP Address(es)
     1  myJail                     /zroot/iocage/jails/myJail/root
        ioc-muJail                 ACTIVE
        2
        192.168.1.10

所以這個 Jail 的真正名字是 ioc-myJail,rctl 要這樣下才有用:

[email protected]:~ # rctl -a jail:ioc-myJail:maxproc:deny=10/jail

可以用 rctl -hu jail:ioc-myJail 來看所有的資源使用率,搭配 watch 指令可以很方便的監控(不過 Linux 的 watch 在 FreeBSD 叫做 cmdwatch 就是了,要另外裝):

[email protected]:~ # pkg install -y cmdwatch
[email protected]:~ # cmdwatch rctl -hu jail:ioc-myJail

監控結果(每 2 秒更新一次):

Every 2s: rctl -hu jail:ioc-myJail    Fri Oct  9 23:52:45 2020

cputime=2
datasize=628K
stacksize=0
coredumpsize=0
memoryuse=37M
memorylocked=0
maxproc=10
openfiles=1696
vmemoryuse=124M
pseudoterminals=0
swapuse=48M
nthr=10
msgqqueued=0
msgqsize=0
nmsgq=0
nsem=0
nsemop=0
nshm=0
shmsize=0
wallclock=14K
pcpu=0
readbps=0
writebps=0
readiops=0
writeiops=0

測試戳看看 10 個 process 的上限:

[[email protected] ~]# bash
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
^Cbash: fork: Interrupted system call

[[email protected] ~]#

問題解決了, 但現在也幾乎沒有人在使用 FreeBSD 了 XD


See also