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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...