這陣子因為 NASA 課程需求需要用到 Jail 來限制資源,
本來想說用 rctl
來限制 Jail 的使用量,但卻發現沒有效果:
root@BSD:~ # rctl -a jail:myJail:maxproc:deny=10/jail
研究了好一陣子,才發現 iocage
建立的 Jail Name 竟然和 Hostname 不同,要使用 jls -v
來查出這個 Jail 的真正名字:
root@BSD:~ # 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 要這樣下才有用:
root@BSD:~ # rctl -a jail:ioc-myJail:maxproc:deny=10/jail
可以用 rctl -hu jail:ioc-myJail
來看所有的資源使用率,搭配 watch
指令可以很方便的監控(不過 Linux 的 watch
在 FreeBSD 叫做 cmdwatch
就是了,要另外裝):
root@BSD:~ # pkg install -y cmdwatch
root@BSD:~ # 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 的上限:
[root@BSD-Judge ~]# bash
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
^Cbash: fork: Interrupted system call
[root@BSD-Judge ~]#
問題解決了, 但現在也幾乎沒有人在使用 FreeBSD 了 XD