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

最近一個客戶從 Oracle 遷移到?PostgreSQL?系的國產數據庫后,CPU一直接近100%,但是再仔細分析,發現%system CPU占到60%左右,當然這是一種不正常的現象。之前我寫過《如何在 Linux 上診斷高%Sys CPU》(https://www.anbob.com/archives/6730.html),使用pidstat確認%sys cpu進程大部分為?PostgreSQL?進程,pstack查看發現call,PostgreSQL 的線程大部分時間都在調用newfstatat(),這不是正常現象,并且通常意味著數據庫運行中存在頻繁的文件狀態檢查(stat)操作,嚴重時可能導致性能瓶頸。

什么是 newfstatat()?

ENMOTECH

newfstatat()是 Linux 的系統調用,用于檢查文件狀態,類似stat()lstat()等。PostgreSQL 在以下場景中可能頻繁調用newfstatat()

  • 判斷WAL文件是否存在或過期;

  • 檢查relation文件(如表、索引文件);

  • 目錄掃描(如pg_tblspc、pg_wal、pg_stat_tmp等);

  • 檢查文件是否存在或大小變化(特別是在歸檔、WAL回放、恢復或重啟點期間;

  • 后臺進程(如checkpointer、walwriter、autovacuum、archiver)可能周期性遍歷文件。

特別是在WAL寫入或checkpoint過程中,PostgreSQL 會頻繁檢查pg_wal目錄中的文件狀態。頻繁調用它通常表示 PostgreSQL 正在不斷訪問某些文件或目錄的元信息.

如何分析排查?

ENMOTECH

sys% CPU高存在2種情況,常見是系統級配置,還有一種是局部會話級。當看到CPU高,部分人是想著趕緊優化SQL,但是進數據庫發現活動用戶進程并非多高并發,其次一些較差的應用使用DB總有優化不完的TOP SQL。如果沒有成本可以讓你的DBA或乙方廠家在優化SQL上面折騰,或找應用廠家自查,但都效果微乎其微。首先應該定位CPU使用類型與觸發點。

  • vmstat或top查看sys/user CPU占比;

  • 明確范圍,使用pidstat查找進程,pstack調用堆棧,strace跟蹤函數的調用位置;

  • perf做系統級負載分析。

如本案例分析到是newfsatat()函數,能猜到是FS文件系統相關,再查看文件系統負載。

使用iostat查看負載,發現數據盤繁忙近100%,根據之前的負載壓測基線數據,大概可以判斷是否達到了硬件磁盤的IOPS或吞吐量上限,使用iotop找I/O高的進程。

優化調整

ENMOTECH

通過上面的排查,發現是I/O方面問題,并且主要進程為checkpoint進程,下面可以在系統級做一些調優,PostgreSQL?本地文件文件確實較多,但inode使用不到10%,之前我記錄過《Linux最佳實踐for Postgresql/openGauss》(https://www.anbob.com/archives/6970.html)在文件系統級有提到,調整文件系統的noatime nodirtime禁用訪問時間,可以在線調整,我們調整完后%SYS CPU有明顯降低,但是I/O繁忙率依舊比較高。

Checkpoint是 PostgreSQL 中重要的后臺進程,負責將共享緩沖區中的臟頁寫入磁盤,并確保事務日志(WAL)的一致性。優化參數主要有:

  • checkpoint_timeout增加此值可減少checkpoint頻率;

  • max_wal_size控制兩次checkpoint之間允許的WAL最大大小;

  • min_wal_size WAL文件回收時的最小保留大小,應與max_wal_size配合調整;

  • checkpoint_completion_target控制在checkpoint_timeout內完成checkpoint的目標比例。

監控Checkpoint性能

SELECT?*?FROM?pg_stat_bgwriter;SELECT? checkpoints_timed,?? checkpoints_req,??100.0?*?checkpoints_req?/?(checkpoints_timed?+?checkpoints_req)?AS?req_checkpoint_ratio,? buffers_checkpoint,? buffers_cleanFROM?pg_stat_bgwriter;
關注以下指標:
  • checkpoints_timed – 定時觸發的checkpoint

  • checkpoints_req – 因WAL增長觸發的checkpoint

  • buffers_checkpoint – checkpoint寫入的緩沖區數量

  • buffers_clean- 后臺寫入器清理的緩沖區數量

  • req_checkpoint_ratio<10%(請求式checkpoint占比低),checkpoint應由超時觸發(checkpoints_timed),而非WAL寫滿觸發,尤其是>30%應該增加WAL

優化策略

  1. 減少checkpoint頻率:增加checkpoint_timeout和max_wal_size

  2. 平滑checkpoint I/O:提高checkpoint_completion_target

  3. 平衡恢復時間:確保max_wal_size不會導致恢復時間過長

  4. 監控調整:根據pg_stat_bgwriter結果持續優化

-- 增加checkpoint間隔(默認5min,可增至15-30min)ALTER?SYSTEM?SET?checkpoint_timeout?=?'30min';-- 允許更多WAL積累(默認1GB,根據磁盤空間調整)ALTER?SYSTEM?SET?max_wal_size?=?'8GB';-- 使checkpoint寫入更分散(默認0.5,建議0.7-0.9)ALTER?SYSTEM?SET?checkpoint_completion_target?=?0.9;

查看 WAL 文件統計

COUNT(*)?AS?total_wal_files,??SUM(size)?/?1024?/?1024?AS?total_size_mb,? (SELECT?setting?FROM?pg_settings?WHERE?name?=?'max_wal_size')?AS?max_wal_sizeFROM?pg_ls_waldir();

檢查 WAL 生成速率

SELECT?? pg_wal_lsn_diff(pg_current_wal_lsn(),?'0/0')?/?1024?/?1024?AS?total_wal_mb,? (SELECT?(sum(blks_hit)+sum(blks_read))?FROM?pg_stat_database)?AS?total_io,? (SELECT?extract(epoch?from?now()?-?pg_postmaster_start_time())?/?3600?AS?hours_up);

優化高 WAL 生成的查詢

SELECT?query, wal_bytes?FROM?pg_stat_statements?ORDER?BY?wal_bytes?DESC?LIMIT?10;

如果太多WAL文件/頻繁checkpoint,提高max_wal_size,降低checkpoint_timeout,提高checkpoint_completion_targetj.我們把max_wal_size從20G調到400G后,明顯磁盤的使用率降了下來。

檢查relation文件

除了WAL清理外,還有可能是檢查relation文件是否存在時觸發newfsatat,下面測試:

-- session 1select?pg_backend_pid();-- session 2?strace?-p xxx?-o s2.o-- session 1select?big query....

創建了一個大分區表,確認有多個relation文件,然后在執行此表的關聯查詢,另一個會話使用strace跟蹤,后面查看newfsatat函數。發現newfsatat調用次數與表數據的文件個數并不成正比,而當join時有調用newfsatat.

# awk -F"(" '{print $1}' s2.o|sort|uniq -c|sort -nk 1? ? ??1?fallocate? ? ??1?ftruncate? ? ??1?mmap? ? ??1?munmap? ? ??2?epoll_pwait? ? ??2?kill? ? ??2?newfstatat? ? ??2?rt_sigprocmask? ? ??3?recvfrom? ? ??3?--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=2024915, si_uid=1000} ---? ? ??3?--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=2024916, si_uid=1000} ---? ? ??3?unlinkat? ? ??4?--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=394857, si_uid=1000} ---? ? ?10?rt_sigreturn? ??521?brk? ??628?sendto? ??761?pread64? ??763?pwrite64??17138?openat??17139?close??18042?lseek# grep newfstatat s2.onewfstatat(AT_FDCWD,?"base/pgsql_tmp/pgsql_tmp1981697.8", {st_mode=S_IFREG|0600, st_size=2211840, ...},?0) =?0newfstatat(AT_FDCWD,?"base/pgsql_tmp/pgsql_tmp1981697.7", {st_mode=S_IFREG|0600, st_size=1810432, ...},?0) =?0
NOTE:使用newfstatat函數檢查的是查詢過程中的pgsql_tmp臨時文件,接下來可以考慮優化SQL減少temp或調DB參數。

總結

ENMOTECH

出現newfstatat()占用大量調用棧,不是bug,而是 PostgreSQL 或操作系統層面在頻繁獲取文件元信息。但它很可能是以下問題的表現癥狀

  • WAL寫入壓力大

  • Checkpoint頻繁

  • 歸檔問題

  • 文件系統性能差

  • 查詢產生大量的中間temp文件

圖片

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


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

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

圖片

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

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

相關文章

[Linux] Linux提權管理 文件權限管理

目錄 Linux提權管理 su命令 準備一個用戶 sudo命令 sudo配置 Linux文件權限管理 文件系統權限介紹 rwx 權限解讀 文件系統權限管理 chmod 命令 針對文件 針對目錄 chown chgrp 命令 驗證文件權限rwx效果 驗證目錄權限rwx效果 權限補充說明 管理文件默認權限 u…

Kubernetes(2)pod的管理及優化

【一】Kubernetes 資源管理與操作方式 1.1 資源管理介紹 Kubernetes 把一切抽象為“資源”&#xff0c;用戶通過操作資源來管理集群。 集群中運行服務 運行容器&#xff0c;而容器必須放在 Pod 內。 最小管理單元是 Pod&#xff0c;但通常不直接操作 Pod&#xff0c;而是借…

深入剖析 TOTP 算法:基于時間的一次性密碼生成機制

標準原文&#xff1a;https://datatracker.ietf.org/doc/html/rfc6238 在數字化時代&#xff0c;信息安全至關重要&#xff0c;身份驗證成為保障系統和數據安全的第一道防線。傳統的用戶名加密碼方式已難以應對日益復雜的安全挑戰&#xff0c;基于時間的一次性密碼&#xff08;…

Centos7 服務管理

注&#xff1a;從Centos7開始systemd代替了init&#xff0c;使用systemd機制來管理服務優勢&#xff1a;并行處理所有服務&#xff0c;加速開機流程命令相對簡單&#xff1a;所有操作均有systemctl命令來執行服務依賴性檢測&#xff1a;systemctl命令啟動服務時會自動啟動依賴服…

數據庫索引視角:對比二叉樹到紅黑樹再到B樹

當我們談論數據庫索引時&#xff0c;選擇合適的數據結構至關重要。不同的數據結構在性能、復雜度以及適用場景上都有所不同。本文將通過對比二叉樹、紅黑樹和B樹&#xff0c;探討它們如何影響數據庫索引的表現。一、二叉樹特性定義&#xff1a;每個節點最多有兩個子節點。應用場…

Redis-plus-plus 安裝指南

&#x1f351;個人主頁&#xff1a;Jupiter.&#x1f680; 所屬專欄&#xff1a;Redis 歡迎大家點贊收藏評論&#x1f60a;目錄1.安裝 hiredis2.下載 redis-plus-plus 源碼3.編譯/安裝 redis-plus-plusC 操作 redis 的庫有很多. 此處使? redis-plus-plus.這個庫的功能強?, 使…

vue3動態的控制表格列的展示簡單例子

動態的控制表格列的展示&#xff0c; 可以勾選和取消某一列的顯示本地存儲上一次的配置表格內容支持通過slot自定義內容例子1 <script setup> import { reactive, ref, watch } from "vue"; import one from "./components/one.vue"; import One fro…

微積分[4]|高等數學發展簡史(兩萬字長文)

文章目錄前言解析幾何學微積分學級數理論常微分方程&#xff5c;(1) 萌芽階段&#xff5c;(2) 初創階段&#xff5c;(3) 奠基階段&#xff5c;(4) 現代發展階段前言 高等數學通常僅是相對初等數學而言的&#xff0c;其內容并無身份確切的所指&#xff0c;大凡初等數學以外的數…

系統思考—啤酒游戲經營決策沙盤認證

下周&#xff0c;我們將為企業交付——《啤酒游戲經營決策沙盤—應對動態復雜系統的思考智慧》內部講師認證課。啤酒游戲沙盤&#xff0c;我已交付過上百場。但這次的講師認證班&#xff0c;不僅僅是分享課程技巧&#xff0c;更多的是分享“心法”。有些關鍵點&#xff0c;直到…

深入詳解PCB布局布線技巧-去耦電容的擺放位置

目錄 一、基礎概念與核心作用 二、布局五大黃金原則 三、模擬電路的特殊處理 四、高頻場景優化方案 和旁路電容是保障電源穩定性和信號完整性的核心元件。盡管它們的原理和作用常被討論,但實際布局中的細節往往決定成敗。 一、基礎概念與核心作用 去耦電容:主要用于抑制…

布隆過濾器的原理及使用

背景介紹在互聯網中&#xff0c;我們經常遇到需要在大量數據中判斷目標數據是否存在的情況。例如&#xff0c;在網絡爬蟲中&#xff0c;我們需要判斷某個網址是否已經被訪問過。為了實現這一功能&#xff0c;通常需要使用一個容器來存儲已訪問過的網址。如果將這些數據直接存儲…

達夢 vs. Oracle :架構篇①——從“聯邦制”到“中央集權”

1. 引言&#xff1a;為何體系結構是第一課&#xff1f; 對于任何一個數據庫而言&#xff0c;其體系結構是決定其性格、性能和應用場景的“基因”。理解了體系結構&#xff0c;尤其是在兩種數據庫之間進行切換時&#xff0c;才能真正做到知其然&#xff0c;并知其所以然。在所有…

我的世界Java版1.21.4的Fabric模組開發教程(十九)自定義生物群系

這是適用于Minecraft Java版1.21.4的Fabric模組開發系列教程專欄第十九章——自定義生物群系。想要閱讀其他內容&#xff0c;請查看或訂閱上面的專欄。 生物群系(Biome) 是Minecraft中世界不同區域呈現特定的地貌景觀&#xff0c;這些區域與現實世界類似&#xff0c;都具有和其…

Mac (三)如何設置環境變量

目錄一、查看環境變量 &#x1f50d;1. 查看所有環境變量2. 查看特定變量二、臨時設置&#xff08;當前終端有效&#xff09; ?1. 基本語法2. 實戰示例三、永久設置&#xff08;全局生效&#xff09; &#x1f512;配置步驟&#xff1a;四、實戰案例 &#x1f6e0;?案例1&…

零改造遷移實錄:2000+存儲過程從SQL Server滑入KingbaseES V9R4C12的72小時

摘要&#xff1a;在信創窗口期&#xff0c;我們把擁有2000存儲過程、300鏈接服務器的核心業務&#xff0c;從 SQL Server 2016/2019 平移到 KingbaseES V9R4C12&#xff08;SQL Server 兼容版&#xff09;。本文以 30 分鐘部署、TPCH 100G 性能 PK、真實踩坑修復、灰度割接 4 小…

K8S HPA 彈性水平擴縮容 Pod 詳解

文章目錄1、前置準備2、需求場景3、Scale 靜態擴縮容3.1、創建 Deployment 腳本3.2、Scale 擴縮容3、HPA 自動擴縮容3.1、安裝 Metrics3.2、創建 Deployment 演示案例3.3、創建 HPA3.4、觸發 HPA 自動擴縮容1、前置準備 本次案例演示&#xff0c;我選擇了阿里云ECS&#xff08…

對話訪談|盤古信息×智晟威:深度挖掘數字化轉型的奧秘

在數字化轉型的浪潮中&#xff0c;傳統設備企業如何突破“純硬件”的邊界&#xff0c;實現從“賣產品”到“賣生態”的跨越&#xff1f;數字化轉型究竟是“高不可攀的奢侈品”&#xff0c;還是“觸手可及的生存技能”&#xff1f;近日&#xff0c;廣東盤古信息科技股份有限公司…

什么是模型預測控制?

一、概念模型預測控制&#xff08;Model Predictive Control, MPC&#xff09;是一種先進的控制方法&#xff0c;廣泛應用于工業過程控制、機器人控制、自動駕駛等領域。MPC的核心思想是利用系統的動態模型預測未來的行為&#xff0c;并通過優化算法計算出當前時刻的最優控制輸…

類與類加載器

在Java中&#xff0c;類和類加載器是密切相關的兩個概念&#xff0c;理解它們有助于我們更好地掌握Java的運行機制。什么是Java類&#xff1f;Java類就像是一個模板或藍圖&#xff0c;它定義了對象的屬性和行為。比如"汽車"可以看作一個類&#xff0c;它有顏色、品牌…

一文速通Python并行計算:14 Python異步編程-協程的管理和調度

一文速通 Python 并行計算&#xff1a;14 Python 異步編程-協程的管理和調度 摘要&#xff1a; Python 異步編程基于 async/await 構建協程&#xff0c;運行在事件循環中。協程生成 Task&#xff0c;遇到?await?時掛起&#xff0c;I/O 完成觸發回調恢復運行&#xff0c;通過…