`
san_yun
  • 浏览: 2662757 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

robbin谈MySQL InnoDB性能调整的一点实践

 
阅读更多

因为JavaEye网站的数据库服务器搬家的时候被托管商的工作人员狠狠摔了一下,所以硬盘整个挂掉了,我重新安装数据库服务器的时候,顺手下载了 Percona patch过的MySQL5.0版本,使用MySQL自带的heavy innodb配置文件改了改,作为my.cnf启动运行。数据库服务器的物理内存有6GB,其中有4GB可以被MySQL使用,my.cnf相关配置参数 如下:

C代码  收藏代码
  1. memlock  
  2. innodb_buffer_pool_size = 2G  
  3. innodb_log_file_size = 256M  
  4. innodb_log_files_in_group = 3  
  5. #innodb_flush_method=fdatasync 默认设置  



buffer pool越大越好,官方推荐使用物理内存的50%-80%;log_file_size也是越大越好,官方推荐log size加起来要达到buffer pool的25%-100%。使用memlock可以避免MySQL内存进入swap,这些都是默认的推荐配置了,没有什么可以质疑的地方。但是数据库服 务器启动以后,运行不太正常。表现出来的现象是:

1、操作系统内存Disk Cache使用了2.7GB
2、操作系统swap空间使用了200MB左右,一直不停进行swap in/swap out
3、CPU的IO Wait偏高,平均在10%以上

这个现象看起来非常怪异和矛盾。IO Wait偏高显然是因为频繁的使用swap进行内存换页引起的,但问题是物理内存非常空闲,操作系统明明有2.7GB空闲物理内存做Disk Cache,怎么不吐出来一点,非要去用swap呢?

想来想去只有一种可能性,就是MySQL存在非常巨大的,频繁的文件读写操作,迫使操作系统不得不分配了2.7GB的Disk Cache,从而造成了物理内存的不足,被迫使用swap。而可能造成巨大文件读写操作的就是buffer pool的flush和log file的flush操作了。因此配置文件做如下修改:

C代码  收藏代码
  1. memlock  
  2. innodb_buffer_pool_size = 2G  
  3. innodb_log_file_size = 64M  
  4. innodb_log_files_in_group = 2  
  5. innodb_flush_method=O_DIRECT  



减少log file size和数量,使用O_DIRECT。重启以后,数据库服务器恢复正常。操作系统Disk Cache下降到900MB,Swap使用了200多MB,但是不再进行swap in/swap out操作,CPU的IO Wait下降到2-3%。

通过这次MySQL InnoDB的调优经历,发现一些和MySQL官方推荐配置不符合的疑惑之处,值得思考和探索:

1、innodb_flush_method究竟应不应该使用O_DIRECT?

所有MySQL调优的建议都说,如果硬件没有预读功能,那么使用O_DIRECT将极大降低InnoDB的性能,因为O_DIRECT跳过了操作系统的文件系统Disk Cache,让MySQL直接读写磁盘了。

但是在我的实践中来看,如果不使用O_DIRECT,操作系统被迫开辟大量的Disk Cache用于innodb的读写缓存,不但没有提高读写性能,反而造成读写性能急剧下降。而且buffer pool的数据缓存和操作系统Disk Cache缓存造成了Double buffer的浪费,显然从我这个实践来看,浪费得非常厉害。

说O_DIRECT造成MySQL直接读写磁盘造成得性能下降问题,我觉得完全是杞人忧天。因为从JavaEye的数据库监测来看,Innodb 的buffer pool命中率非常高,有98%以上,真正的磁盘操作是微乎其微的。为了1%的磁盘操作能够得到Disk Cache,而浪费了98%的double buffer内存空间,无论从性能上看,还是从内存资源的消耗来看,都是非常不明智的。

2、innodb_log_file_size究竟应该大一点,还是小一点?

所有MySQL调优建议都说,innodb_log_file_size要越大越好,避免无谓的buffer pool的flush操作。

但是在我的实践中来看,innodb_log_file_size开得太大,会明显增加innodb的log写入操作,而且会造成操作系统需要更多的Disk Cache开销。

因此从我的经验来看,innodb_flush_method=O_DIRECT是必须的,而innodb_log_file_size也不宜太大。

分享到:
评论

相关推荐

    javaeye Robbin 论缓存技术

    - 对于数据库缓存,可以通过MySQL的`show status`命令、mysqlreport脚本、MySQL Administrator工具或者专门的innotop工具来监控和分析缓存的使用情况,进行性能调优。 总结来说,缓存技术在现代软件系统中扮演着至...

    MFC SDI制作Office2007样式的Robbin菜单.docx

    ### MFC SDI 制作 Office 2007 样式 Robbin 菜单 #### 一、概述 Microsoft Foundation Classes (MFC) 是一个由微软开发的类库,用于简化 Windows 应用程序的开发过程。本文档旨在介绍如何在 MFC 单文档界面...

    Robbin Fan—运营专业型社区的经验和反思.ppt

    Robbin Fan—运营专业型社区的经验和反思.ppt

    范凯个人网站源码robbin_site.zip

    robbin_site 是范凯的个人网站 http://robbinfan.com 网站的源码。 标签:robbin

    robbin谈管理:我敬佩的3位CEO管理者

    GE在韦尔奇任内20年实现了每年30%的高速增长,市值曾经达到全球第2,是全球最著名的CEO楷模。韦尔奇写的两本书:一本自传,一本Winning我读了很多遍,我觉得最有意思的反差是,尽管韦尔奇整个职业生涯都在GE渡过,...

    Git常用命令备忘 - robbin的自言自语1

    git config --global user.name "robbin" git config --global user.email "fankai@gmail.com" git config --global color.ui true ``` 设置别名,如`co`为`checkout`,`ci`为`commit`,`st`为`status`,`br`为`...

    Ribbon For DELPHI 10.1 BERLIN.7z

    利用Ribbon for Delphi 10.1 Berlin,开发者可以轻松创建自定义的Ribbon菜单,通过调整控件的大小、颜色、字体等属性,实现与Windows系统风格的无缝对接。此外,该组件还支持触摸设备,适应了多设备、多平台的趋势。...

    小型Drupal数据库备份以及大型站点MySQL备份策略分享

    $bpath = "/home/robbin/backup/mysql"; $btime = date("Y-m-d H:i:s"); $bstamp = $btime . "_" . substr(md5(microtime(true)), 0, 8); // 遍历数据库并创建备份文件 while ($row = mysql_fetch_assoc($result)) ...

    开发高效率的J2EE企业应用.ppt

    【开发高效率的J2EE企业应用】 J2EE企业应用的开发是一个复杂的过程,涉及到多个组件和资源的高效管理。对于大型项目来说,优化性能是至关...通过不断学习和实践,开发者可以提高应用性能,确保大型项目的稳定运行。

    Struts2学习资料(强烈推荐)

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、模块化和高度结构化的Web应用程序。这个“Struts2学习资料(强烈...通过阅读和实践,你可以深入了解Struts2的工作原理,提升开发Java Web应用的能力。

    向Excel文件添加RibbonXml

    开发者可以根据需求调整Ribbon布局,提供更直观的用户体验,并通过VBA或其他编程语言实现自定义功能。 了解和掌握RibbonXML的创建和使用是提升Excel应用程序扩展性的重要技能,它可以极大地提高工作效率,特别是在...

    spring cloud 组件整合 eureka gateway feign hystrix,各个模的整合,供大家一起学习

    在Spring Cloud生态系统中,Eureka、Gateway、Feign和Hystrix是四个核心组件,它们协同工作以构建出高可用、高性能的微服务架构。让我们深入探讨这些组件以及它们如何整合。 1. **Eureka**:Eureka是Spring Cloud中...

    一个基于WPF+ C# 实现的Ribbon 控件库程序代码

    【标题】中的“一个基于WPF+C#实现的Ribbon控件库程序代码”表明这是一个使用Windows Presentation Foundation(WPF)框架和C#编程语言开发的软件项目,专注于创建Ribbon用户界面元素的控件库。...

    获取ip地址方法与示例

    在IT行业中,获取IP地址是一项基础且重要的任务,特别是在网络通信和服务器开发中。这篇文章将详细探讨“获取IP地址的方法与示例”,并基于提供的标签“源码”和“工具”进行深入解析。 首先,我们需要了解什么是IP...

Global site tag (gtag.js) - Google Analytics