DWS臨時記憶體不可用報錯: memory temporarily unavailable

来源:https://www.cnblogs.com/huaweiyun/archive/2023/10/27/17791817.html
-Advertisement-
Play Games

當出現memory temporarily unavailable報錯時,首先根據報錯信息確認具體是哪個cn/dn報的,如果報錯信息沒有類似dnxxxx_xxxx這樣的信息,就是cn報的,需要去每個cn的日誌里排查是哪個cn。 ...


本文分享自華為雲社區《DWS臨時記憶體不可用報錯: memory temporarily unavailable》,作者:漫天。

1、定位報錯的DN/CN

當出現memory temporarily unavailable報錯時,首先根據報錯信息確認具體是哪個cn/dn報的,如果報錯信息沒有類似dnxxxx_xxxx這樣的信息,就是cn報的,需要去每個cn的日誌里排查是哪個cn。

2、DWS813以前的版本記憶體報錯定位

通過free -g或者top命令查看操作系統記憶體使用情況,確認是操作系統記憶體耗盡導致,還是cn/dn的記憶體使用達到限制,導致記憶體可不用報錯。如果沒有現場,需要查看操作系統的記憶體監控。

如果是cn/dn的記憶體使用達到限制,可以按照以下步驟定位:

步驟一:分析記憶體視圖 pv_total_memory_detail(實例級別記憶體視圖)

select * from pv_total_memory_detail ;

判斷(1)如果dynamic_peak_memory大於max_dynamic_memory,說明是cn/dn dynamic記憶體使用達到上限,導致記憶體可不用報錯。PS:要求歷史上dynamic_peak_memory 沒有超過max_dynamic_memory,即dynamic_peak_memory 首次超過max_dynamic_memory時,該判斷方式有效。

判斷(2)dynamic_used_memory接近max_dynamic_memory,大概率是cn/dn dynamic記憶體使用達到上限,導致記憶體可不用報錯。

判斷(3)比較dynamic_used_memory、dynamic_used_shrctx、sctpcomm_used_memory大小,如果dynamic_used_shrctx非常大,說明多線程共用的動態記憶體太大,如果sctpcomm_used_memory非常大,說明通信庫使用的記憶體非常大,如果dynamic_used_shrctx和sctpcomm_used_memory都很小,說明session占用的記憶體最多。

步驟二:分析記憶體視圖 pv_session_memory_detail(會話級別記憶體視圖)和活躍會話視圖 pg_stat_activity

執行如下SQL-X,查看每個session占用的記憶體大小:

-- 查看每個session占用的記憶體大小
select split_part(pv_session_memory_detail.sessid,'.',2) pid,pg_size_pretty(sum(totalsize)) total_size,count(*) context_count from pv_session_memory_detail group by pid order by sum(totalsize) desc;

如果SQL-X查詢結果中,某個session占用記憶體特別高,說明該session上執行的SQL占用記憶體過高,可以找到對應的SQL,殺掉該語句併進行整改:

-- 查看語句占用記憶體大小
select b.state, a.sessid, b.query_id, substr(b.query,1,80) as query, sum(totalsize) as totalsize, sum(freesize), sum(usedsize) from pv_session_memory_detail a, pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid group by state,sessid,query_id,query order by totalsize desc limit 100;
​
-- 到對應的CN節點查殺對應的線程
select pg_terminate_backend(pid);

如果SQL-X查詢結果中,每個session占用記憶體都不大,但session總量大,大概是空閑線程太多導致dynamic記憶體較高。

-- 查看idle線程數量
SELECT count(*) FROM pg_stat_activity WHERE state='idle';
​
-- 查看各個線程狀態的記憶體使用
select b.state, sum(totalsize) as totalsize, sum(freesize) as freesize, sum(usedsize) as usedsize from pv_session_memory_detail a, pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid group by b.state order by totalsize desc limit 100;
​
-- 查詢各個應用的記憶體使用
select b.application_name, sum(totalsize) as totalsize, sum(freesize) as freesize, sum(usedsize) as usedsize from pv_session_memory_detail a, pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid group by b.application_name order by totalsize desc limit 100;
​
-- 查詢各個用戶的記憶體使用
select b.usename, sum(totalsize) as totalsize from pv_session_memory_detail a, pg_stat_activity b where split_part(a.sessid,'.',2) = b.pid group by b.usename order by totalsize desc limit 30;
​
-- 查看各類型等待線程的數量
select wait_status,wait_event,count(*) from pg_thread_wait_status group by 1,2 order by 3 desc;

如果是空閑用戶線程導致dynamic記憶體高,可以臨時清理下空閑用戶線程:

gsql -d postgres -p 25308 -c "clean connection to all for database xxx;"

如果是空閑stream線程導致dynamic記憶體高,可以將參數max_stream_pool改小(stream線程池的作用是緩存stream線程,stream線程是用來進行dn之間數據的傳輸,一般多表join的時候stream線程會較多),減小max_stream_pool的影響是短查詢的性能會降低,對複雜查詢幾乎沒影響。

3、DWS813及以後的版本記憶體報錯定位

可以使用813以前版本的定位方式,也可以使用下麵的方式。

步驟一:查看報錯日誌

813及以上版本會列印出debug的信息,可以通過搜關鍵字abnormal來找到當時使用最高的語句,找到thread id,再查找thread id 找到對應query id

步驟二:查看topsql

上一步可以找到占用記憶體最大的sql,如果該sql占用記憶體確實很大,通過topsql查找對應的query id,從而找到對應的SQL語句,並通過unique_sql_id找到同一類型的SQL,進行分析整改。

如果不是某個sql占用記憶體太高導致,分析方法和813以前的版本一樣。

另外,813及以後的版本可以使用如下方式清理空閑用戶線程:

-- 清理空閑用戶線程,每次清1/4
-- 顯示清理了多少,還剩多少
select * from pgxc_clean_free_conn;

點擊關註,第一時間瞭解華為雲新鮮技術~

 


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

-Advertisement-
Play Games
更多相關文章
  • NPCAP 庫是一種用於在`Windows`平臺上進行網路數據包捕獲和分析的庫。它是`WinPcap`庫的一個分支,由`Nmap`開發團隊開發,併在`Nmap`軟體中使用。與`WinPcap`一樣,NPCAP庫提供了一些`API`,使開發人員可以輕鬆地在其應用程式中捕獲和處理網路數據包。NPCAP庫... ...
  • wmproxy將用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件服務,講述的是主動式健康檢查可帶來的好處 ...
  • 本章將和大家分享在 Windows 系統上如何搭建 Elasticsearch 的開發環境。話不多說,下麵我們直接進入主題。 一、安裝Java的JDK Elasticsearch 其中最主要的開發語言就是 Java ,所以我們在安裝 Elasticsearch 之前,首先需要安裝的就是 Java 的 ...
  • 本文的項目環境為 .net 6.0 (.net 5.0 以上都支持) 在 .net 中獲取字元串的 MD5 相信是非常容易的事情吧, 但是隨便在網上搜一搜發現流傳的版本還不少呢,比如: StringBuilder 版本(應該算是官方版本了,使用的人最多,我發現在 ABP 中也是使用的這個) BitC ...
  • 目的 開發一款可以同步Outlook郵件通訊錄信息的插件。 方案 VSTO 外接程式 COM 載入項 VSTO 外接程式對Outlook的支持,是從2010版本之後開始的。 VSTO 4.0 支持Outlook 2010以後的版本,所以編寫一次代碼,就可以在不同的版本上運行。 COM 載入項十分依賴 ...
  • DNS介紹 DNS(Domain Name System)功能變數名稱系統,是互連網上的一項服務,用於將功能變數名稱轉換為與之相對應的IP地址,功能變數名稱雖然便於記憶,但TCP/IP網路中,設備之間的通信依賴IP地址來實現,它們之間的轉換工作稱為功能變數名稱解析,功能變數名稱解析需要由專門的功能變數名稱解析伺服器來完成,DNS就是進行功能變數名稱解析的 ...
  • 一、 前言 OpenSSH 的加密功能需要用到OpenSSL,所以在升級OpenSSH的時候,大部分情況是需要將OpenSSL一起升級的。 這裡我們選擇先升級OpenSSL到OpenSSL 1.1.1w 11 Sep 2023 然後再升級OpenSSH 到OpenSSH_9.5p1, OpenSSL ...
  • wget wget是一個流行的、免費的、非互動式的命令行工具,主要用於從網路上下載文件。支持通過HTTP、HTTPS和FTP協議下載,並且它是遞歸下載的,這意味著它可以鏡像網站或獲取完整的FTP目錄結構。 下載單個文件 使用wget時,只指定了url地址,表示從網路中下載單個文件到當前目錄,這是wg ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...