問題現象
-
遠端連線失敗:
-
通過 SSH 或Workbench 遠端連線執行個體時,串連被拒絕或逾時,無法建立會話。
-
通過 VNC 登入,輸入正確的使用者名稱和密碼後提示“System error”,無法登入。
-
-
業務程式運行異常:
應用日誌或命令列輸出“Too many open files”錯誤。
./test3.sh: redirection error: cannot duplicate fd: Too many open files ./test3.sh: line 13: /tmp/testfile_20: Too many open files Error opening file 20: Too many open files
問題原因
nofile 資源限制過嚴:/etc/security/limits.conf 檔案中的 nofile 參數值決定每個進程可開啟檔案數量上限,若設定過小,單進程所需開啟檔案數量超出此限制,將提示無法開啟更多檔案或直接拒絕登入。
操作步驟
若可登入,可直接修改配置;若已無法登入,則需要通過掛載系統硬碟方式修複。
可登入執行個體
-
使用root使用者登入ECS執行個體。
-
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
-
進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示使用root使用者登入,進入終端頁面。
-
-
修改設定檔。
編輯
/etc/security/limits.conf檔案,修改hard nofile和soft nofile參數值為預設的65535後,儲存並退出。* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535-
*代表所有普通使用者,root代表 root 使用者。 -
hard nofile:檔案開啟數的硬性上限,該值不能超過核心參數/proc/sys/fs/nr_open的限制,否則可能導致執行個體登入失敗。 -
soft nofile:當前可開啟的檔案數限制,該值不得超過hard nofile,否則配置將被忽略。若設定的
soft nofile大於hard nofile,實際生效的nofile值為hard nofile參數值。
-
-
使配置生效。
-
退出並使用目標使用者重新登入ECS執行個體,使配置生效。
-
使用
sudo ulimit -n,輸出為65535,表示nofile已更新。
-
-
重啟並運行相關業務程式,確認功能恢複正常。
無法登入執行個體
若系統硬碟存在歷史快照,建議建立快照備份當前資料後,優先利用歷史快照復原系統硬碟,然後驗證恢複正常。
若無歷史快照,則需準備一台與故障執行個體在同一可用性區域的正常Linux執行個體,通過掛載系統硬碟的方式更改nofile參數。
-
卸載系統硬碟。
確保異常執行個體狀態為已停止,執行以下操作:
-
為防止誤操作導致資料丟失,建議對系統硬碟手動建立單個快照,備份當前資料。
-
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
-
單擊異常執行個體ID進入實例詳情頁後,切換至Block Storage頁簽。
-
在系統硬碟的操作列選擇。
-
在卸載雲端硬碟對話方塊中確認資訊,單擊確定卸載。當執行個體狀態顯示無系統硬碟時,表示卸載成功。
-
-
作為資料盤掛載至正常執行個體。
確保正常執行個體狀態為運行中,執行以下操作:
-
掛載異常系統硬碟至正常執行個體。
-
單擊正常執行個體ID進入執行個體詳情頁。
-
切換至Block Storage頁簽後,單擊掛載雲盤。
-
在掛載到執行個體頁面的目標盤中,選擇已卸載的異常系統硬碟,單擊下一步。
-
在分區及建立檔案系統並掛載介面,選擇稍後設定,完成掛載。
-
-
單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示使用root使用者登入,進入終端頁面。
-
掛載檔案系統。
-
確定故障盤分區名稱。
lsblk -fvda ├─vda1 ├─vda2 vfat 7938-FA03 /boot/efi └─vda3 ext4 root 33b46ac5-7482-4aa5-8de0-60ab4c3a4c78 / vdb ├─vdb1 ├─vdb2 vfat 7938-FA03 └─vdb3 ext4 root 33b46ac5-7482-4aa5-8de0-60ab4c3a4c78樣本中,故障盤
vdb的根分區為vdb3需掛載,各分區含義如下:-
vdb1/vdb2:存放系統啟動相關程式,可忽略。
-
vdb3:存放作業系統檔案和資料,需掛載。
-
-
建立目錄並掛載檔案系統。
mkdir <掛載目錄> && sudo mount /dev/<分區名稱> <掛載目錄>參數
說明
<分區名稱>替換為上一步確定的故障盤的根分區名稱。
<掛載目錄>自訂<掛載目錄>,應為以
/開頭的空路徑,可自訂但不可重複。重要若目錄非空,原目錄下檔案將被隱藏導致無法讀取,請謹慎評估。
以將目標資料分割
vdb1掛載至新建立的/test為例,需執行mkdir /test && sudo mount /dev/vdb3 /test。 -
檢查檔案系統掛載結果。
運行
lsblk命令,若目標資料分割存在掛載目錄(MOUNTPOINT),表示檔案系統掛載成功。
-
-
-
修改設定檔。
編輯<掛載目錄>/etc/security/limits.conf檔案,修改
hard nofile和soft nofile參數值為預設的65535後,儲存並退出。* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535-
*代表所有使用者,root代表 root 使用者。 -
hard nofile:檔案開啟數的硬性上限,該值不能超過核心參數<掛載目錄>/proc/sys/fs/nr_open的限制,否則可能導致執行個體登入失敗。 -
soft nofile:當前可開啟的檔案數限制,該值不得超過hard nofile,否則配置將被忽略。若設定的
soft nofile大於hard nofile,實際生效的nofile值為hard nofile參數值。
-
-
作為系統硬碟掛載回異常ECS執行個體。
-
卸載檔案系統。
<掛載目錄>需替換為實際的掛載路徑。umount <掛載目錄>樣本需執行
umount /test。 -
卸載修複後的系統硬碟。
-
返回ECS控制台,進入正常執行個體詳情頁的Block Storage頁簽。
-
單擊修複後的系統硬碟操作列的卸載。
-
在卸載雲端硬碟介面,單擊確定卸載。
-
-
將修複後的系統硬碟掛載回源執行個體。
-
進入異常執行個體詳情頁的Block Storage頁簽,單擊掛載雲盤。
-
在掛載到執行個體頁面的目標盤中,選擇修複後的系統硬碟,配置登入憑證後,單擊下一步。
-
在分區及建立檔案系統並掛載介面,選擇稍後設定,完成掛載。
-
-
啟動ECS執行個體。
-
-
登入異常ECS執行個體,查看是否正常。
後續建議
-
謹慎操作核心系統檔案:在修改核心系統檔案前,請務必手動建立單個快照備份資料,並確認操作的必要性和潛在風險。切勿輕易修改不熟悉的系統參數。
-
監控警示:為保障關鍵業務系統的穩定性與安全性,建議在所有核心執行個體上部署
ulimit -n配置檢查機制。通過定期檢測ulimit -n的實際運行值及其期望配置的一致性,確保系統資源限制設定符合預期標準,及時發現並預警異常修改行為。
> 卸載