硬件和软件信息

CPU: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz 2 sockets / 28 cores / 56 threads
内存: 256GB of RAM
存储: SAMSUNG SM863 1.9TB Enterprise SSD
操作系统: centos 7
文件系统: xfs

shared_buffers

定义了用于共享存储器缓冲区的存储器PostgreSQL使用量。这可以说是其最重要的设置,往往比(或好或坏)到MySQL的innodb_buffer_pool_size。最大的区别,如果我们敢于比较的shared_buffers缓冲池,是InnoDB的绕过操作系统的缓存直接访问(读取和写入)的底层存储子系统的数据,而PostgreSQL的没有。

这是否意味着PostgreSQL里面的“双缓冲”,首先装载数据从磁盘到操作系统的缓存来然后做这些网页的副本进入的shared_buffers区域?是。

这是否“双缓冲”让PostgreSQL的不如InnoDB和MySQL的内存管理方面?不,我们将讨论为什么这是一个跟进博客文章的情况。现在它足以说明实际性能取决于工作负载(读取和写入混合),“热数据”(即最常访问和修改数据集的部分),以及如何经常检查点的大小发生。

我们该如何选择了的shared_buffers以优化性能的PostgreSQL设置
由于这些因素,的shared_buffers设置的RAM或幻数“8GB”的25%的记录建议式是几乎不理想的。似乎是什么好理由,不过,是这样的:

如果你可以在内存中适应整个你的“热数据”,则专大部分的内存来的shared_buffers不负有心人很好,这使得PostgreSQL的表现为接近的内存数据库成为可能。
如果你的“热数据”的大小超过你的服务器有可用的内存量,那么你可能会更好用更小的shared_buffers区域合作,更多地依赖于操作系统的缓存。
对于这个基准,考虑到我们使用的选项,我们发现,专75%的所有可用内存来的shared_buffers是理想的。这足以适应整个“热数据”,仍然留下足够的内存用于OS操作,手柄连接和一切。

work_mem

该设置定义可以由每个查询(未会话),用于内部排序操作(如ORDER BY和DISTINCT)中使用的存储器量,以及哈希表(例如,执行基于散列的聚合时)。除此之外,PostgreSQL的数据移动到临时磁盘文件。我们面临的挑战通常在这里找到一个很好的平衡。我们要避免使用临时磁盘文件,它们会减慢查询完成,进而可能导致争。但我们不希望过度使用内存,甚至可能导致OOM;当是不是真的需要它与work_mem高价值的工作可能是破坏性的。

我们分析了sysbench的-TPCC产生的工作量,并与一些惊喜发现,work_mem不会在这里发挥作用,考虑已执行的查询。所以我们一直4MB的默认值。请注意,这是很少在生产工作负载的情况下,所以它总是盯紧该参数是非常重要的。

random_page_cost

此设置规定,非连续牵强磁盘页面将有成本,而且直接影响到查询规划决策。使用高等待时间的存储时,如旋转磁盘用保守的值会是特别重要的。这不是我们的情况,因此我们有能力平衡random_page_cost到seq_page_cost。所以,我们这个参数设置为1,那么从4默认值了。

wal_level, max_wal_senders and archive_mode

要设置流复制wal_level需要被设置为至少“replica”,archive_mode必须启用。这个装置的WAL数据产生量增加显著相比使用默认设置时这些参数,这反过来又影响到IO。然而,我们认为这些与生产环境的初衷。

wal_compression

对于此工作负载,我们观察到总的 WALs 大小为 3359 GB,禁用wal_compression,1962 GB wal_compression。我们启用wal_compression来减少 IO (以及最重要的是写入磁盘的 WAL 文件)的数量(以及最重要的速率),但牺牲了一些额外的 CPU 周期。这被证明是非常有效的,因为我们有多余的CPU可用。

checkpoint_timeout、checkpoint_completion_target和max_wal_size

我们将checkpoint_timeout设置为 1 小时,checkpoint_completion_target 设置为 0.9。这意味着每 1 小时强制一个检查点,并且在下一个检查点之前有 90% 的时间来传播写入。但是,当生成 wal max_wal_size时,也会强制使用检查点。通过"sysbench-tpcc"工作负载的这些参数,我们看到每 1 小时有 3 到 4 个检查点。这特别是因为生成的 LL 数量。

在生产环境中,我们始终建议您在关闭 PostgreSQL 之前执行手动 CHECKPOINT,以便更快地重新启动(恢复)时间。在此背景下,发布手动 CHECKPOINT 花了我们 1 到 2 分钟的时间,之后我们只需大约 4 秒即可重新启动 PostgreSQL。请注意,在我们的测试环境中,需要时间重新启动 PostgreSQL 不是问题,因此使用此检查点速率对我们有利。但是,如果您负担不起几分钟的崩溃恢复时间,则始终建议强制更频繁地执行检查点,即使代价是性能下降。

full_page_writes、fsync 和synchronous_commit
我们将所有这些参数设置为 ON 以满足 ACID 属性。

autovacuum
我们启用了正在后台进行 autovacuum 和其他 vacuum 设置,以确保真空。
我们将讨论保持在生产环境中启用 autovacuum,以及以其他方式这样做的危险性,在一个单独的职位的重要性。

10小时sysbench-TPCC的后生成WAL的(事务日志)的量

在我们开始讨论数字需要强调的是,我们开始之前sysbench的启用wal_compression是很重要的。
如我们上面提到的,用“wal_compression”设定为OFF产生的WAL的量为多种具有压缩启用时比产生WAL量的两倍。
我们观察到,使wal_compression导致增加21%TPS。难怪,生产WAL的对IO的重要影响:以至于它是非常常见的发现的PostgreSQL服务器与仅WAL专用存储。
因此,为了强调这一事实,wal_compression可以通过额外的CPU使用率的费用节约IO受益写密集型工作负载是很重要的。

为了找出WAL的10小时后产生的总金额,我们注意到在WAL从我们开始测试前和测试结束后偏移:

WAL Offset before starting the sysbench-tpcc ⇒ 2C/860000D0
WAL Offset after 10 hours of sysbench-tpcc   ⇒ 217/14A49C50

和减去一个来自另一个使用pg_wal_lsn_diff,如下所示:

postgres=# SELECT pg_size_pretty(pg_wal_lsn_diff('217/14A49C50','2C/860000D0'));

pg_size_pretty
----------------
1962 GB
(1 row)

1962年GB WAL的10小时以上生产事务日志的一个相当大的量,考虑到我们已经启用wal_compression。

我们设想利用一个单独的磁盘来存储WAL多少更多的事务日志专用存储将有利于整体性能,找出。
但是,我们希望用Vadim 曾用他以前的测试相同的硬件保持,所以决定在此。

Crash unsafe parameters
设置 full_page_writes , FSYNC 和 synchronous_commit 为OFF可以加速性能,但它总是死机不安全,
除非我们有到位足够的备份来考虑这些需求。例如,如果您使用的是有一个日志文件系统COW,
你可能会被罚款与设置为OFF full_page_writes。这可能不是的,虽然时间真正100%。

然而,我们还是想分享在段落中提到以上作为参考崩溃不安全的参数结果。

PostgreSQL的sysbench tpcc运行10小时后的结果,具有默认、崩溃安全和崩溃不安全参数

考虑到上述每种情况,我们在运行sysbench tpcc 10小时后获得的最终数字如下:

参数

TPS

Default / Untuned

1978.48

Tuned (crash safe)

5736.66

Tuned (crash unsafe)

7881.72

我们想得到这些数字吗?是和不是。

当然,我们希望一个经过适当调整的服务器能够比一个使用默认设置运行的服务器有更好的性能,但是我们不能说我们希望它比默认设置运行的服务器好三倍(2.899)。由于PostgreSQL使用了OS缓存,特别是对共享缓冲区的优化并不总是会产生如此显著的影响。相比之下,调整MySQL的InnoDB缓冲池几乎总是有区别的。对于PostgreSQL的高性能,它取决于工作负载。在这种情况下,对于sysbench tpcc基准测试,调整共享缓冲区肯定会有所不同。

另一方面,在使用崩溃不安全设置时,体验额外的速度级(4倍)并不令人惊讶。

以下是PostgreSQL插入性能调整基准测试结果的另一种视图:

PostgreSQL的参数优化的更多相关文章

  1. PostgreSQL之性能优化(转)

    转载自:https://blog.csdn.net/huangwenyi1010/article/details/72853785 解决问题 前言 PostgreSQL的配置参数作为性能调优的一部分, ...

  2. 数据库顶会VLDB论文解读:阿里数据库智能参数优化的创新与实践

    前言 一年一度的数据库领域顶级会议VLDB 2019于美国当地时间8月26日-8月30日在洛杉矶召开.在本届大会上,阿里云数据库产品团队多篇论文入选Research Track和Industrial ...

  3. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  4. Windows下tcp参数优化

    Windows系统下的TCP参数优化2013-04-25      0 个评论       作者:最初的幸福ever收藏     我要投稿Windows系统下的TCP参数优化 TCP连接的状态与关闭方 ...

  5. paper 62:高斯混合模型(GMM)参数优化及实现

    高斯混合模型(GMM)参数优化及实现 (< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:of ...

  6. MySQL配置文件my.cnf参数优化和中文详解

    Mysql参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的 ...

  7. 内核参数优化/etc/sysctl.conf

    net.nf_conntrack_max = 65536000net.netfilter.nf_conntrack_tcp_timeout_established = 1200net.ipv4.tcp ...

  8. Limit参数优化MySQL查询的方法

    在做一些查询时,总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的.那么,在mysql中有那些方式是可以避免全表扫面?除了通过使用索引列或分区等方式来进行 ...

  9. MySQL参数优化

    目前针对MySQL数据库进行了一些参数优化,具体如下: my.ini / my.cnf 参数说明 #使用查询缓存 query_cache_size=100M                     # ...

随机推荐

  1. 7、Python变量流程基础(变量、赋值、格式化、运算符、流程控制、range()函数)

    一.执行Python程序的两种方式 1.交互式 在终端内输入“python3”,然后输入python代码 2.命令行式 在终端内输入“python3 文本文件路径” 二.变量 1.变量的组成 Pyth ...

  2. 36大数据和about云的文章总结

    36大数据: 白话机器学习 http://www.36dsj.com/archives/78385 基于Hadoop的数据仓库Hive 基础知识(写的很好) http://www.36dsj.com/ ...

  3. Dynamics 365 On-premises和Online 的不同

    1.新建账号的不同:on-premises(下文简称op)是和ad绑定的,所以必须先在ad中新建账号后才能在CRM中新建.而online是和Office365(下文简称O365)绑定的,所以需在O36 ...

  4. Java基础(八 前面补充)

    1.笔记 1.局部内部类 如果一个类是定义在一个方法内部的,那么这就是一个局部内部类. “局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了. 定义格式: 修饰符 class 外部类名称 ...

  5. Idea中,项目文件右键菜单没有svn选项处理办法

    问题描述 IntelliJ IDEA打开带SVN信息的项目,在项目文件上点击右键,菜单中没有Subversion的功能项,如下图: 解决办法 点击菜单:VCS -> Enabled Versio ...

  6. C# 跨线程对控件赋值

    第一种 跨线程对控件赋值 private void button2_Click(object sender, EventArgs e) { Thread thread1 = new Thread(ne ...

  7. 【NOIP 2017】宝藏 D2 T2

    参考From 传送门 写的很清晰了 AC code: #include <bits/stdc++.h> using namespace std; const int MAXN = 12; ...

  8. 让一个项目同时提交到码云和GitHub两个仓库

    在项目目录里找到.git文件夹然后找到config文件. 打开这个文件后找到下面的代码 [remote "origin"] url = git提交地址 fetch = +refs/ ...

  9. LeetCode 731. My Calendar II

    原题链接在这里:https://leetcode.com/problems/my-calendar-ii/ 题目: Implement a MyCalendarTwo class to store y ...

  10. learning scala repreated parameters