Linux - 修改系統的max open files、max user processes(附ulimit的使用方法)

来源:https://www.cnblogs.com/shoufeng/archive/2019/03/29/10620480.html
-Advertisement-
Play Games

Linux伺服器中, 經常發生"error: too many open files", 或者 "ulimit: max user processes: cannot modify limit" 類型的錯誤, 這些問題為什麼會發生? 又要如何解決? 本文記錄了我遇到問題、解決問題的過程, 最後還對u... ...


目錄

1 問題說明

Linux 系統預設的max open files = 1024, 在大記憶體伺服器中, 如果運行負載比較大的程式, 很容易發生error: too many open files, 特別是提供大量靜態文件訪問的Web伺服器、緩存伺服器中這種錯誤更加常見.

open files表示系統級別的能夠打開的文件句柄的數量, 是系統級別的安全策略: 限制所有應用打開的文件數量.

發生error: too many open files時, 如果不好定位程式問題, 可在系統的配置文件中做一定的修改.

為了讓伺服器重啟之後, 配置仍然有效, 需要用永久生效的配置方法進行修改.

2 修改max open files

說明: 這裡以Cent OS 6.5為例.

使用ulimit -a命令可以查看當前系統的所有限制值, 括弧中的命令是查看單項限制值的方式, 比如要查看系統可打開的最大文件數量(open files), 就可以用ulimit -n命令: (具體命令說明請參考末尾部分的附錄)

[root@localhost ~]# ulimit -a
core file size           (blocks, -c)  0
data seg size            (kbytes, -d)  unlimited      # 數據段長度
scheduling priority              (-e)  0
file size                (blocks, -f)  unlimited
pending signals                  (-i)  1031426
max locked memory        (kbytes, -l)  64
max memory size          (kbytes, -m)  unlimited  # 最大記憶體大小
open files                       (-n)  65536      # 最大打開文件數
pipe size             (512 bytes, -p)  8
POSIX message queues      (bytes, -q)  819200
real-time priority               (-r)  0
stack size               (kbytes, -s)  10240      # 棧大小
cpu time                (seconds, -t)  unlimited  # CPU時間
max user processes               (-u)  131072
virtual memory           (kbytes, -v)  unlimited  # 虛擬記憶體大小
file locks                       (-x)  unlimited

(1) 短期修改, 重啟伺服器後即失效:

# 把文件句柄數改為65535
ulimit -n 65535 
# 也可用下屬方式修改:
ulimit -SHn 65535
# 其中-S是soft軟限制模式, -H指hard硬限制模式; 
# 預設是軟限制, 如果只指定-n, 那就會同時配置-SH.

(2) 永久修改, 重啟伺服器也不變:

網路上常見的方式有如下三種:

① 在/etc/security/limits.conf最後增加如下兩行記錄:

# nofile - 可以打開的最大文件數, *通配符表示對所有用戶有效
*   soft      nofile     65536
*   hard      nofile     65536

修改完成後保存, 退出當前用戶並重新登錄(不用重啟伺服器), 當前修改就會生效.

② 在/etc/profile中增加一行ulimit -SHn 65535, 然後運行source /etc/profile命令讓修改立即生效.

—— /etc/profile文件是所有系統用戶的配置文件, 修改後會影響當前系統的所有註冊用戶.

③ 在/etc/rc.local文件中增加一行ulimit -SHn 65535, 修改完後, 重啟伺服器就可生效.

值得註意的是, 博主在CentOS 6.5系統中測試, 發現只有第 ① 和第 ② 種方式才有效.

另外, 在《阿裡巴巴Java開發手冊》中, 關於最大文件句柄數有這樣的描述:

【推薦】調大伺服器所支持的最大文件句柄數(File Descriptor,簡寫為fd)。

說明:主流操作系統的設計是將 TCP/UDP 連接採用與文件一樣的方式去管理,即一個連接對應於一個 fd。主流的 Linux 伺服器預設所支持最大 fd 數量為 1024,當併發連接數很大時很容易因為 fd 不足而出現“open too many files”錯誤,導致新的連接無法建立。 建議將 Linux 伺服器所支持的最大句柄數調高數倍(與伺服器的記憶體數量相關)。

3 修改max user processes

(1) 問題描述: 在使用Java程式多線程大批量生成模擬數據時, Cent OS報出如下錯誤:

ulimit: max user processes: cannot modify limit

錯誤說明: Linux系統為每個用戶都設置了一個最大進程數, 這個特性可以讓我們控制伺服器上現有用戶可以創建的進程數量.

(2) 查看max user processes:

# 與查看max open files類似, 可使用 ulimit -u查看max user processes:
ulimit -u

(3) 修改max user processes:

① 方案一: 修改/etc/security/limits.conf文件, 在文件最後添加下述內容:

*  soft      nproc      131072
*  hard      nproc      131072

② 方案二: 修改/etc/security/limits.d/90-nproc.conf文件, 在文件最後添加下述內容:

# 用戶進程數的預設限制, 下麵這個是對root外的其他用戶限制max user processes, 要註釋掉: 
# *          soft    nproc     1024
root       soft    nproc     131072

(4) 關於nproc配置信息的擴展說明:

max user processes的配置, Linux系統預設先讀取/etc/security/limits.conf 中的信息, 如果/etc/security/limits.d/目錄下還有配置文件的話, 也會依次遍歷讀取, 最終, /etc/security/limits.d/中的配置會覆蓋/etc/security/limits.conf 中的配置.

另外, max open filesmax user processes是不能配置unlimited的 —— 極不安全的設置, 此時系統會使用預設的配置值. 對nproc而言, 預設值的計算方法為:

# 計算公式為: 
default_nproc = max_threads / 2;
# 其中, max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
# mempages是機器的物理頁面個數, THREAD_SIZE=8K, 所以, 計算公式為: 
default_nproc = max_threads / 2 
              = (mempages * PAGE_SIZE) / ( 2 * 8 *THREAD_SIZE ) 
              = total_memory / 128K;
              
# 計算本機預設nproc配置: 
cat /proc/meminfo | grep MemTotal
MemTotal:       115571480 kB

echo "115571480 / 128" | bc
902902

ulimit -u
902682
# 算出來default_nproc = 902902, 和實際的902682很接近, 
# 因為物理頁面會存儲一些關鍵數據, 所以實際的比計算出來的要小一些. 

4 附錄: ulimit命令說明

(1) 列出所有當前資源極限, 命令為: ulimit -a, 其他命令可參考輸出信息中括弧內的提示:

# ulimit -a 命令的輸出信息: 
core file size           (blocks, -c) 0
data seg size            (kbytes, -d) unlimited  # 一個進程的數據段的最大值
scheduling priority              (-e) 0
file size                (blocks, -f) unlimited  # Shell創建文件的最大體積, 1block = 512bytes
pending signals                  (-i) 1031426    # 最多允許多少個待處理的信號
max locked memory        (kbytes, -l) 64         # 每個進程可以鎖住的物理記憶體的最大值
max memory size          (kbytes, -m) unlimited  # 每個進程可以使用的常駐記憶體的最大值
open files                       (-n) 65536      # 每個進程可以同時打開的最大文件數, 不能是unlimited
pipe size             (512 bytes, -p) 8          # 管道的最大值, 1block = 512bytes
POSIX message queues      (bytes, -q) 819200     # POSIX的消息隊列的最大值
real-time priority               (-r) 0
stack size               (kbytes, -s) 10240      # 單個進程能夠使用的最大棧大小
cpu time                (seconds, -t) unlimited  # 單個進程的最大CPU時間, 也就是可使用CPU的秒數, 到硬極限時, 這個進程就會立即自殺; 到軟極限時, 每秒發送一次限制超時信號SIGXCPU
max user processes               (-u) 131072     # 單個用戶可同時運行的最大進程數, 不能是unlimited
virtual memory           (kbytes, -v) unlimited  # 每個進程可使用的最大虛擬記憶體
file locks                       (-x) unlimited  # 每個進程能鎖住的最大文件個數

(2) ulimit的其他命令:

-H  設置某個給定資源的硬極限. 如果用戶擁有root許可權, 可以增大硬極限. 任何用戶均可減少硬極限
-S  設置某個給定資源的軟極限, 軟極限可增大到硬極限的值

(3) 註意事項:

① 其中, unlimited是指不限制用戶可以使用的資源, 但這個設置對系統可打開的最大文件數(max open files)和各個用戶可同時運行的最大進程數(max user processes)無效.

② 如果某個指標沒有明確指定-H和-S限制, 那麼當前的極限值就是 -H 和 -S 兩者的極限值.

參考資料

ulimit限制之nproc問題

linux修改max user processes limits

版權聲明

作者: ma_shoufeng(馬瘦風)

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 併在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


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

-Advertisement-
Play Games
更多相關文章
  • 1. 主機規劃 Grains文檔 註意事項 修改了master或者minion的配置文件,那麼必須重啟對應的服務。 2. Grains基本信息 3. Grains優先順序信息 推薦使用 自編寫py腳本定義,這樣自定義的grains只需要在master端維護即可,減少後期維護成本。 下文內容就是根據優先 ...
  • 註: client 個人覺得沒必要用 libvent來實現就沒寫 註:由於 涉及到回調函數的使用 如有疑惑的可以先去瞭解回調函數的實現機理 先來說一下 libevent主要是幹啥的 : 內部封裝了 socket 通信 和 io 轉接函數 ,通過使用大量的回調使得不用考慮大量重覆的工作,並且其根據不同 ...
  • . linux Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程式和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶 ...
  • 學習目標: 1、分析u-boot-1.1.6環境變數,瞭解環境變數初始化、設置以及過程 2、為後面能夠掌握u-boot-1.1.6如何啟動內核過程打下基礎 1、環境變數的概念 在分析uboot環境變數的源碼實現之前,先介紹一下環境變數的概念。u-boot通過環境變數為用戶提供一定程度的可配置性,在不 ...
  • 文件1內容 文件2內容 把文件2的內容放到文件1最後一列的後面,我們只需要系統自帶命令paste ...
  • 一、登陸伺服器並輸入如下命令: 根據提示輸入密碼、埠、加密方法等即可,成功安裝後出現如下提示: 二、啟動shadowsocks服務,命令如下: 三、在阿裡雲安全組開啟前面設置的埠 四、shadowsocks客戶端設置如下: 五、啟動系統代理即可開始上網。 六、打開谷歌網站如下圖: ...
  • 首先呢,你的先有一臺自己的伺服器把,這個就不多贅述了,我自己買了一臺國外的VPS. 一、docker的安裝 首先我們來看下伺服器的版本信息: 1、docker安裝 安裝完之後查看是否安裝成功: 啟動docker服務 查看docker是否啟動成功 看到那個綠色的字體了嘛,OK,啟動成功 查看docke ...
  • 一、Linux最高許可權用戶root,預設可以直接登錄sshd。為了提高伺服器的安全度,需要對它進行禁止,使得攻擊者無法通過暴力破解來獲取root許可權。 1,新建一個用戶; 2,為新用戶設置密碼; 3,修改SSHD配置,禁止root直接登錄 #vi /etc/ssh/sshd_config 查找“#P ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...