故障分析 | 數據庫服務器內存不足一例分析
瀏覽量: 次 發布日期:2023-09-14 20:03:51
故障分析 | 數據庫服務器內存不足一例分析
作者:付祥
現居珠海,主要負責 Oracle、MySQL、mongoDB 和 Redis 維護工作。
本文來源:原創投稿
* 愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
監控告警某臺機器空閑內存低于10%,執行top命令,按內存降序排序,部分輸出如下:
total=32G,used=19G,buff/cache=11G,available=3G,最耗內存進程為 MySQL、Redis,總計約18.2G,其他進程占用內存都比較低,buff/cache 內存中只有3G是有效的,剩余8G內存去哪里?
執行 free 命令進一步查看:
其中shared占用竟然占用了8G內存,通過man查看幫助:
shared Memory來源于/proc/meminfo中Shmem,被tmpfs使用,df -h查看:
目錄/run使用了8.6G內存,和shared占用內存一致,內存都消耗到哪些子目錄了?
內存主要消耗在/run/systemd/users和/run/log/journal目錄,占用內存分別為7126M、1624M,較為異常的是/run/systemd/users占用內存過高,繼續分析這個目錄下有哪些文件
乍一看,只有一個文件占用約40k,這和du統計的差異也太大了吧,是不是有隱藏文件:
不看不知道,一看嚇一跳,隱藏文件數高達30w+,最早的文件有2018年的,最新的文件今天產生的,隨便打開一個文件看看:
保存的是root用戶session信息,loginctl查看session信息:
root用戶session數竟然高達2131個,隨便拿一個session看看:
crond產生的session,這些session都沒有分配相關進程,當前狀態為active,按session排序后,挑選最近的session查看,都是2018年產生的:
做了一個定時任務測試,session能正常分配進程,任務完成后session關閉:
個人覺得可選解決方案如下:1、服務器上主要服務為MySQL和Redis,MySQL作為從庫使用,未承載業務讀流量,Redis近期將會遷移,/run/systemd/users目錄占用內存雖然在增長,5年了也只占用8G,增量很緩慢,故可以在線收縮MySQL innodb_buffer_pool_size使用內存,釋放一部分內存給操作系統,等Redis遷移了再做機器重啟處理。2、假設主機不可以重啟,通過lsof可知這些隱藏文件當前未被使用,故可以遷移到其他磁盤目錄,看看是否能達到釋放內存目的,且這些session都是crond 2018年產生的,并未分配相關進程,故通過loginctl kill-session ID干掉。目前采取方案1處理。
本文關鍵字:#memory# #tmpfs# #crond#
文章推薦:
MySQL 相同 SQL 不同環境執行時間不一樣案例分析
MySQL 從機故障重啟后主從同步報錯案例分析mysql 5.6 升級到 8.0 失敗一例處理
關于SQLE愛可生開源社區的 SQLE 是一款面向數據庫使用者和管理者,支持多場景審核,支持標準化上線流程,原生支持 MySQL 審核且數據庫類型可擴展的 SQL 審核工具。
SQLE 獲取類型地址版本庫https://github.com/actiontech/sqle文檔https://actiontech.github.io/sqle-docs-cn/發布信息https://github.com/actiontech/sqle/releases數據審核插件開發文檔https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html更多關于 SQLE 的信息和交流,請加入官方QQ交流群:637150065...