PgSQL-使用技巧-如何衡量网络对性能的影响

news2024/11/23 15:53:41

PgSQL-使用技巧-如何衡量网络对性能的影响

PG数据库和应用之间常见的部件有连接池、负载平衡组件、路由、防火墙等。我们常常不在意或者认为涉及的网络hops对整体性能产生的额外开销是理所当然的。但在很多情况下,它可能会导致严重的性能损失和拖累整体吞吐量。相当长一段时间,我试图对这种开销进行良好的评估,之前写过how the volume of data transmission as part of SQL execution, as well as the cursor location, affects the overall performance:

https://www.percona.com/blog/impact-of-network-and-cursor-on-query-performance-of-postgresql/

如何检测和衡量影响

没有简单的机制用来衡量网络开销的影响。但是对pg_stat_activity中的wait_events可以尽可能多的告诉我们相关信息。所以,我们应该对等待世界进行采样。我们使用pg_gather作为收集和分析等待事件。他是一个独立的SQL脚本,无需在数据库系统上安装任何东西。他的设计也很轻巧,每隔会话可以采集2000个样本。该项目地址:

https://github.com/jobinau/pg_gather

pg_gather分析报告可以显示等待事件以及每个会话的相关信息:

d4febfc7fe17d7c5d9a97a4c93be84cf.png

本文仅讨论等待事件的部分,同时介绍不同类型工作负载下网络性能如何在等待事件中显示。

案例1:检索大量行数据的查询

考虑下pg_dump在另一台机器上进行逻辑备份。如果网络速度很快,可能会看到大量的CPU利用率和“DataFileRead”作为等待事件:

8741eb82a7dc8a23516debba1ead1992.png

当然,还有“ClientWrite”事件,本例中,这是与将数据写入客户端pg_dump相关的等待事件。如果客户端是像psql一样的轻量级工具,并且网络很快,则“ClientWrite”可能甚至变得不可见。

接着,看下网络速度变慢时,等待事件会是什么样子:

794511a1da8706502d85afd85f00afaf.png

可以看到,CPU利用率和“DataFileRead”等待事件下降,表明整体服务端会话活动减慢。同时“ClientWrite”飙升到1821,表明会话花费了大量时间将数据发送到客户端(pg_dump)。花样“ClientRead”,表明pg_dump的确认需要时间。

“ClientWrite”中的峰值并不取决于客户端工具。下面是检索大量记录的查询,常规psql会话的屏幕截屏:

1318bec4da4527d87e11ce22ee0354ca.png

这些情况下,过多的“ClientWrite”足以发现问题。

案例2:批量数据加载

与前面的情况相反。但PG批量些操作需要做大量工作。下面的等待事件是从真实的fast/low延迟网络采集的:

ea40a898b0cd46b274957b52c41b1aef.png

显然,PG进程必须在“DataFileExtend”、“WALWrite”和“WALSync”上花费事件。现在,如果网络速度变慢,随着性能瓶颈的出现,我们看到的许多等待事件可能看不见。

以下是较慢网络下加载批量数据的等待事件:

9de75e44547eb3d0d902772588242e84.png

正如所见,“ClientRead”已成为主要的等待事件。意味着服务器会话花费更多事件从客户端读取数据。许多系统中,这种变化可能并不明显,但总体而言,“ClientRead”变得更加突出。

案例3:对事务的影响

OLTP负载上,SQL可能简单且短小,不会造成任何可观察到的网络影响。但服务器和客户端之间的来回通信可能会导致SQL和最终提交或回滚之间出现不必要的延迟。即每隔语句之间的间隙。

下面是快速网络下pgbench的微事务的等待事件:

28948d6ff27eacee6b9bdc1b1eac5c9e.png

显然,与 WAL 相关的等待事件和 CPU 使用率很高。但我们可以看到也有相当多的“ClientRead”。发生这种情况是因为微事务会有大量的网络交互。ClientRead 对于事务来说是不可避免的,预计 5-10% 就可以了。

但随着网络速度变慢,“ClientRead”变得越来越重要。以下是来自较慢网络上相同 pgbench 事务工作负载的信息。

45babd660f7827cc8dd136328dbdcd6a.png

在这种情况下,ClientRead 成为最大的等待事件。

您可能想知道,“Net/Delay*”显示的是什么?新版本的 pg_gather(版本 21)中提供了此附加分析,用于评估事务块外的延迟。详情请参阅下一节。

案例4:连接利用率

随着网络延迟的增加,客户端连接将无法尽可能使用服务器会话。服务器会话必须等待第八个“ClientRead”/“ClientWrite”或闲置。无论哪种方式,它都会极大地影响系统的吞吐量。

在事务内,延迟被捕获为“ClientRead”,但不会捕获两个事务之间的延迟,因为会话暂时变为“空闲”。pg_gather 新版本准备了对服务器浪费时间或“网络/延迟*”时短暂切换到空闲的估计。这可能是由于网络延迟或应用程序响应不佳造成的。从数据库方面来说,很难区分它们。但“网络/延迟*”可以很好地了解浪费了多少服务器时间。

当客户端和服务器之间存在大量来回通信时,延迟/等待时间变得更加明显。通过创建单个语句文件可以轻松测试这一点。

echo "SELECT 1" > query.sql

这可以通过 TCP 连接针对远程数据库执行指定的秒数。

$ pgbench -h 10.197.42.1 -T 20 -f query.sql

在我的服务器之间的快速网络上,我可以获得以下结果作为单个会话的 TPS。

…
latency average = 0.030 ms
initial connection time = 5.882 ms
tps = 32882.734311 (without initial connection time)

但 pg_gather 的等待事件分析告诉我,更多的时间花在了 Net/Delay* 上。

757ccb8fd920931238a140e553a6be6c.png

这是有道理的,因为“SELECT 1”在服务器上不需要做太多事情,而且这个工作负载都是关于发送来回通信。

使用本地Unix套接字连接,单个会话吞吐量增加了一倍以上!

latency average = 0.013 ms
initial connection time = 1.498 ms
tps = 75972.733205 (without initial connection time)

但等待事件分析告诉我们,客户端-服务器通信仍然是主要的时间消耗者。

257e3bd38caaba4e52527a41069a381a.png

“ClientRead”增加是因为从客户端传输了更多数据。

如果在这种情况下网络速度变慢,“Net/Delay*”也会增加,并且 CPU 使用率和 TPS 会下降,因为会话在处理两个语句之间花费更多时间不执行任何操作。

5c371cdcad98a77131a55211b2697269.png

由于这个特定的工作负载没有事务并且发送到服务器的数据较少,因此“ClientRead”可能会下降到不明显的水平,正如我们所看到的。

总结

来自 pg_stat_activity 的“wait events”信息可以告诉我们有关性能和网络拥塞的许多详细信息。不仅仅是事件的总和,两个等待事件和模式之间的差距也有很多信息需要挖掘。pg_gather独立 SQL 脚本可以方便地发现问题和瓶颈。尽管这篇博文专门针对网络,但等待事件分析对于许多情况都是通用的。

原文

https://www.percona.com/blog/how-to-measure-the-network-impact-on-postgresql-performance/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的datetime模块

time模块用于取得UNIX纪元时间戳,并加以处理。但是,如果以方便的格式显示日期,或对日期进行算数运算,就应该使用datetime模块。 目录 1. datetime数据类型 1) datetime.datetime.now()表示特定时刻 2)da…

K8s卷存储详解(一)

K8s卷存储详解(一) K8s 存储K8s卷分类K8s目前支持的卷类型 临时卷类型EmptyDirCSI 临时卷通用临时卷 K8s 存储 什么是卷?为什么要用卷? 我们知道K8s是基于容器,对各个Pod进行管理的。Pod是由容器构成的,我…

一图读懂数电票丨发票新时代的机遇与挑战

随着国家“金税4期”的推进,“全电票”近期被正式更名为“数电票”。它的出现为企业的发票管理带来了哪些机遇与挑战?下图为你简单梳理: 数电票的应用,将有助于彻底解决现有业务流程中的发票管理环节存在的集中化和自动化难题。它将推动对发票的管理与企业的业务流程、法务工…

区块链与加密货币在Web3中的融入及意义

Web3是指下一代互联网,也被称为去中心化互联网。它的核心理念是建立一个去中心化的经济和社会系统,使得个人和社区能够更加自治和自主,而不依赖于中心化的机构和权力。 在Web3中,区块链和加密货币是非常重要的技术和概念。区块链是…

not allowed to load local resource解决

问题: 报错:not allowed to load local resource 原因: file协议为本地文件传输协议,浏览器为了安全考虑不允许直接访问。 解决: 方法1:把静态资源放在同一个项目中; 方法2:搭建…

uni-app:点击事件的实现(点击信息,实现页面跳转)

样式: 开始页面: 点击后的页面: 路径展示: 核心代码: 前端点击事件: taptest 页面跳转方法写入: test(){ uni.navigateTo({ url:../start_detail/start_detail?ord…

【软件架构】企业架构4A定义

文章目录 前言战略、BA、DA、AA、TA五者的关系1、业务架构(BA)2、数据架构(DA)3、应用架构(AA)4、技术架构(TA)总结 前言 业务架构是跨系统的业务架构蓝图,应用架构、数…

vue3+elementplus后台管理系统,实现用户登录

目录 1 创建登录页面2 验证用户身份总结 我们的后台管理系统目前已经搭好了一个初步的框架,作为后台系统必备的功能就是用户登录了。我们先问一下chatgpt,实现用户登录需要开发哪些内容。 vue3elementplus实现用户的登录 要实现用户的登录功能&#xff0…

微服务学习笔记-----Nacos安装教程(Windows和Linux版本)

Nacos安装教程 Nacos安装指南1.Windows安装1.1.下载安装包1.2.解压1.3.端口配置1.4.启动1.5.访问 2.Linux安装2.1.安装JDK2.2.上传安装包2.3.解压2.4.端口配置2.5.启动 3.Nacos的依赖 Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的Git…

性能测试如何做?从0到1性能测试实战(手把手教)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是性能测试&a…

[Bug] ls: reading directory ‘.‘: Input/output error, Ubuntu系统某一挂载目录下数据全部消失

ls: reading directory .: Input/output error, Ubuntu系统某一挂载目录下数据全部消失 问题描述解决总结 问题描述 当天下午离开工作地点之前 启动了程序, 第二天早上来公司后发现: 工作目录/home/xxx/workspace下所有的代码文件全部消失, 然后之前运行的程序也是因为找不到代…

LeetCode[315]计算右侧小于当前元素的个数

难度:Hard 题目: 给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 示例 1: 输入:nums [5,2,6,1] 输出&#…

美团圈圈拉新10天7万佣金,是如何做到的?简单轻松易上手

科思创业汇 大家好,这里是科思创业汇,一个轻资产创业孵化平台。赚钱的方式有很多种,我希望在科思创业汇能够给你带来最快乐的那一种! 这两天,美团圆圈火了出来。 1.这个项目是什么? 三月底至四月初&…

easy弹窗默认最大化居中偏左显示问题解决

easy弹窗默认最大化居中偏左显示问题解决 0问题描述1尝试方法10弹窗加top,left 0参数11添加部分方法体 2最后解决方法3记录 0问题描述 如下图,弹窗默认最大化应该覆盖全屏幕,页面大小和屏幕大小是匹配得,但页面位置偏左了。 查看CSS发现整个…

SpringBoot整合RocketMQ 不多说直接上代码

文章目录 依赖yaml配置生产端发送消息消费端异步下单Business生产端消费端 依赖 <!--整合的依赖--> <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2<…

基础算法-数组模拟栈

栈&#xff1a;先进后出 队列&#xff1a;先进先出 栈 例题&#xff1a; 实现一个栈&#xff0c;栈初始为空&#xff0c;支持四种操作&#xff1a; push x – 向栈顶插入一个数 x&#xff1b;pop – 从栈顶弹出一个数&#xff1b;empty – 判断栈是否为空&#xff1b;query …

正则表达式 —— Grep

文本处理三剑客&#xff1a;Grep、Sed、Awk 这三个工具都是基于对文本的内容进行增删改查的操作&#xff0c;此篇着重介绍grep与正则表达式的应用&#xff0c;以及扩展正则表达式。 正则表达式 什么是正则表达式&#xff1f; 它是由一类特殊字符以及文本字符所编写的一种模式…

【后端面经-Spring】Spring简介

【后端面经-Spring】Spring简介 1. Spring简介2. Spring模块3. Spring核心特性4. Spring的后续拓展面试模拟参考资料 1. Spring简介 Spring是为了简化java项目开发设计的一款设计层面开源框架&#xff0c;其设计目的就是为了“简化开发”。 它使用分层架构&#xff0c;解决业务…

基于Python实现种差值方法

完整资料进入【数字空间】查看——baidu搜索"writebug" 一、种差值方法的实现与问题 三种插值方法都是使用Python自己实现的。 1.1 最近邻插值 寻找每个中心点周围的八个点中有无未丢失的点&#xff0c;如果有的话就赋值为第一个找到的点&#xff0c;如果没有就扩大…

【C语言趣味教程】代码注释:小孩子才做选择,我全都要

【C语言趣味教程】(4) 变量&#xff1a;代码注释 | 变量的声明 | 初始化与赋值 | 作用域与生命周期 | 局部变量与全局变量 &#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x…