续接上回《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…