查詢與設定 Linux 使用者可開啟的行程數量上限值,限制開啟程式的數目

這裡介紹如何在 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 管理者

對於 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 就是可開啟行程的上限數量。

參考資料:IBM Developer WorksTecmintRed Hat鳥哥的 Linux 私房菜

Linux

1 Comment

  1. LEE

    多謝了,這篇文章對我幫助良多

Leave a Reply to 取消回覆