openGauss洗冤录 之 copy from

news2024/10/6 11:31:39

openGauss洗冤录 之 copy from

图片.png

引子

之前一篇《测评报告:文件导入哪家强?》关于openGauss性能与预期不符的问题留下了个坑,今天回来填坑。

前文提到使用openGauss的copy from导入csv文件耗时是mysql的2倍,是PostgreSQL的6倍,这个结果与我预期结果有较大的差距。由于之前的测试都是基于各数据库产品的默认配,所以,未必能反应出其真实性能,尤其是openGauss,我个人认为其性能是被严重低估了。这篇文章将通过参数的调整/优化,看看是否可以还原openGauss的真实性能。由于能力有限,也欢迎大家留言反馈更好的优化方案。

测试场景

测试环境

这里使用的是信创环境的虚拟机和过程开源操作系统openEuler。

服务器

配置参数
CPUKunpeng-920
Architectureaarch64
On-line CPU(s) list0-7
CPU主频2600MHz

操作系统

NAME="openEuler"
VERSION="20.03 (LTS-SP2)"
ID="openEuler"
VERSION_ID="20.03"
PRETTY_NAME="openEuler 20.03 (LTS-SP2)"
ANSI_COLOR="0;31"

系统性能

  • 以下是unixbench跑分,供对比参考
------------------------------------------------------------------------
Benchmark Run: Wed Dec 07 2022 15:48:16 - 15:57:14
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       40999324.8 lps   (10.0 s, 2 samples)
Double-Precision Whetstone                     4314.8 MWIPS (9.3 s, 2 samples)
Execl Throughput                               3762.5 lps   (29.8 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks        685100.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks          189282.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks       1992147.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                             1231178.1 lps   (10.0 s, 2 samples)
Pipe-based Context Switching                 105636.0 lps   (10.0 s, 2 samples)
Process Creation                               8963.6 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                   7087.6 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                   3055.4 lpm   (60.0 s, 1 samples)
System Call Overhead                         907956.1 lps   (10.0 s, 2 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   40999324.8   3513.2
Double-Precision Whetstone                       55.0       4314.8    784.5
Execl Throughput                                 43.0       3762.5    875.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     685100.0   1730.1
File Copy 256 bufsize 500 maxblocks            1655.0     189282.0   1143.7
File Copy 4096 bufsize 8000 maxblocks          5800.0    1992147.0   3434.7
Pipe Throughput                               12440.0    1231178.1    989.7
Pipe-based Context Switching                   4000.0     105636.0    264.1
Process Creation                                126.0       8963.6    711.4
Shell Scripts (1 concurrent)                     42.4       7087.6   1671.6
Shell Scripts (8 concurrent)                      6.0       3055.4   5092.4
System Call Overhead                          15000.0     907956.1    605.3
                                                                   ========
System Benchmarks Index Score                                        1258.0

------------------------------------------------------------------------
Benchmark Run: Wed Dec 07 2022 15:57:14 - 16:06:18
8 CPUs in system; running 16 parallel copies of tests

Dhrystone 2 using register variables      326630138.1 lps   (10.0 s, 2 samples)
Double-Precision Whetstone                    35757.3 MWIPS (8.7 s, 2 samples)
Execl Throughput                              23047.5 lps   (29.7 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks        525702.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks          139688.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks       1834232.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                             9754452.8 lps   (10.0 s, 2 samples)
Pipe-based Context Switching                1181849.8 lps   (10.0 s, 2 samples)
Process Creation                              42295.7 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                  32399.6 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                   4529.9 lpm   (60.1 s, 1 samples)
System Call Overhead                        3386402.8 lps   (10.0 s, 2 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  326630138.1  27988.9
Double-Precision Whetstone                       55.0      35757.3   6501.3
Execl Throughput                                 43.0      23047.5   5359.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     525702.0   1327.5
File Copy 256 bufsize 500 maxblocks            1655.0     139688.0    844.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    1834232.0   3162.5
Pipe Throughput                               12440.0    9754452.8   7841.2
Pipe-based Context Switching                   4000.0    1181849.8   2954.6
Process Creation                                126.0      42295.7   3356.8
Shell Scripts (1 concurrent)                     42.4      32399.6   7641.4
Shell Scripts (8 concurrent)                      6.0       4529.9   7549.8
System Call Overhead                          15000.0    3386402.8   2257.6
                                                                   ========
System Benchmarks Index Score                                        4252.8

数据准备

使用benchmarksql-5.0中的历史表作为被测表,建表脚本如下:

create table bmsql_history (
  hist_id  integer,
  h_c_id   integer,
  h_c_d_id integer,
  h_c_w_id integer,
  h_d_id   integer,
  h_w_id   integer,
  h_date   timestamp,
  h_amount decimal(6,2),
  h_data   varchar(24)
);

测试数据生成脚本

根据字段类型写了一个生成测试数据的脚本,代码如下:

# -*- coding=utf-8 -*-

import csv
import random
import time
import string

# 创建列表,保存header内容
header_list = ["hist_id", "h_c_id", "h_c_d_id", "h_c_w_id", "h_d_id", "h_w_id", "h_date", "h_amount", "h_data"]

g_count = 0

def random_list(n):
    data_list = []
    global g_count
    for i in range(n):
        g_count = g_count + 1
        l = [g_count, 
        random.randint(0,1000),
        random.randint(0,1000), 
        random.randint(0,1000),
        random.randint(0,1000),
        random.randint(0,1000), 
        time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 
        #random.randint(0,1000), 
        round(random.uniform(0, 9999.0), 2), 
        ''.join(random.sample(string.ascii_letters + string.digits, 20))
        ]
        data_list.append(l)
    
    return data_list

# 以写方式打开文件。注意添加 newline="",否则会在两行数据之间都插入一行空白。
with open("bmsql_history.csv", mode="w", encoding="utf-8", newline="") as f:
    
    # 基于打开的文件,创建 csv.writer 实例
    writer = csv.writer(f)

    # 写入 header。
    # writerow() 一次只能写入一行。
    writer.writerow(header_list)

    # 写入数据。
    # writerows() 一次写入多行。
    for i in range(10000):
        writer.writerows(random_list(1000))

测试数据

执行脚本后会生成10000000行测试数据,具体如下图:

图片.png

初始性能

PostgreSQL

  • 版本信息

图片.png

  • 测试结果
postgres=# copy bmsql_history from '/home/postgres/bmsql_history.csv' delimiter ','
postgres-# ;
COPY 10000000
Time: 19829.354 ms (00:19.829)

openGauss

  • 版本信息
openGauss=# select version();
                                                                        version
-------------------------------------------------------------------------------------------------------------------------------------------------------
 (openGauss 3.1.0 build 4e931f9a) compiled at 2022-09-29 14:19:54 commit 0 last mr   on aarch64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)
  • 测试结果
openGauss=# \timing
Timing is on.
openGauss=# copy bmsql_history from '/home/omm/bmsql_history.csv' delimiter ',';
COPY 10000000
Time: 122703.615 ms
openGauss=# select version();

测试结果对比

  • 耗时
openGauss 3.1.0PostgreSQL 16devel
122703.615 ms19718.946 ms

优化

分析

PostgreSQL

基版本数据

图片.png

耗时:19718.946 ms

top

从资源使用上看,CPU使用并不高,说明可能是内存或I/O交互可能存在瓶颈,top显示基本可以确认这一点,wa在15(wa > 5说明已经存在I/O瓶颈)

图片.png

说明:1. worker的CPU使用率为12.9%,说明server端并未达到最大化性能。2.wa为15.7,说明I/O延时已经成为瓶颈,且存在一定的硬中断hi,3. sy:us 为1.1:2.3,也能说明内核的I/O操作频繁;

perf

perf检查热点,看上去比较正常。

图片.png

与PostgreSQL的perf(下图)相差不多。
图片.png

优化一

优化项

调整shared_buffers

# shared_buffers = 64MB # openGauss默认为64MB
shared_buffers = 128MB

图片.png

说明:shared_buffers = 128MB 于PostgreSQL的默认出世配置相同;先把openGauss和PostgreSQL的shared_buffers起跑线拉齐。I/O有下降,CPU使用率也有明显提升。

测试结果

图片.png

耗时:34516.500 ms

极限优化

上面对shared_buffers的优化的测试结果说明shared_buffers优化有效,所以可以按照这个思路继续进行优化,索性可以将shared_buffers调整为1GB。

图片.png

说明:shared_buffers足够大的情况下CPU基本上可以跑满了,IO延迟也基本稳定。结果如下:

图片.png

耗时:26735.371 ms

优化二

优化项

通过一些常用的优化参数试试效果。

audit_enabled = off
bulk_write_ring_size = 2GB
enable_beta_opfusion = on
enable_opfusion = on
hot_standby = off
wal_log_hints = off
work_mem = 64MB

图片.png

测试结果

可以看到,IO等待有明显下降,CPU以达到极限。

图片.png

耗时:24533.859 ms

优化三

优化项

开启线程池进行尝试,因为使用的是虚机,只有你个NUMA节点,所以预估只开启线程池,不绑定NUMA节点应该没有什么效果。同时关闭一些不必要选项试试效果。

enable_thread_pool = on
fsync = off
use_workload_manager = off
enable_resource_track = off
enable_instr_cpu_timer = off

图片.png

说明:使用线程池优化并不明显。

测试结果

图片.png

耗时:23859.255 ms

测试结果

图片.png

从结果上看,尽快进行了一些优化,基本上已经接近PostgreSQL的性能,但还有少许差距(最优情况是PostgreSQL的1.2倍左右)。但经过一系列的优化,最优性能是初始性能的5.14倍。主要提升是通过增大shared_buffers 来增加缓存数据,减少IO和内存交互。

总结

对于copy功能PostgreSQL从9.2.4到16devel是否有过优化?或者openGauss是否持续合并或优化PostgreSQL的copy功能,这方面我没有去考证过。单纯从测试结果上看,openGauss的copy性能要略逊于PostgreSQL。当然,可能是我水平有限,所以希望各位openGauss的专家、老师集思广益,还openGauss一个真实的COPY FROM文件导入性能。(大家可以回复优化方案,我这边去做验证)

附录

truncate bmsql_history;
\timing
copy bmsql_history from '/home/postgres/bmsql_history.csv' delimiter ',';
copy bmsql_history from '/home/omm/bmsql_history.csv' delimiter ',';

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

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

相关文章

下载nacos-server-1.1.4安装包,使用mvn打包

git官方地址下载nacos-server-1.1.4.zip速度太慢,码云上下载地址没有安装包。采用从码云上下载源码,自行打包。(https://gitee.com/mirrors/Nacos/tree/1.1.4)下载完成之后,进入项目目录如图 下载源码后 ,解压 本地在本文件夹 在d…

这十套练习,教你如何用Pandas做数据分析(03)

练习3-数据分组 探索酒类消费数据 步骤1 导入必要的库 运行以下代码 import pandas as pd 步骤2 从以下地址导入数据 运行以下代码 path3 ‘…/input/pandas_exercise/pandas_exercise/exercise_data/drinks.csv’ #‘drinks.csv’ 步骤3 将数据框命名为drinks 运行以下代…

SpringBoot+Vue实现前后端分离的航空售票管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

JavaScript(一):编写位置、输入输出语句

JavaScript入门一、 JavaScript编写位置二、输入输出语句一、 JavaScript编写位置 (1)编写到script标签中 控制浏览器弹出一个警告框 alert("警告内容")让计算机在页面中输出一个内容 document.write() /*可以向body中输出一个内容*/向控制…

基于java+springboot+mybatis+vue+mysql的自媒体社区平台

项目介绍 近几年来自媒体平台的发展越来越迅猛,并逐渐成为新闻信息传播的主流模式,自媒体平台的内容构成没有主要的核心,新闻信息的探讨和传播环境比较自由,与此同时自媒体平台概念的应用与发展,赋予了普通民众发表自己感想的权利…

OneUI 5.5.0 for HTML/PHP/VueJS

OneUI 是一个高度通用的 Bootstrap 管理仪表板模板和 UI 框架,支持 Laravel,可让您以相同的速度和稳健的布局创建各种网站。它是使用 Sass 和 ECMAScript 6 (ES6) 开发的,并为开发人员提供了各种智能工具,如 webpack5、Babel 7、G…

如何避免SCI写作中的中式思维以及无处不在的Chinglish

现在随着全球经济的下行,很多小伙伴都选择了延时就业,因此更多的人开始考研和考博。新东方大学生学习与发展中心发布的《新东方2023考研报告》预测:2023考研报名将超过520万人。俗话说(我道听途说的):一入科…

一文教你数据结构体栈和队列的实现

前言: 关于c语言的学习已经差不多更新完毕,如果发现个别知识点,我还会继续更新,但目前已经准备往c和数据结构的重心挪动,这篇文章就是向大家讲述数据结构中栈和队列的实现。 💞 💞 欢迎来到小…

VoIP通话-基于SIP协议的Asterisk(一)-实现流程

文章首发及后续更新:https://mwhls.top/4122.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! VoIP通话-基于SIP协议的Asterisk该篇仅包含实现流程&#…

实验12 动态查找2022

A. DS二叉排序树之创建和插入 给出一个数据序列,建立二叉排序树,并实现插入功能 对二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第…

Vue 基础详解 | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Vue 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答…

spring——AOP面向切面编程—— 自动代理——根据 Bean 名称创建代理对象根据切面中信息创建代理对象...

自动代理 在前面的案例中,所有目标对象(Target Bean)的代理对象(Proxy Bean)都是在 XML 配置中通过 ProxyFactoryBean 创建的。 但在实际开发中,一个项目中往往包含非常多的 Bean, 如果每个 Bean 都通过 ProxyFactoryBean 创建,那…

MySQL~InnoDB关键特性(插入缓存、俩次写、自适应哈希索引、异步IO

一般情况下,主键是行唯一的标识符。通常应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取。因为,对于此类情况下的插入,速度还是非常快的。 如果索引…

Selenium4+Python3系列 - 测试框架的设计与开发

框架搭建 整个框架的实现,大约也就1.5天,关于框架的开发并不是很难,主要难在测试报告增加失败自动截图功能和echart的饼子图统计功能,两者的整合花了近半天的时间吧。 效果: 1、核心思想 延续使用Page Object和Page …

RabbitMQ入门(三)消息应答与发布确认

前言: 消息应答与发布确认都是保证消息不丢失。而重复消费问题则是消息幂等性。(之后会说幂等性) 消息应答: 应答功能属于消费者,消费者在接收到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了&…

深度学习——残差网络(ResNet)笔记

残差网络:经常使用的网络之一 1.随着神经网络的不断加深能改进精度吗? 不一定 ①蓝色五角星表示最优值,Fi闭合区域表示函数,闭合区域的面积代表函数的复杂程度。在这个区域能够找到一个最优的模型(区域中的一个点表…

「重学JS」带你一文吃透作用域与闭包

前言 学习了这么久前端,发现自己对于基础知识的掌握并没有那么通透,于是打算重新学一遍JS,借用经济学的一句话:JS基础决定能力高度🤦🏻 基础很重要,只有基础好才会很少出 bug,大多数…

二叉树的性质

由于二叉树的结构特殊,会有一系列的数学性质 性质一:对于一棵二叉树,第i层的最大结点数量为 个,比如二叉树的第一层只有一个根结点,而二叉树的第三层可以有 个结点。 性质二:对于一棵深度为k的二叉树&am…

【Python】函数

文章目录1. 函数介绍2. 函数的定义与调用3. 函数参数4. 函数返回值5. 变量作用域6. 函数执行过程7. 链式调用8. 嵌套调用9. 函数递归10. 参数默认值11关键字参数1. 函数介绍 编程中的函数不同于数学中的函数: 数学上的函数,比如 y sin x,x…

Vue快速上门|了解MVVM

1.1、先了解下MVVM VUE是基于MVVM思想实现的,❓那什么是MVVM呢?—— MVVM,是Model-View-ViewModel的缩写,是一种软件架构模式。其核心思想就是分离视图、数据、逻辑,VUE框架解决了数据Model到视图View的双向绑定,我们只关注业务逻辑ViewModel即可,极大的提高的编程效率…