回覆列表
  • 1 # 使用者9101195118007

    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() 獲知自身的資源使用量。

  • 中秋節和大豐收的關聯?
  • 武警部隊士兵報考幹部學校和士官學校是不是不一起考啊?