這裡介紹如何在 Linux 系統上管控一般使用者可開啟的行程數量上限值,以及更改設定值的方法。
Linux 系統本身提供了相當豐富的資源控管機制,管理者可以藉由這些功能來精準地將系統資源分配給不同的使用者,並且改善系統的運作效率,而一般的使用者也可以使用這樣的機制來管理程式使用的系統資源。
Linux 系統上的使用者若要限制自己程式可開啟的行程數量,可以使用 ulimit
指令,它是 shell 中用來管控系統資源的指令,在更改設定之前,我們可以先查詢一下目前使用者可開啟的行程數量上限:
ulimit -u
31368
這個輸出表示最大可開啟的行程數量為 31368
個,這個數值可以直接使用 ulimit
來更改:
ulimit -u 2048 ulimit -u
2048
對於一般使用者而言,使用 ulimit
所設定的限制條件有一定的範圍,它只對所在的 shell 行程以及該 shell 所衍生的子行程有效,該使用者其他的 shell 行程不會受影響,也不會影像系統上其他的行程。
雖然 ulimit
的限制條件在不同的 shell 中是獨立的,但是 ulimit
計算行程數目的方式卻是以整個系統中該使用者所有的行程為準,因此不同的行程之間還是會互相影響,以下我們用一個簡單的範例來解釋。
假設有一個使用者有兩個不同的程式,分別使用兩個 shell 指令稿包起來,在指令稿的開頭設定程式可開啟的行程數目上限,分開控管兩個不同的程式。第一個程式的指令稿為:
#!/bin/bash # 這是第一個程式 # 設定可以開啟的行程數目上限為 512 ulimit -u 512 # 執行其他指令 ...
而第二個程式的指令稿為:
#!/bin/bash # 這是第二個程式 # 設定可以開啟的行程數目上限為 2048 ulimit -u 2048 # 執行比較複雜的指令 ...
假設在準備執行這兩個程式時,該使用者在系統上已經執行了 200
個行程,那麼這時候若執行第一個程式的指令稿,則第一個指令稿與其衍生的程式最多只能開啟 312
個行程(也就是 512
扣掉原本系統上的 200
),同樣地若這時候執行第二個指令稿,它就可以開啟 1848
個行程。
請注意 ulimit
是依照整個系統上所有該使用者的行程來計算的,假如這兩個指令稿各都需要開啟 300
的行程,若同時執行的話就會多出 600
個行程,第一個程式就會超出其 ulimit
所制定的限制,而只有第二個程式可以正常執行。
對於 Linux 系統的管理者來說,控管整個系統資源、防止系統超載也是很重要的事情,而整個系統的 ulimit
設定都寫在 /etc/security/limits.conf
這個設定檔中,以下是一些範例:
#<domain> <type> <item> <value> @student hard nproc 20 @faculty soft nproc 20 @faculty hard nproc 50 ftp hard nproc 0
第一個 domain
欄位可以放使用者的帳號或群組,第二個 type
欄位可以放 soft
(軟性限制條件,可變更)或 hard
(硬性限制條件,不可變更),item
則填入 nproc
(行程數目),而最後的 value
則是要指定的行程數目上限數值。
以第一行的設定來說,就是設定 student
群組使用者的可開啟行程數目上限數值為 20
,而第四行則是設定 ftp
這個使用者不可以執行任何程式。
ulimit
限制如果要查詢系統上某個執行中程式的可開啟行程數目上限數值,可以執行 /proc/PID/limits
來查詢,其中 PID
就是程式的行程 ID,例如:
cat /proc/6791/limits
Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 31368 31368 processes Max open files 65536 65536 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 31368 31368 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
其中的 Max processes
就是可開啟行程的上限數量。