热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++未加载ntdll.pdb_MySQLShell转储和加载第2部分:基准测试

作者:KennyGryp译:徐轶韬这是有关MySQLShellDump&Load的博客文章系列的第2部分:MySQLShell转储和加载第

作者:Kenny Gryp 译: 徐轶韬

这是有关MySQL Shell Dump&Load的博客文章系列的第2部分:

  • MySQL Shell转储和加载第1部分:演示!

关于新的MySQL Shell Dump&Load实用程序的第二部分旨在演示性能,同时还将其与其他各种逻辑转储和加载工具进行比较:mysqldump,mysqlpump&mydumper

为了使数字更有意义,我使用了一些在线提供的真实的生产数据集:stackoverflow.com,en.wikipedia.org,准时飞行数据以及这3种数据的组合。

数据库环境

测试是在具有大量CPU,RAM和存储性能的高端服务器上执行的。转储/加载工具和服务器都位于同一主机上。

  • Oracle Linux 7.8

  • OCI裸机实例BM.Standard.B1.44

    • 44x Intel Xeon E5-2699 v4。基本频率2.2 GHz,最大加速频率3.6 GHz,启用超线程(总共88个可见核心)

    • 512 GB内存

    • 25 Gbps网络(同时供块存储使用)

  • 3.2 TB 存储:8个块卷,RAID-0条带化MD,每个400GB

  • MySQL社区版服务器8.0.21

  • InnoDB重做日志已禁用(同时禁用双写):

ALTER INSTANCE DISABLE INNODB REDO_LOG;

MySQL配置(其他设置只是默认设置):

[mysqld]innodb_dedicated_server=oninnodb_numa_interleave=oninnodb_adaptive_hash_index=0innodb_change_buffering=nonelocal_infile=1skip_log_bininnodb_buffer_pool_instances=16innodb_read_io_threads=16innodb_write_io_threads=16innodb_io_capacity=40000innodb_io_capacity_max=60000innodb_max_dirty_pages_pct=10

转储和加载工具-用法

每种工具的转储和加载方式不同,如下所述。

mysqldump

  • 由于mysqldump没有内置压缩功能,转储输出已通过管道传递到zstd

  • 使用mysqldump,转储和加载都是单线程的。

转储:

$ mysqldump --single-transaction \ --databases \ | zstd -z

加载:

$ zstd -d --stdout \ | mysql

mysqlpump

  • mysqlpump内置的压缩功能,既zliblz4,lz4目前最快的选择,zlib非常缓慢。

  • mysqlpump可以在多个线程中转储数据,但仅限于表级别。如果有一个很大的表,它将仅使用1个线程转储。

  • mysqlpump生成一个类似于的SQL文件,并且加载数据是单线程的。

转储:

$ mysqlpump --default-parallelism=88 \ --compress-output lz4 \ --databases \ >

加载:

$ lz4cat | mysql

mydumper

  • mydumper能够并行转储数据,并且在使用--rows选项时还可以并行转储单个表。 myloader还提供并行加载数据。

  • 表分成约250.000行的大块,并且还启用了zlib压缩。

转储:

$ mydumper --rows 250000 \ -c \ --trx-consistency-only \ -t 88 \ -B \ -o

加载:

$ myloader -t 88 \ -d

MySQL Shell转储/加载

  • 数据以约256 MB的块的形式转储

转储:

mysqlsh-js> util.dumpSchemas([""], "", {threads: 88, bytesPerChunk: "256M"})

加载:

mysqlsh-js> util.loadDump("", {threads: 88})

数据集

每个数据集均可下载。

准时飞行数据

1987年至2020年4月的航空公司航班准点统计。

  • 可在transtats.bts.gov上获得

  • 一个单独的MySQL表,一个主键,没有辅助键

  • 未压缩的TSV大小:64 GB

  • 194,699,018行

Stackoverflow.com

stackoverflow.com数据

  • 在archive.org上可下载

  • 未压缩的TSV大小:216 GB

  • 502,676,396行

EN维基百科

EN维基百科备份,始于20200620

  • 下载的enwiki备份

  • 未压缩的TSV大小:130 GB

  • 1,673,892,597行

  • 频繁使用  binary数据类型

所有

合并以上所有数据集

  • 数据集不适合内存

  • 未压缩的TSV大小:410 GB

  • 2,371,268,011行

基准测试结果

是时候显示一些结果了……

转储

ab2063c5a6dea92cf9c0b859b64f6386.png

  • 正如所料,mysqldumpmysqlpump缺乏或受限于并行转储。

  • 对于mysqlpump,所有数据集中只有足够的大表才能提高转储吞吐量。

  • 使用mydumper和MySQL Shell与其他工具相比较,有很大的不同

  • 除1种情况外,MySQL Shell是最快的,有时甚至快得多(stackoverflow)

    • mydumper慢的一个原因可能是它使用的zlib压缩比zstd要慢

    • mydumper转存维基百科的速度比MySQL Shell快,这可能是因为Wikipedia数据集包含许多二进制列,MySQL Shell将其转换为base64格式, mydumper不进行转换。MySQL Shell 8.0.22将包含进一步的改进。

加载

除了禁用InnoDB重做日志,MySQL Server 8.0.21还包括对锁管理器的改进,它通过替换锁系统互斥体(lock_sys->mutex)来提高InnoDB的写可伸缩性。这样可以提高写入性能,尤其是在NUMA节点距离较远的环境中(例如AMD Epyc Naples)。

警告:禁用InnoDB重做日志仅用于将数据加载到新的MySQL实例中。不要在生产系统上禁用重做日志记录,禁用重做日志记录时  服务器意外停止可能/将导致数据丢失和实例损坏。

d74687c47f8a011b2856ab83ec64150f.png

  • mysqldumpmysqlpump生成单个.sql文件,加载数据是单线程的,因此它们慢得多。

  • MySQL Shell的速度比myloader 所有情况都要快,这是由于其调度算法所致,本博文系列的第3部分对此进行了解释。

二级索引影响写入吞吐量

使用stackoverflow和Wikipedia数据集的情况下,存在的二级索引越多,则预期的写吞吐量就越慢。

MySQL Shell能够在加载数据后(带有deferTableIndexes选项)创建二级索引,但事实上,加载后添加索引会使数据集的整个过程变慢,因此通常不是最佳选择。mysqlpump默认情况下会执行此操作,但与我们使用myloader和MySQL Shell 获得的结果相比,性能提升可忽略不计。

分区可以帮助大表

那么为什么加载准时飞行数据表比其他数据集慢呢?

原因是准时数据集由单个表组成。瓶颈在InnoDB中表级别(索引锁定和页面锁定)。当我们对ontime表进行分区(在这种情况下为128个KEY()分区)时,写入吞吐量显着增加,尤其是在使用MySQL Shell时:

dcf506b2b7ae1738ba85229aab0d02a5.png

当MySQL Shell跟踪加载进度时,首先可以通过仅加载DDL,进行更改,然后加载其余的转储来添加分区:

mysqlsh-js> util.loadDump("", {threads: 88 loadData: false})mysqlsh-js> \sql ALTER TABLE ontime.ontime PARTITION BY KEY() PARTITIONS 128;mysqlsh-js> util.loadDump("", {threads: 88})

MySQL Shell转储和加载:快!

如这些基准测试所示,MySQL Shell能够快速转储数据,最高可达3GB / s的速度,并以200MB / s以上的速度加载数据(禁用InnoDB重做日志时)。下一篇博客文章将介绍Shell如何实现这种转储和加载性能。

感谢您关注“MySQL解决方案工程师”!

ad8c781659834e82acd26908986caaf7.png




推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
author-avatar
vm经典全屏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有