Linux

ulimit 文件描述符限制不適用於特定程序

  • November 5, 2014

我最近檢查了我們的一個 redis 程序,以了解應用了哪些 ulimit:

cat /proc/<redis-pid>/limits

並且驚訝地得知這是在低預設值:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

我很驚訝,因為我們配置了以下內容:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

誰能告訴我為什麼增加的 ulimit 沒有應用於正在執行的 redis 程序?

redis 程序以使用者“redis”執行,由於限制增加,伺服器已重新啟動。我們在 Debian Squeeze 上。

在 Linux 中,可以根據需求類型在不同位置設置資源限制。

  1. /etc/security/limits.conf文件。
  2. /etc/sysctl.conf文件。
  3. ulimit命令

/etc/security/limits.confpam_limits的一部分,因此在此文件中設置的限制由 pam_limits 模組在登錄會話期間讀取。登錄會話可以是 byssh或 through terminal。並且 pam_limits 不會影響這裡提到的守護程序。

/etc/sysctl.conf是系統範圍的全域配置,我們不能在這裡設置使用者特定的配置。它設置了所有使用者/程序可以使用的最大資源量。

ulimit命令用於設置 shell 的限制。因此,當在 shell 上設置限制時,由於繼承屬性ulimit的規則,從 shell 產生的程序也會獲得該值。child process``parent processes

因此,對於您的情況,由於作為上述任何內容的redis一部分開始,init都不會直接幫助您。這樣做的正確方法是,您必須使用ulimit命令在 init 腳本本身中設置新值。就像下面的腳本一樣,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

願望清單中已經有一個錯誤可以添加ulimitstart-stop-daemon .

redis如果有任何提供限制的方法,還要檢查配置。

引用自:https://serverfault.com/questions/641899