linux最大文件句柄數量總結(轉載)

来源:http://www.cnblogs.com/litaozijin/archive/2017/05/11/6839232.html
-Advertisement-
Play Games

最近部署上線的一個引擎,啟動之後記憶體、日誌顯示一切正常,但是外部無法進行引擎訪問。幾經周折,在同事的協助下,找出了問題:root用戶的open files為1024,引擎啟動時,1024個文件句柄已經用盡。在晚上看到一篇不錯的文章,就轉下來了:http://jameswxx.iteye.com/bl ...


  最近部署上線的一個引擎,啟動之後記憶體、日誌顯示一切正常,但是外部無法進行引擎訪問。幾經周折,在同事的協助下,找出了問題:root用戶的open files為1024,引擎啟動時,1024個文件句柄已經用盡。在晚上看到一篇不錯的文章,就轉下來了:http://jameswxx.iteye.com/blog/2096461。以下是文章內容:

  寫這個文章是為了以正視聽,網上的文章人云亦云到簡直令人髮指。到底最大文件數被什麼限制了?too many open files錯誤到底可以通過什麼參數控制?網上的很多文章說的大致步驟是沒有錯的,大致如下:

shell級限制
通過ulimit -n修改,如執行命令ulimit -n 1000,則表示將當前shell的當前用戶所有進程能打開的最大文件數量設置為1000.

用戶級限制 
ulimit -n是設置當前shell的當前用戶所有進程能打開的最大文件數量,但是一個用戶可能會同時通過多個shell連接到系統,所以還有一個針對用戶的限制,通過修改 /etc/security/limits.conf實現,例如,往limits.conf輸入以下內容:
root soft nofile 1000
root hard nofile 1200
soft nofile表示軟限制,hard nofile表示硬限制,軟限制要小於等於硬限制。上面兩行語句表示,root用戶的軟限製為1000,硬限製為1200,即表示root用戶能打開的最大文件數量為1000,不管它開啟多少個shell。

系統級限制
修改cat /proc/sys/fs/file-max

  但是呢,有很多很重要的細節,有很多錯誤的描述,一塌糊塗,因此特的在這裡做一個說明。

一  ulimit -n

     網上很多人說,ulimit -n限制用戶單個進程的問價打開最大數量。嚴格來說,這個說法其實是錯誤的。看看ulimit官方描述:
Provides control over the resources available to the shell and to processes started by  it,  on  systems that allow such control. The -H and -S options specify that the hard or soft limit is set for the given resource. A hard limit cannot be increased once it is set; a soft limit may  be  increased  up  to  the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of limit can be a number in the unit specified for the resource or one of the special values hard, soft,  or  unlimited,  which  stand  for  the  current hard limit, the current soft limit, and no limit,  respectively.
If limit is omitted, the current value of the soft limit  of  the  resource  is  printed,  unless  the  -H  option is given.  When more than one resource is specified, the limit name and unit are  printed before the value.
 
人家從來就沒說過是限制用戶的單個進程的最大文件打開數量,看看紅色部分,是限制當前shell以及該shell啟動的進程打開的文件數量。為什麼會給人限制單個線程的最大文件數量的錯覺,因為很多情況下,在一個shell環境里,雖然可能會有多個進程,但是非常耗費文件句柄的進程不會很多,只是其中某個進程非常耗費文件句柄,比如伺服器上運行著一個tomcat,那麼就是java進程要占用大多數文件句柄。此時ulimit設置的最大文件數和java進程耗費的最大文件數基本是對應的,所以會給人這樣的一個錯覺。 
  
還有,很多文章稱ulimit -n 只允許設置得越來越小,比如先執行了ulimit -n 1000,在執行ulimit -n 1001,就會報"cannot modify limit: Operation not permitted"錯誤。這個其實也是不准確的說法。首先要搞清楚,任何用戶都可以執行ulimit,但root用戶和非root用戶是非常不一樣的。
非root用戶只能越設置越小,不能越設置越大 我在機器上以非root先執行: [wxx@br162 etc]$ ulimit -n 900
[wxx@br162 etc]$
執行成功,再增大: [wxx@br162 etc]$ ulimit -n 901
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[wxx@br162 etc]$ 增加失敗,如果減少則是OK的: [wxx@br162 etc]$ ulimit -n 899
[wxx@br162 etc]$ 如果再增加到900是不行的: [wxx@br162 etc]$ ulimit -n 900
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[wxx@br162 etc]$    root用戶不受限制 首先切換到root: [wxx@br162 etc]$ sudo su -
[root@br162 ~]#
查看下當前限制: [root@br162 ~]# ulimit -n
1000000
[root@br162 ~]# 增大:  [root@br162 ~]# ulimit -n 1000001 [root@br162 ~]# 可以成功增大,再減小: [root@br162 ~]# ulimit -n 999999
[root@br162 ~]# 減小也是成功的,再增大:  [root@br162 ~]# ulimit -n 1000002 [root@br162 ~]# 也是ok的,可見root是不受限制的。    ulimit里的最大文件打開數量的預設值 如果在limits.conf里沒有設置,則預設值是1024,如果limits.con有設置,則預設值以limits.conf為準。例如我換了一臺機器,登錄進去,ulimit -n顯示如下: [root@zk203 ~]# ulimit -n
2000
這是因為我的limits.conf里的文件打開數是2000,如下: [root@zk203 ~]# cat /etc/security/limits.conf root soft nofile 2000
root hard nofile 2001 如果limits.conf里不做任何限制,則重新登錄進來後,ulimit -n顯示為1024。  [root@zk203 ~]# ulimit -n 1024   ulimit修改後生效周期 修改後立即生效,重新登錄進來後失效,因為被重置為limits.conf里的設定值      

二  /etc/security/limits.conf

網上還有繆傳,ulimit -n設定的值不能超過limits.conf里設定的文件打開數(即soft nofile) 好吧,其實這要分兩種情況,root用戶是可以超過的,比如當前limits.conf設定如下: root soft nofile 2000
root hard nofile 2001 但是我用root將最大文件數設定到5000是成功的: [root@zk203 ~]# ulimit -n 5000
[root@zk203 ~]# ulimit -n 
5000
[root@zk203 ~]#
但是非root用戶是不能超出limits.conf的設定,我切換到wxx,執行命令如下: [wxx@zk203 ~]# ulimit -n 5000 -bash: ulimit: open files: cannot modify limit: Operation not permitted
[wxx@zk203 etc]$  所以網上的說法是錯誤的,即使非root用戶的最大文件數設置不能超過limits.conf的設置,這也只是一個表象,實際上是因為,每個用戶登錄進來,ulimit -n的預設值是limits.conf的 soft nofile指定的,但是對於非root用戶,ulimit -n只能越來越小,不能越來越大,其實這個才是真正的原因,但是結果是一樣的。   修改了limits.conf需要重啟系統? 這個說法非常搞笑,修改了limits.conf,重新登錄進來就生效了。在機器上試試就知道了,好多人真的很懶,寧願到處問也不願意花一分鐘時間實際操作一下。    

三  /proc/sys/fs/file-max

網上說,ulimit -n 和limits.conf里最大文件數設定不能超過/proc/sys/fs/file-max的值,這也是搞笑了,/proc/sys/fs/file-max是系統給出的建議值,系統會計算資源給出一個和合理值,一般跟記憶體有關係,記憶體越大,改值越大,但是僅僅是一個建議值,limits.conf的設定完全可以超過/proc/sys/fs/file-max。 [root@zk203 ~]# cat /proc/sys/fs/file-max
1610495 我將limits.conf里文件最大數量設定為1610496,保存後,列印出來: [root@zk203 ~]# cat /etc/security/limits.conf root soft nofile1610496 root hard nofile1610496    

四  總結一下

  • /proc/sys/fs/file-max限制不了/etc/security/limits.conf
  • 只有root用戶才有許可權修改/etc/security/limits.conf
  • 對於非root用戶, /etc/security/limits.conf會限制ulimit -n,但是限制不了root用戶
  • 對於非root用戶,ulimit -n只能越設置越小,root用戶則無限制
  • 任何用戶對ulimit -n的修改只在當前環境有效,退出後失效,重新登錄新來後,ulimit -n由limits.conf決定
  • 如果limits.conf沒有做設定,則預設值是1024
  • 當前環境的用戶所有進程能打開的最大問價數量由ulimit -n決定

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## zabbix監控elk的es值(線上) ### 1、es伺服器、192.168.**.**伺服器(agent端)1. > 首先通過curl -s -XGET http://localhost:9200/_cat/indices?bytes=G獲取數據 1. > 安裝zabbix-agent 1 ...
  • 正則表達式基礎以及grep的簡單使用 1 定義 正則表達式是你所定義的模式模板,Linux可以用它來過濾文本。Linux工具(比如grep、sed、gawk)能夠在處理數據時使用正則表達式對數據進行模式匹配。如果數據匹配模式,它就會被接受併進一步處理;如果數據不匹配,它就會被濾掉。 2 正則表達式的 ...
  • 正則表達式與通配符的區別: 最常應用正則表達式的命令是grep(egrep),sed,awk。 正則表達式和通配符有本質區別,正則表達式用來找:【文件】內容,文本,字元串。一般只有三劍客支持。通配符用來找:文件名。普通命令都支持 正則表達式的分類 POSIX規範將正則表達式的分為了兩種 基本正則表達 ...
  • Shell 傳遞參數 我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n。n 代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推…… 實例 以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 為執行的文件名: 為腳本設置可執行許可權,並執行 ...
  • 1 補充知識 2 準備工作 3 Linux安裝JDK 4 Linux安裝MySQL 5 Linux安裝Tomcat ...
  • CMD命令大全:cmd.exe CMD命令提示符 ,gpedit.msc 組策略,chkdsk.exe Chkdsk磁碟檢查,regedit.exe 註冊表 等 cmd命令大全(第一部分) winver 檢查Windows版本 wmimgmt.msc 打開windows管理體繫結構(WMI) wup ...
  • 人們在互聯網上最常使用的就是電子郵件了,很多企業用戶也經常使用免費的電子郵件系統。今天我就給大家介紹一種在Red Hat Linux 9.0環境下運行的郵件伺服器軟體Sendmail.Sendmail作為一種免費的郵件伺服器軟體,已被廣泛的應用於各種伺服器中,它在穩定性、可移植性、及確保沒有bug等 ...
  • 沒玩過linux,折騰了半天的ftp,好不容易親測通過了。不容易啊。 操作環境:vm虛擬機 centos7 首先:搞定網路問題;預設情況下使用ifconfig可以看到虛擬機下是無網路的。(註:虛擬機網路設置為NAT或橋接模式都是可以的) 輸入命令nmtui 打開網路配置 回車-》回車 將倒數第二項 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...