1. 概述
在使用 Linux 伺服器部署 FineBI 時,有時會出現報錯開啟的檔案過多或者too many open files,如下圖所示:
此問題是因為 Linux 系統本身預設系統應用最大開啟的檔案數為 1024,BI 執行時會讀取儲存在本地的資料,有些情況 BI 開啟的檔案數會超過這個限制,因此需要手動改掉linux系統的最大開啟檔案數。該修改在不同情況下會涉及到3個關鍵值。
2. 參數說明
2.1 相關參數說明
1)nofile
nofile 值是指單進程的最大開啟檔案數。
2)nr_open
該值是指單個進程可分配的最大檔案數,通常預設值為1024*1024=1048576;
3)file-max
該值是系統核心一共可以開啟的最大值,預設值是185745;
2.2 修改策略
一般情況下,nofile 的值不允許超過 nr_open 和 file-max 的值。因此在修改 nofile 時要考慮是否超過以上兩個值的情況:
當要修改的「nofile」值(最大開啟檔案數)未超過「nr_open」和「file-max」兩個值時,直接修改「nofile」值即可;
當要修改的「nofile」值(最大開啟檔案數)超過「nr_open」和「file-max」兩個值時,不僅要修改「nofile」的值,還要修改「nr_open」和「file-max」的值滿足「大於nofile」值。
3. 修改方法
3.1 查看相關參數大小
查看修改前參數的大小,如下圖所示:
命令如下所示:
cat /proc/sys/fs/nr_open
cat /proc/sys/fs/file-max
ulimit -n
3.2 修改 limit 中 nofile 值
當要修改的「nofile」值(最大開啟檔案數)未超過「nr_open」和「file-max」兩個值時,直接修改「nofile」值即可。
3.2.1 臨時生效
輸入ulimit -n 128000,如下圖所示:
3.2.2 永久生效
注:參考該節步驟一後,直接執行 reboot 重啓伺服器,即可生效;若不想重啓伺服器,可參考本節完整步驟。
1)使用vi /etc/security/limits.conf編輯 limits.conf 檔案,修改 nofile 值(其中 128000 即為修改的 nofile 值),如下所示:
vi /etc/security/limits.conf #進入檔案編輯介面
* soft nofile 128000 #確定有該行內容
* hard nofile 128000 #確定有該行內容
注:有的系統需把「*」更換為具體帳號才生效,例如root soft nofile 128000
2)編輯/etc/pam.d/login檔案,確定有下面內容,如下圖所示:
session required pam_limits.so
3)使用exit語句跳出終端重新登入即可。如下圖所示:
3.3 nr_open 和 file-max 值
3.3.1 臨時生效
echo 1200000 > /proc/sys/fs/nr_open
echo 200000 > /proc/sys/fs/file-max
3.3.2 永久生效:需重啓伺服器
當要修改的最大開啟檔案數超過 nr_open 和 file-max 時,就需要改動該值,將該值提高。其修改方式如下:
在檔案/proc/sys/fs/nr_open中加入如下代碼:(1200000 為修改的參數值)
fs.nr_open=1200000
fs.nr_open=1200000
在檔案 /proc/sys/fs/file-max 中插入如下代碼:
fs.file-max=200000
儲存並執行 reboot 重啓伺服器。
注:Linux的核心參數 nr_open 只有在核心版本是 2.6.25 之後的版本才可設定。查看核心版本使用命令“uname -a”。
然後再修改 nofile 值 ,請參見 3.2 節。
3.3.3 永久生效:無需重啓伺服器
在/etc/sysctl.conf中設定fs.nr_open= 1200000 fs.file-max=200000,然後執行sysctl -p,使配置生效。如下所示:
3.4 效果查看
透過cat /proc/pid/limits查看單進程最大開啟檔案數,如下圖所示: