關於 ulimit 的兩個天坑

来源:https://www.cnblogs.com/ulricqin/p/18112778
-Advertisement-
Play Games

稍微有點 Linux 經驗的人一定會遇到過 “Too many open files” 錯誤,這個錯誤本質是 ulimit 設置不合理導致的。關於 ulimit 設置,有哪些需要註意的點呢?本文給大家做一個介紹,希望對大家有所幫助。 如何確認 ulimit 設置生效了? 很多人設置了 ulimit ...


稍微有點 Linux 經驗的人一定會遇到過 “Too many open files” 錯誤,這個錯誤本質是 ulimit 設置不合理導致的。關於 ulimit 設置,有哪些需要註意的點呢?本文給大家做一個介紹,希望對大家有所幫助。

如何確認 ulimit 設置生效了?

很多人設置了 ulimit 最後發現還是報錯 “Too many open files”。先不論如何操作,我們先要知道怎麼確認進程的 ulimit 到底是多少。這不是通過 ulimit -n 來看的,而是找到進程的 pid,然後查看 /proc/<進程的PID>/limits 文件,這個文件裡面記錄了進程的真實 ulimit 信息。比如:

20240401155313

如何設置 ulimit?

如果 ssh 到機器上,通過 nohup 之類的方式啟動進程,ulimit 將受限於 /etc/security/limits.conf 文件的配置。比如我這個機器:

[root@aliyun-2c2g40g3m ~]# cat /etc/security/limits.conf | grep -v '^#' | grep -v '^$'
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

這是 aliyun 的一臺虛機,看起來阿裡雲已經幫我們設置了 ulimit 為 65535,這個是 OK 的,挺大的了。但是,如果你是通過 systemd 啟動的服務,ulimit 將受限於 systemd 的配置。比如某個服務的 service 文件設置為:

[Unit]
Description="Categraf"
After=network.target

[Service]
Type=simple

ExecStart=/opt/categraf/categraf
WorkingDirectory=/opt/categraf

Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65535
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=categraf


[Install]
WantedBy=multi-user.target

看到 LimitNOFILE 那行配置了麽?就是它。

如果 service 文件中沒有配置 LimitNOFILE,systemd 會有個預設配置,systemd 的預設配置可以通過如下方式查看:

[root@aliyun-2c2g40g3m systemd]# pwd
/etc/systemd
[root@aliyun-2c2g40g3m systemd]# grep FILE *.conf
system.conf:#DefaultLimitNOFILE=
user.conf:#DefaultLimitNOFILE=

咱也不用關心預設配置是多少,反正每個 service 都配置一下 LimitNOFILE 就好了。

其他進程管理工具對 ulimit 也有影響

如果你不是通過 systemd 托管進程的,而是使用了其他的進程管理工具,比如 supervisor,那麼 ulimit 將受限於 supervisor 的配置。如果你是通過 Saltstack 之類的工具,批量通過 shell 啟動進程,還要小心 salt minion 的 ulimit 設置,至於 supervisor 和 salt minion 如何調整 ulimit,這裡就不展開了,說多了都是淚。

句柄限制不止是 ulimit

實際上,操作系統對句柄的限制不止是 ulimit,還有 /proc/sys/fs/file-max 這個參數,這個參數限制了整個系統的句柄數量。如果你的系統句柄數量設置過小,那麼即使你設置了 ulimit,也會受限於這個參數。比如我的系統如下:

[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
188844

如何調整這個參數呢?操作命令如下:

[root@aliyun-2c2g40g3m systemd]# echo 100000 > /proc/sys/fs/file-max
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
100000
[root@aliyun-2c2g40g3m systemd]# echo 188844 > /proc/sys/fs/file-max
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
188844

如果想要機器重啟也能生效,就要修改 sysctl.conf 文件,比如:

fs.file-max = 188844

如何監控句柄相關問題?

系統層面總共分配了多少句柄可以通過 /proc/sys/fs/file-nr 文件查看,比如:

[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-nr
1760	0	188844

第一個數字是已經分配的句柄數量,第三個數字是系統總共可分配的句柄數量。如果第一個數字接近第三個數字,那麼就要小心了。

夜鶯的內置告警規則中,有針對 categraf 的機器指標的告警規則,其中就有文件句柄使用率的告警:

linux_sysctl_fs_file_nr / linux_sysctl_fs_file_max > 0.9

另外,如果你使用了 categraf 的 procstat 進程監控插件,並且打開了 gather_more_metrics 中的 limit,還會採集到 procstat_rlimit_num_fds_soft 指標,夜鶯的內置規則中還有這麼一條告警規則:

procstat_rlimit_num_fds_soft < 2048

這是採集進程的軟句柄限制,如果軟句柄限制過小,就告警。通常,小於 2048,大概率就是運維人員忘記做操作系統的參數調優了。

如上知識,希望對你有幫助。文末請允許我插播一個小廣告。本人創業兩年了,我們公司的業務如下,如果你有這方面的需求,歡迎聯繫我們做產品技術交流哈。


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

-Advertisement-
Play Games
更多相關文章
  • 源碼分析丨MySQL的多層SP中Cursor相關BUG 一、問題發現 在一次開發中在sp中使用多層cursor的時候想知道每層的m_max_cursor_index值分別是多少,以用來做後續開發。於是做了以下的試驗,但是發現第一個level=2那層的m_max_cursor_index的值有點問題。 ...
  • 本文分享自華為雲社區《GaussDB DWS的SQL ON ANYWHERE技術解密》,作者:tooooooooooomy。 1. 前言 適用版本:【8.1.1(及以上)】 查詢分析是大數據要解決的核心問題之一,雖然大數據相關的處理引擎組件種類繁多,並提供了豐富的介面供用戶使用,但相對傳統資料庫用戶 ...
  • Apache DolphinScheduler已支持Apache SeaTunnel任務類型,本文介紹了SeaTunnel任務類型如何創建,任務參數,以及任務樣例。 一、Apache SeaTunnel SeaTunnel 任務類型,用於創建並執行 SeaTunnel 類型任務。worker 執行該 ...
  • 作者 | ALIREZA SADEGHI 翻譯 | Debra Chen 簡介 雖然生成式人工智慧和ChatGPT帶來的沸沸揚揚的炒作令科技界為之一振,但在數據工程領域,2023年仍然是一個令人振奮和充滿活力的一年,數據工程生態系統變得更加多樣化和複雜化,系統中的所有層面都在不斷創新和演進。 隨著各 ...
  • 本文介紹了SEQUENCE的使用場景和相關的函數的使用方法,並對使用SEQUENCE過程中遇到的常見問題及解決方法進行了彙總。 ...
  • 目錄一、 Composable 的生命周期二、 Composable 的副作用2.1 SideEffect2.2 DisposableEffect2.3 LaunchedEffect2.4 rememberCoroutineScope2.5 rememberUpdatedState2.6 deriv ...
  • 目錄一、狀態變化1.1 狀態變化是什麼1.2 mutableStateListOf 和 mutableStateMapOf二、重組的特性2.1 Composable 重組是智能的2.2 Composable 會以任意順序執行2.3 Composable 會併發執行2.4 Composable 會反覆 ...
  • 一、Text/Span 在HarmonyOS中,Text/Span組件是文本控制項中的一個關鍵部分。Text控制項可以用來顯示文本內容,而Span只能作為Text組件的子組件顯示文本內容。 Text/Span組件的用法非常簡單和直觀。我們可以通過Text組件來顯示普通文本,也可以通過Span組件來實 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...