怎樣增大Linux 系統的open file(s)上限(轉)


上周因為調整了一個系統參數fs.nr_open,其中/etc/security/limits.conf設置的值大於fs.nr_open的值,導致服務器無法登錄,后來在網上查資料,於是轉載了這篇文章:

原文鏈接:http://www.chengweiyang.cn/2015/11/14/how-to-enlarge-linux-open-files-upper-cell/

最近在工作中遇到一個問題,嘗試直接將服務運行在高配(40core, 192GB;相比虛擬機來說) 的物理機上,但是發現服務打開的文件句柄達到 80 萬左右就不能再開更多了。

80 萬已經是一個不小的值了,通常情況下,Linux 默認的值都很小,例如:Debian 8(jessie) 給普通用戶設置的 open file(s) 限制為 65536, 可以通過下面的命令查看當前限制。

$ ulimit -n
$ ulimit -Sn
$ ulimit -Hn
ulimit 是一個 shell(這里使用的是 bash) 內置命令,可以通過 type ulimit 驗證。
-n 即表示查看或者設置 open file(s) 的限制,在 ulimit 中,每個限制都有兩種類型:

-S, soft limit, 軟限制,用戶可以上調軟限制到硬限制
-H, hard limit, 硬限制,非 root 用戶不能修改
如果沒有指明,則同時修改軟限制和硬限制。

修改 ulimit
修改分為臨時修改和永久修改,臨時修改只對當前 session 有效,登出和重啟后都恢復系統設置。

臨時修改使用 ulimit 命令,以修改 open file(s) 為例。

# ulimit -n 1024000
# ulimit -n
1024000
永久修改需要修改 /etc/security/limits.conf 或者在 /etc/security/limits.d/ 目錄下添加一個文件。具體格式參考 /etc/security/limits.conf,里面有詳細說明。

open file(s) 上限
回到遇到的問題中來:服務打開 80 萬個左右的文件句柄就不能再打開了。所以, 嘗試將 ulimit 設置為 1000 萬,結果提示出錯:

# ulimit -n 10000000
-bash: ulimit: open files: cannot modify limit: Operation not permitted
注意,使用的可以 root 用戶,居然沒有權限,然后嘗試降低到:

500 萬,依然錯誤
300 萬,依然錯誤
200 萬,依然錯誤
100 萬,成功了
顯然,這里有一個上限,大概在 100-200 萬之間。

所以,解決問題的辦法,在於怎樣提高這個上限!

通過一番搜索,發現 open file(s) kernel 級別有 2 個配置,分別是:

fs.nr_open,進程級別
fs.file-max,系統級別
fs.nr_open 默認設置的上限是 1048576,所以用戶的 open file(s) 不可能超過這個上限。

# sysctl -w fs.nr_open=10000000
# ulimit -n 10000000
# ulimit -n
10000000
修改后即可設置更大的 open file(s) 了。

同樣,對於 kernel 參數的修改,sysctl 命令修改的是當前運行時,如果需要永久修改, 則將配置添加到 /etc/sysctl.conf 中,例如:

# echo "fs.nr_open = 10000000" >> /etc/sysctl.conf
# echo "fs.file-max = 11000000" >> /etc/sysctl.conf
注意:fs.nr_open 總是應該小於等於 fs.file-max。

如果要查看當前打開的文件數,使用下面的命令:

# sysctl fs.file-nr
fs.file-nr = 1760       0       11000000
不過,增大這些值意味着能夠打開更多的文件(在 Linux 中,everything is file,包括 socket),但是同時也意味着消耗更多的資源,所以基本上在物理機上才會遇到這種問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM