抽丝剥茧丨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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;通过…