抽絲剝繭丨PostgreSQL 系國產數據庫%SYS CPU newfstatat() high 調優一例(二)

續接上回《PostgreSQL 系國產數據庫%SYS CPU newfstatat() high 調優一例(一)》,這個問題還在持續,并且原因并不只是一個,從調了文件系統級atime,到調整wal size減少日志被動清理,還有在驗證temp文件,這里后來又發現了sysdate函數的timezone調用,簡單記錄。

前面有提到是newfsatat()函數產生的system CPU,用于文件驗證,這可能是因為是BClinux 22的原因,也有可能早期版本調用的是stat()函數。

分析思路

  1. 確認是系統級還是進程級

  2. 如果是PG進程,跟蹤當時執行的命令

  3. 多并發會話,壓力測試還原問題

  4. 使用strace跟蹤定位函數占用

  5. 使用strace跟蹤函數調用的內容,如newfsatat()驗證的是什么文件

  6. 根據操作的文件類型,判斷相關功能。

相關命令

--確認進程idselect?pg_backend_pid();-- 跟蹤函數占比strace?-c?-p xxx--跟蹤進程strace?-p xxx ??-o ?str.log-- 查看文件調用grep newfsatat str.log

使用捕捉的SQL幾個并發pgbench壓測,負載如下,可見sys cpu使用近80%

問題一

產生的是pg_temp

$grep?newfsatat xxx
newfstatat(AT_FDCWD,?"base/pgsql_tmp/pgsql_tmp....newfstatat(AT_FDCWD, "base/pgsql_tmp/pgsql_tmp....

案例中一條3張表的left join操作,調用了3000多次newfstatat調用,并且幾乎全是pgsql_tmp的臨時文件。

PostgreSQL 哪些使用臨時文件

在數據庫中的一些操作,可能會用到臨時文件,比如排序、HASH JOIN、聚合、distinct、中間結果存儲等等。為了提高數據庫的執行效率,一些操作可能會使用內存代替臨時存儲,僅僅當內存不足時使用臨時文件。通過work_mem可以設置會話Query使用的臨時內存的閾值,這里的臨時都是Query執行過程中產生的臨時文件,而不是臨時表,通常臨時空間在事務結束、Query結束后會自動回收。

加大work_mem可以減少臨時文件,配置參數temp_file_limit=0可以把產生臨時文件和SQL信息寫到日志中。另外注意explain執行計劃中的Sort Method: external merge Disk: xxxkB,僅顯示了一部分的臨時文件使用情況,這里的實際情況是,explain顯示的是峰值使用量,而不是總使用量。

可以在視圖pg_stat_database中看到數據庫級別的統計信息,其中有temp_files和temp_bytes。這兩列非常重要,因為它們會告訴您數據庫是否必須向磁盤寫入臨時文件,這將不可避免地減慢操作速度。通常是因為work_mem設置太低,大量的低效SQL操作大數據,當時在創建索引等。

問題二

讀取/etc/timezone

基于上面的問題我們壓測是在tmp文件,查看執行計劃使用的是hash join,該join是會產生tmp,我們在謂詞列和join列創建了索引,優化器使用了nest loop join而不是hash join,結果不再產生temp,再使用相同的負載壓測,負載sys cpu縮少了一倍,近30%,但顯然也不正常。

使用上面的方法繼續strace跟蹤,發現如下:

newfstatat(AT_FDCWD,?"/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...},?0) =?0newfstatat(AT_FDCWD,?"/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...},?0) =?0newfstatat(AT_FDCWD,?"/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...},?0) =?0newfstatat(AT_FDCWD,?"/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...},?0) =?0newfstatat(AT_FDCWD,?"/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...},?0) =?0...

近幾千次的/etc/localtime調用。判斷應該是在做timezone相關調用,查看SQL 謂詞條件有使用一個oracle兼容的函數sysdate,取的是一個join查詢后日期字段(已創建索引)最近8小時的記錄,cdate> sysdate-to_dsinterval(‘0 8:00:00).

測試是否sysdate()和now()調用localtime

數據庫名=# select pg_backend_pid();?pg_backend_pid----------------? ? ? ? ?785320(1?row)數據庫名=# select ?sysdate;? ? ? sysdate-------------------?20250612?18:07:59(1?row)[{events=EPOLLIN, data={u32=669907864, u64=669907864}}],?1,?-1,?NULL,?8)?=?1recvfrom(12,?"Q\0\0\0\25select ?sysdate;\0",?8192,?0,?NULL,?NULL)?=?22newfstatat(AT_FDCWD,?"/etc/localtime", {st_mode=S_IFREG|0644, st_size=561,?...},?0)?=?0sendto(11,?"\2\0\0\0\300\3\0\0\216?\0\0\10\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...,?960,?0,?NULL,?0)?=?960sendto(12,?"T\0\0\0?\0\1sysdate\0\0\0\0\0\0\0\0\0#0\0\10\377\377\377\377\0"...,?81,?0,?NULL,?0)?=?81recvfrom(12,?0xc03d58,?8192,?0,?NULL,?NULL)?=?-1?EAGAIN?(Resource?temporarily unavailable)epoll_pwait(4,數據庫名=# ?SELECT?now();? ? ? ? ? ? ? now-------------------------------?2025-06-12?18:08:10.254791+08(1?row)[{events=EPOLLIN, data={u32=669907864, u64=669907864}}],?1,?-1,?NULL,?8)?=?1recvfrom(12,?"Q\0\0\0\22SELECT now();\0",?8192,?0,?NULL,?NULL)?=?19sendto(11,?"\2\0\0\0@\0\0\0\216?\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...,?64,?0,?NULL,?0)?=?64sendto(12,?"T\0\0\0\34\0\1now\0\0\0\0\0\0\0\0\0\4\240\0\10\377\377\377\377\0\0D\0\0"...,?89,?0,?NULL,?0)?=?89recvfrom(12,?0xc03d58,?8192,?0,?NULL,?NULL)?=?-1?EAGAIN?(Resource?temporarily unavailable)epoll_pwait(4,

驗證了我的判斷,在該國產數據庫中使用sysdate需要調用newfstatat(AT_FDCWD,“/etc/localtime”),而 PostgreSQL 原生的now函數并沒有,而當前使用nl join后可能是關連的filter時,多過的調用了sysdate,而導致了問題的發生,繼續優化改為使用now(),繼續壓測。

如果不放大看,幾乎沒有波動,sys CPU占用的問題得到解決,并且SQL整體的響應時間大大得到了優化提升。

圖片

數據驅動,成就未來,云和恩墨,不負所托!


云和恩墨創立于2011年,是業界領先的“智能的數據技術提供商”。公司以“數據驅動,成就未來”為使命,致力于將創新的數據技術產品和解決方案帶給全球的企業和組織,幫助客戶構建安全、高效、敏捷且經濟的數據環境,持續增強客戶在數據洞察和決策上的競爭優勢,實現數據驅動的業務創新和升級發展。

自成立以來,云和恩墨專注于數據技術領域,根據不斷變化的市場需求,創新研發了系列軟件產品,涵蓋數據庫、數據庫存儲、數據庫管理和數據智能等領域。這些產品已經在集團型、大中型、高成長型客戶以及行業云場景中得到廣泛應用,證明了我們的技術和商業競爭力,展現了公司在數據技術端到端解決方案方面的優勢。

圖片

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93556.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【新手入門】Android Studio 項目結構拆解,快速理解文件作用!

目 錄 一、【Project】視圖下項目結構(真實目錄) 二、【Android】視圖下項目結構 三、【app/】下重要文件解析 1、 build.gradle 2、AndroidManifest.xml 3、res/ 作為剛剛接觸Android開發的小白,使用Android Studio創建項目后&…

Python實現點云Kmeans、歐式和DBSCAN聚類

本節我們分享點云處理中的三種常見聚類方法,分別是K-means、歐氏與 DBSCAN聚類。具體介紹如下:1. K-means 聚類定義:一種基于距離度量的無監督學習算法,將數據劃分為 K 個緊湊的簇,使簇內數據相似度高、簇間差異大。算…

【Java后端】MyBatis-Plus 原理解析

MyBatis-Plus 原理解析 其實 MyBatis-Plus 的 Service 層設計就是為了讓開發者不用重復寫很多樣板代碼。我們來一點點剖析 UserServiceImpl、IService、UserService、ServiceImpl 之間的關系和調用鏈。1. 類/接口關系圖IService<T>▲│UserService (接口) <-- 自定義…

Nacos 注冊中心學習筆記

&#x1f389; Alibaba微服務組件 Nacos 注冊中心超詳細學習筆記 &#x1f389; &#x1f4cc; 寫在前面&#xff1a;本文基于官方PDF文檔與實戰經驗&#xff0c;整理了Nacos注冊中心的核心知識點、部署流程與實戰技巧&#xff0c;力求圖文并茂、通俗易懂&#xff0c;適合收藏反…

java 策略模式 demo

策略模式介紹策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來并使它們可相互替換。策略模式讓算法的變化獨立于使用算法的客戶端&#xff0c;從而實現靈活的算法切換。核心角色&#xff1…

SAP Valuation Category在制造業成本核算中的使用場景與配置方案

Valuation Category在制造業成本核算中的使用場景與配置方案一、核心使用場景&#xff08;制造業特有&#xff09;1. 內制 vs 外購成本分離業務需求&#xff1a;同一物料可能通過內部生產&#xff08;成本含料工費&#xff09;或外部采購&#xff08;成本含采購價運費&#xff…

我的 LeetCode 日記:Day 36 - 動態規劃,背包問題的千變萬化

昨天&#xff0c;我初步掌握了 0/1 背包問題的理論基礎和標準解法。今天&#xff0c;我將這種思想應用到了更廣泛的場景中。今天的幾道題&#xff0c;乍一看和背包沒什么關系&#xff0c;但通過巧妙的數學轉化&#xff0c;它們的核心都變成了 0/1 背包問題。 這讓我深刻體會到…

本地處理不上傳!隱私安全的PDF轉換解決方案

PDF能鎖定排版、字體、圖片位置&#xff0c;無論在什么設備打開都保持一致。它是無廣告、簡潔高效的專業PDF處理工具。功能豐富&#xff0c;支持批量操作&#xff1a;只需將文件拖入界面&#xff0c;選擇目標格式&#xff08;如Word、PPT、Excel、圖片等&#xff09;&#xff0…

Docker build創建鏡像命令入門教程

一、核心概念Dockerfile 定義鏡像構建步驟的文本文件&#xff0c;包含一系列指令和配置&#xff0c;用于自動化創建鏡像。鏡像層&#xff08;Layer&#xff09; Docker 鏡像由多層只讀層疊加而成&#xff0c;每個指令&#xff08;如 RUN、COPY&#xff09;會生成一個新的層。層…

Redis 是單線程模型嗎?

最近在面試中經常被問到這個問題&#xff1a;"Redis是單線程的嗎&#xff1f;"很多同學都會脫口而出&#xff1a;"是的&#xff01;"但其實這個答案并不完全正確。今天我們就來聊聊Redis的線程模型&#xff0c;把這個問題徹底搞清楚。 先說結論 Redis的線程…

Hologres實戰:路徑分析函數

前言 Hologres提供了一套高效的路徑分析函數&#xff0c;包括路徑明細計算和結果解析功能&#xff0c;能夠幫助用戶深入理解用戶行為路徑&#xff0c;并通過桑基圖實現數據可視化。 一、核心功能 路徑明細計算&#xff1a;精確記錄用戶在產品或功能中的完整訪問路徑結果解析…

產品開發實踐(常見的軟硬結合方式)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】前面說過&#xff0c;傳統的純軟件開發&#xff0c;在國內的大背景下面是很難存活的。但是如果是把軟件&#xff0c;構建在硬件基礎之上&#xff0c…

Linux | i.MX6ULL網絡通信-套字節 UDP(第十八章)

01 Linux | i.MX6ULL網絡通信-套字節 TCP(第十七章) 02 iTOP-IMX6ULL 實現基于 UDP 的 socket 編程。

學習嵌入式第三十天

文章目錄進程和線程&#xff08;續&#xff09;線程1.線程傳參2.線程屬性3.線程間通信1.概念2.方式3.互斥鎖4.死鎖5.信號量習題 進程和線程&#xff08;續&#xff09; 線程 1.線程傳參使用第四個參數實現對線程內部的傳參 代碼實現&#xff1a; #include <stdio.h> #inc…

GaussDB 數據庫架構師修煉(十三)安全管理(3)-行級訪問控制

1 背景行級訪問控制特性將數據庫的訪問控制精確到數據表行級別 &#xff0c;只允許用戶查看 、更新或刪除特定的行數據。2 實例場景實例以醫生只能看到治療的病人&#xff0c;不能看其它醫生的病人為例&#xff1a;1)醫院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 與蜂窩網絡(手機網絡)的核心區別,以及 Wi-Fi 技術未來的發展方向

在日常生活中&#xff0c;我們既離不開家里的 Wi-Fi&#xff0c;也離不開手機的 4G/5G 網絡。它們都能把我們連接到互聯網&#xff0c;但底層的工作方式卻大不相同。一、設計初衷的不同Wi-Fi誕生于 1997 年的 IEEE 802.11 標準&#xff0c;定位是局域網無線替代。它的目標是讓電…

C++編程實戰:高效解決算法與數據結構問題

個人主頁 &#xff1a; zxctscl 專欄 【C】、 【C語言】、 【Linux】、 【數據結構】、 【算法】 如有轉載請先通知 題目1. 數字統計2. 兩個數組的交集3. 牛牛的快遞4. 點擊消除5. 最小花費爬樓梯6. 簡寫單詞1. 數字統計 BC153 數字統計 #include <iostream> using na…

《零基礎入門AI:深度學習中的視覺處理(卷積神經網絡(CNN)進階)》

一、卷積知識擴展 1. 二維卷積 單通道版本 對于單通道輸入圖像 III (尺寸 HWH \times WHW) 和卷積核 KKK (尺寸 FFF \times FFF)&#xff0c;輸出特征圖 OOO 的計算公式為&#xff1a; O(i,j)∑m0F?1∑n0F?1I(im,jn)?K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可視化圖表-pie:從入門到精通(進階篇)

歡迎來到pyecharts餅圖系列教程的進階篇&#xff01;在上一篇基礎教程中&#xff0c;我們學習了餅圖的基本概念和簡單實現。在本文中&#xff0c;我們將深入探索pyecharts中餅圖的六種高級用法和自定義選項&#xff0c;包括環形餅圖、富文本標簽餅圖、滾動圖例餅圖、環形圖、嵌…

【JAVA 核心編程】面向對象高級:類變量與方法 抽象類與接口

一、類變量與類方法&#xff08;靜態變量&#xff09; 1&#xff09;類變量 class Child{private String name;//定義一個變量count&#xff0c;是一個類變量&#xff08;靜態變量&#xff09;static靜態//該變量最大的特點就是會被Child 類的所有對象訪問public static int co…