`
丁林.tb
  • 浏览: 797233 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于InnoDB中buf_page_is_corrupted的优化

阅读更多

函数buf_page_is_corrupted (innodb_plugin/buf/buf0buf.c)这个函数,是在InnoDB中获取page数据后,对page作校验,判断内容是否损坏。

在压力测试中发现,innodb.so最耗费cpu的就是这个buf_page_is_corrupted

       Percona对这个函数作了优化。本文介绍与此有关的配置、优化原理以及进一步的优化空间。(当前版本5.1.48 innodb-plugin 1.0.9)

1、函数主流程

每个page头部的前四个字节是本pagechecksum page写入时计算得到。因此函数主流程如下:

a)        读前四个字节得到checksum_field

b)        page重新计算checksum, buf_calc_page_new_checksum(read_buf)

c)        ab的结果相同则认为page未损坏。

 

2、              函数瓶颈

              显然函数主要计算时间在buf_calc_page_new_checksum中,后者直接调用ut_fold_binary(实现位置 ./include/ut0rnd.ic)。我们来看这个ut_fold_binary的函数实现:

UNIV_INLINE
ulint
ut_fold_binary(
/*===========*/
        const byte*     str,    /*!< in: string of bytes */
        ulint           len)    /*!< in: length */
{
        const byte*     str_end = str + len;
        ulint           fold = 0;
        ut_ad(str || !len);
        while (str < str_end) {
                fold = ut_fold_ulint_pair(fold, (ulint)(*str));
                str++;
        }   
        return(fold);
}

  

 

 

说明:其中ut_fold_ulint_pair的第二个参数表明,在该函数中,是以一个uint方式使用的(如下)。该函数在同一个文件中,通过两个uint的异或和移位得到返回值。但在第13行中的str++ 使得每个字节都被使用了4次。

ut_fold_ulint_pair(
/*===============*/
        ulint   n1,     /*!< in: ulint */
        ulint   n2)     /*!< in: ulint */
{
        return(((((n1 ^ n2 ^ UT_HASH_RANDOM_MASK2) << 8) + n1)
                ^ UT_HASH_RANDOM_MASK) + n2);
}

 

 

      

3、              优化

Percona版本的改进中,将实现了一个新的函数ut_fold_ulint_pair_32, 将步进修改为4个字节。

实际上,将16k数据签名成4个字节,使用前后两种方法的信息损失是相同的,因此优化版本概率上并不损失准确性。

 

64位机器上,若每次直接取两个unsigned longut_fold_ulint_pair操作(当然需要为此写一个ut_fold_ulint_pair_64函数),计算速度相同,但步进长度加倍,能够进一步优化此函数性能。

代码上需要作如下修改

a)        ./include/ut0rnd.ic ./include/ut0rnd.h 中增加ut_fold_binary_64的定义和声明

b)        buf/buf0buf.c中增加buf_calc_page_new_checksum_64, 并在buf_page_is_corrupted增加调用

c)        buf_flush_init_for_writing(buf/buf0flu.c)中,写入page前换用buf_calc_page_new_checksum_64得到checksum

 

4、              测试结果

sysbench作压力,并计算三种buf_calc_page_new_checksum的平均执行时间。得益于神器SystemTap,不需要再另外统计时间的代码(痛苦回忆中)

函数

平均执行时间

buf_calc_page_new_checksum

65ms

buf_calc_page_new_checksum_32

24ms

buf_calc_page_new_checksum_64

16ms

             

1
0
分享到:
评论

相关推荐

    py_innodb_page_info工具

    总的来说,`py_innodb_page_info`是MySQL数据库管理员和开发者的得力助手,它提供了深入理解InnoDB存储引擎内部运作的工具,使我们能够更好地调试问题、优化性能和设计更高效的数据模型。通过学习和使用这个工具,...

    py_innodb_page_info.zip

    《MySQL技术内幕-InnoDB存储引擎》是一本深入探讨MySQL数据库InnoDB存储引擎的权威书籍,而`py_innodb_page_info.zip`则是该书中提到的一个实用工具,用于分析InnoDB存储引擎的数据页信息。这个Python工具帮助我们...

    py_innodb_page_info工具类 包含python2,python3两个版本

    py_innodb_page_info工具为《INNODB存储引擎》作者姜承尧写的。 该工具用来分析表空间中的各页得类型和信息,用python编写。 网上多是python2版本的,这里给出python3版本的。

    py_innodb_page_info.py

    《Python解析MySQL InnoDB页面信息:py_innodb_page_info.py》 在数据库管理领域,深入理解存储引擎的内部工作原理对于优化查询性能和解决数据问题至关重要。MySQL的InnoDB存储引擎是广泛使用的,它提供了事务处理...

    使用innodb_force_recovery解决MySQL崩溃无法重启问题

    在这种情况下,"innodb_force_recovery"是一个紧急恢复工具,可以用来尝试启动数据库服务,即使数据文件可能存在损坏。本篇文章将详细探讨如何利用这个参数来解决MySQL崩溃的问题,以及其背后的原理和潜在风险。 一...

    MySQL Innodb 参数详解与优化实践

    如果设置为空字符串,可以在`innodb_data_file_path`中指定绝对路径。 - **应用场景**:适用于需要自定义InnoDB表空间存放位置的情况,例如分离存储以提高性能或简化管理。 ##### 2. `innodb_data_file_path` - **...

    MySQL修改innodb_data_file_path参数的一些注意事项

    在测试环境下没有设置过多的详细参数就初始化并启动了服务,后期优化的过程中发现innodb_data_file_path设置过小: root@node1 14:59: [(none)]&gt; show variables like '%innodb_data_file_path%'; +

    InnoDB存储引擎中有页(Page)的概念

    InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小: mysql&gt; show variables like 'innodb_page_size'; 而系统一个磁盘块的...

    InnoDB_Log_Structures

    - `innodb_log_files_in_group`:日志组中重做日志文件的数量。 - `innodb_log_file_size`:每个重做日志文件的大小。 - `innodb_log_files_group`:用于指定日志组。 - `innodb_flush_log_at_trx_commit`:决定日志...

    浅析在线调整 innodb_buffer_pool_size

    在innodb存储引擎中数据访问以page为单位,page也是innodb管理数据库的最小磁盘单位,每个page的默认大小为16KB(可以通过参数innodb_page_size进行调整,在5.7增加了对32KB和64KB的大小支持,在此之前的版本支持4KB,...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    此外,书中会讨论InnoDB的崩溃恢复、性能优化策略,如索引的使用、查询优化、事务处理的最佳实践等。读者还将了解到如何通过监控和分析工具来诊断和解决问题,提升数据库的稳定性和效率。 总而言之,《MySQL技术...

    py_innodb_page_type.tar.gz_page

    总之,"py_innodb_page_type"提供的功能可以帮助我们深入理解InnoDB存储引擎的内部运作,特别是关于大页的使用,这对于数据库管理员和开发人员来说,是优化数据库性能、解决存储问题的关键工具。通过Python进行这样...

    MYSQL innodb性能优化学习总结

    - **innodb_buffer_pool_size**:InnoDB的缓冲池大小,建议设置为系统内存的60%至80%,以便将数据和索引存储在内存中,减少磁盘I/O操作。 - **innodb_buffer_pool_instances**:缓冲池实例数。当innodb_buffer_...

    innodb_force_recovery.zip

    `innodb_force_recovery`是MySQL中的一个服务器系统变量,其目的是在InnoDB引擎遇到问题时,尽可能地让数据库启动并允许用户备份数据。该参数有6个不同的级别(0-5),每个级别代表一种更激进的恢复策略。随着级别的...

    关于MySQL innodb_autoinc_lock_mode介绍

    MySQL的InnoDB存储引擎在处理带有`auto_increment`列的表时,会受到`innodb_autoinc_lock_mode`参数的影响。这个参数决定了插入数据时如何管理自动递增锁,从而在性能和数据安全性(主从数据一致性)之间取得平衡。 ...

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    MySQL 数据库中的 `innodb_flush_log_at_trx_commit` 和 `sync_binlog` 是两个非常重要的配置参数,它们直接影响到数据库的性能与数据安全性。理解并合理设置这两个参数对于优化数据库系统至关重要。 首先,`innodb...

    mysql 5.6 新特性-innodb

    InnoDB 是 MySQL 最常用的存储引擎之一,在 MySQL 5.6 中得到了显著的增强,特别是在性能和功能方面。 ##### 性能优化 1. **Read-Only Transactions(只读事务)**: - **第一层优化**:通过区分只读事务与更新...

    MySQL的Innodb引擎配置说明.txt

    内容包括: 1.MySQL的Innodb引擎配置 1.如何配置MySQL服务器的最大连接数量 2.如何配置innodb_open_files,table_open_cache,innodb_file_io_threads和innodb_buffer_pool_size,innodb_log_file_size

Global site tag (gtag.js) - Google Analytics