ulimit 可以限制程序的資源使用量。在設定 ulimit 之後,如何驗證各個資源限制是有效的?如何檢視每個程序當前使用了多少資源?本文將嘗試對多個設定值進行演示。
ulimit 的設定,是 per-user 的還是 per-process 的?
我們從 ulimit 中看到的設定值,都是 per-process 的。也就是說,每個程序有自己的 limits 值。
ulimit, limits.conf 和 pam_limits 的關係?
首先,limit的設定值是 per-process 的。在 Linux 中,每個普通程序可以呼叫 getrlimit() 來檢視自己的
limits,也可以呼叫 setrlimit() 來改變自身的 soft limits。 而要改變 hard limit, 則需要程序有
CAP_SYS_RESOURCE 許可權。另外,程序 fork() 出來的子程序,會繼承父程序的 limits 設定。具體可參考
getrlimit/setrlimit/prlimit 的手冊。
`ulimit` 是 shell 的內建命令。在執行`ulimit`命令時,其實是 shell 自身呼叫
getrlimit()/setrlimit() 來獲取/改變自身的 limits. 當我們在 shell
中執行應用程式時,相應的程序就會繼承當前 shell 的 limits 設定。
那麼一個 shell 的初始 limits 是誰設定的? 通常是 pam_limits 設定的。顧名思義,pam_limits 是一個 PAM
模組,使用者登入後,pam_limits 會給使用者的 shell 設定在 limits.conf 定義的值。我們可以開啟 pam_limits 的
debug 來檢視大致過程:
在 limits.conf 中,對 test 使用者設定 memlock 的 hard limit 為 102410. 當用戶透過 SSH 登入後,可以看到 pam_limits 為該會話設定了 memlock=102410.
所以,ulimit, limits.conf 和 pam_limits 的關係,大致是這樣的:
1. 使用者進行登入,觸發 pam_limits;
2. pam_limits 讀取 limits.conf,相應地設定使用者所獲得的 shell 的 limits;
3. 使用者在 shell 中,可以透過 ulimit 命令,檢視或者修改當前 shell 的 limits;
4. 當用戶在 shell 中執行程式時,該程式程序會繼承 shell 的 limits 值。於是,limits 在程序中生效了。
如何檢視某個程序的 limits,以及當前使用量?
程序自己可以透過 getrlimit()/prlimit() 來獲得當前 limits 設定值。系統管理員可以透過 /proc//limits 來檢視某個程序的 limits 設定值。
要檢視某個程序的資源使用量,通常可以透過 /proc//stat 和 /proc//status 來檢視。具體某個值的含義,可以參考 proc 的手冊。
另外,程序自己也可以呼叫 getrusage() 獲知自身的資源使用量。
ulimit 可以限制程序的資源使用量。在設定 ulimit 之後,如何驗證各個資源限制是有效的?如何檢視每個程序當前使用了多少資源?本文將嘗試對多個設定值進行演示。
ulimit 的設定,是 per-user 的還是 per-process 的?
我們從 ulimit 中看到的設定值,都是 per-process 的。也就是說,每個程序有自己的 limits 值。
ulimit, limits.conf 和 pam_limits 的關係?
首先,limit的設定值是 per-process 的。在 Linux 中,每個普通程序可以呼叫 getrlimit() 來檢視自己的
limits,也可以呼叫 setrlimit() 來改變自身的 soft limits。 而要改變 hard limit, 則需要程序有
CAP_SYS_RESOURCE 許可權。另外,程序 fork() 出來的子程序,會繼承父程序的 limits 設定。具體可參考
getrlimit/setrlimit/prlimit 的手冊。
`ulimit` 是 shell 的內建命令。在執行`ulimit`命令時,其實是 shell 自身呼叫
getrlimit()/setrlimit() 來獲取/改變自身的 limits. 當我們在 shell
中執行應用程式時,相應的程序就會繼承當前 shell 的 limits 設定。
那麼一個 shell 的初始 limits 是誰設定的? 通常是 pam_limits 設定的。顧名思義,pam_limits 是一個 PAM
模組,使用者登入後,pam_limits 會給使用者的 shell 設定在 limits.conf 定義的值。我們可以開啟 pam_limits 的
debug 來檢視大致過程:
在 limits.conf 中,對 test 使用者設定 memlock 的 hard limit 為 102410. 當用戶透過 SSH 登入後,可以看到 pam_limits 為該會話設定了 memlock=102410.
所以,ulimit, limits.conf 和 pam_limits 的關係,大致是這樣的:
1. 使用者進行登入,觸發 pam_limits;
2. pam_limits 讀取 limits.conf,相應地設定使用者所獲得的 shell 的 limits;
3. 使用者在 shell 中,可以透過 ulimit 命令,檢視或者修改當前 shell 的 limits;
4. 當用戶在 shell 中執行程式時,該程式程序會繼承 shell 的 limits 值。於是,limits 在程序中生效了。
如何檢視某個程序的 limits,以及當前使用量?
程序自己可以透過 getrlimit()/prlimit() 來獲得當前 limits 設定值。系統管理員可以透過 /proc//limits 來檢視某個程序的 limits 設定值。
要檢視某個程序的資源使用量,通常可以透過 /proc//stat 和 /proc//status 來檢視。具體某個值的含義,可以參考 proc 的手冊。
另外,程序自己也可以呼叫 getrusage() 獲知自身的資源使用量。