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

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.mzph.cn/news/8576.shtml

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

相关文章

Set集合类详解(附加思维导图)

目录 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 2.2、TreeSet集合的使用 三、HashSet、LinkedHashSet、TreeSet的使用场景 四、list和set集合的区别 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 ①:add…

redis面试1

Redis基础面试题 1、为什么要使用Redis做缓存 缓存的好处 使用缓存的目的就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,带来更好的性 能,带来更高的并发量。Redis 的读写性能比 Mysql 好的多,我们就可以把 Mysq…

【小白必看】利用Python生成个性化名单Word文档

文章目录 前言所需文件及文件格式说明excel数据如下word 模板如下文件目录格式及生成后的文件 导入所需的模块:打开 Excel 文件:选择工作表:获取数据列表:遍历数据并生成 Word 文档:完整代码结束语 前言 对于需要批量…

【MyBatis 学习一】认识MyBatis 第一个MyBatis查询

目录 一、认识MyBatis 1、MyBatis是什么? 2、为什么要学习MyBatis? 二、配置MyBatis环境 1、建库与建表 2、创建新项目 3、xml文件配置 (1)配置数据库连接 (2)配置 MyBatis 中的 XML 路径 三、测试&#x…

mysql(三)用户权限管理

目录 前言 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、删除用户 前言 为什么要设置用户权限? MySQL设置用户管理权限的主要目的是为了确保数据库的安全性和数据的机密性。以下是一些原因: 1. 安全性:MySQL是一个开源的关系型…

Java集合之List

ArrayLsit集合 ArrayList集合的特点 ArrayList集合的一些方法 ①.add(Object element) 向列表的尾部添加指定的元素。 ②.size() 返回列表中的元素个数。 ③.get(int index) 返回列表中指定位置的元素,index从0开始。 public class Test {public static void m…

dependency walker工具简介及使用

dependency walker工具 简介使用 简介 官方概述: Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, …

C++ 核心编程

一、 内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放,存放函数的参数值、…

gensim conherence model C_V 值与其他指标负相关BUG

在我用gensim3.8.3 conherence model分析京东评论主题模型时, C_V 与npmi、u_mass出现了强烈的皮尔逊负相关: 这些地方也反映了类似问题: https://github.com/dice-group/Palmetto/issues/12 https://github.com/dice-group/Palmetto/issue…

测等保2.0——安全区域边界

一、前言 今天我们来说说安全区域边界,顾名思义,安全区域边界就是保障网络边界处,包括网络对外界的边界和内部划分不同区域的交界处,我们的重点就是查看这些边界处是否部署必要的安全设备,包括防火墙、网闸、网关等安…

git相关

gerrit用户指南: 资料:Gerrit 用户指南 gerrit-user-guide 上述有介绍如何review,review并非修改代码之后如何重新提交等操作 jenkins介绍 Jenkins详细教程 - 知乎 一、jenkins是什么? Jenkins是一个开源的、提供友好操作界…

使用Ensp配置DHCP协议

如何使用Ensp配置DHCP协议,为PC自动分配IP地址 什么是DHCP? Dynamic Host Configuration Protocol,动态主机配置协议,简单理解为自动分配IP地址,有了这个协议就不用手动配置IP地址了,如图 思路 给路由…

Ubuntu 上编译protobuf 指

欢迎大家关注我的B站主页MYVision_MY视界的个人空间-MYVision_MY视界个人主页-哔哩哔哩视频 下载protobuf GitHub - protocolbuffers/protobuf: Protocol Buffers - Googles data interchange format 根据需要从release 中下载指定的版本 下载完之后,根据提供的C…

Godot 4 着色器 - Shader调试

我之前用OpenCV进行图像相关处理,觉得已经很不错,结合GDI可以实现流畅的动画效果 直到近来用Shader后才发现,着色器更上一层楼,原来这是入了GPU的坑 Shader编程限制很多,各种不支持,看在它性能不错功能炫…

发布npm包流程

发布npm包的步骤如下: 在终端中通过 npm init 命令创建一个新的npm包,按照提示填写包的信息,如包名称、版本、描述、作者、许可证等。 在包的根目录下创建一个 index.js 文件,编写你的代码。 确认你已经注册了npm账号&#xff0…

mysql进阶2——prosysql实现mysql读写分离

文章目录 一、读写分离方案类型1.1 最简单的读写分离1.2 多个读组或写组的分离模式 二、案例2.1 初始化操作2.2 mysql主添加proxysql连接用户2.3 Proxysql添加连接mysql集群参数2.4 添加健康检测用户2.5 添加读写分离的路由规则2.6 验证 一、读写分离方案类型 基本了解&#xf…

pytorch工具——pytorch中的autograd

目录 关于torch.tensor关于tensor的操作关于梯度gradients 关于torch.tensor 关于tensor的操作 x1torch.ones(3,3) xtorch.ones(2,2,requires_gradTrue) print(x1,\n,x)yx2 print(y) print(x.grad_fn) print(y.grad_fn)zy*y*3 outz.mean() print(z,out)注意 atorch.randn(2,…

音视频——压缩原理

H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛, 最流行的。随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本。 但为了用好H264,我们还是要对…

mac电脑强大的解压缩软件BetterZip 5.3.4 for Mac中文版及betterzip怎么压缩

BetterZip 5.3.4 for Mac 是Mac系统平台上一款功能强大的文件解压缩软件,不必解压就能快速地检查压缩文档。它能执行文件之间的合并并提供密码。使用它,用户可以更快捷的向压缩文件中添加和删除文件。它支持包括zip、gz、bz、bz2、tar、tgz、tbz、rar、7…

nfs服务器的描述,搭建和使用

前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:RodmaChen nfs服务器的描述,搭建和使用 NFS概述工作原理优缺点 nfs服务器搭建服务端客户端 NFS概述 NFS(Network File System)是一种基…