性能调优-CPU方面,内存方面
CPU调优
首先要清楚数据库应用的分类,一般分为两类:OLTP(Online Transaction Processing,在线事务处理)和OLAP(Online Analytical Processing,在线分析处理),这是两种完全不同的数据库应用。OLAP多用在数据仓库或数据集市中,一般需要执行复杂的SQL语句来进行查询;OLTP多用在日常的事物处理应用中,如银行交易、在线商品交易、Blog、网络游戏等应用。相对于OLAP,数据库的容量较小。
InnoDB存储引擎一般都应用于OLTP的数据库应用,这种应用的特点如下所示:
- 用户操作的并发量大。
- 事务处理的时间一般比较短。
- 查询的语句较为简单,一般都走索引。
- 复杂的查询较少。
可以看出,OLTP的数据库应用本身对CPU的要求并不高,因为复杂的查询可能需要执行比较、排序、连接等非常耗CPU的操作,这些操作在OLTP的数据库应用中很少发生。因此,可以说OLAP是CPU密集型的操作,而OLTP是IO密集型的操作。建议在采购设备时,应将更多的注意力放在提高IO的配置上。
此外,为了获得更多内存的支持,CPU必须支持64位的应用,否则无法支持64位操作系统的安装。因此,为新的应用选择64位的CPU是必要的前提。现在4核的CPU已经非常普遍,而今年Intel和AMD又都推出了6核的CPU,将来随着操作系统的升级,我们还可能看到128核的CPU,这都需要数据库更好地对其进行支持。
从InnoDB存储引擎的设计架构上来看,其主要的后台操作都是在一个单独的MASTER THREAD中完成的,因此并不能很好地支持多核的应用。当然,开源社区已经通过多种方法来改变这种局面,新的InnoDB Plugin版本在各种测试下已经显示对多核CPU的处理性能有了极大的提高。因此,如果你的CPU支持多核,InnoDB Plugin是更好的选择。另外,如果你的CPU是多核的,你可以通过修改参数innodb_read_io_threads和innodb_write_io_threads来增大IO的线程,这样也能更充分利用CPU的多核性能。
在当前的MySQL版本中,一条SQL查询语句只能在一个CPU行工作,并不支持多CPU的处理。OLTP的数据库应用操作一般都很简单,因此对OLTP应用的影响并不是很大。但是,多个CPU或多核CPU对处理大并发量的请求还有非常有帮助的。
内存的重要性
内存的大小最能直接反应数据库的性能。InnoDB存储引擎既缓存数据,又缓存索引,并将其缓存于一个很大的缓冲池中,我们将这个缓冲池称为InnoDB Buffer Pool,它的大小直接影响了数据库的性能。
Percona公司的CTO Vadim对此做了一次测试,以此反应内存的重要性,结果如图所示。

在上述的测试中,数据和索引总大小为18GB,然后将缓冲池的大小分别设为2GB、4GB、6GB、8GB、10GB、12GB、14GB、16GB、18GB、20GB、22GB,再进行sysbench的测试。可以发现,随着缓冲池的增大,测试结果TPS(Transaction Per Second)会线性增长。当缓冲池增大到20GB和22GB,数据库的性能有了极大的提高,因为这时缓冲池的大小已经大于数据文件本身的大小,所有对数据文件的操作都可以在内存中进行,因此这时的性能应该是最优的,再调大缓冲池并不能再提高数据库的性能。所以,应该在开发应用前预估“活跃”数据库的大小可能会是多少,并以此确定数据库服务器内存的大小。当然,要使用更多的内存,还必须使用64位的操作系统。
如何判断当前数据库的内存是否已经达到瓶颈了呢?可以通过查看当前服务器的状态,比较物理磁盘的读取和内存读取的比例来判断缓冲池的命中率,通常InnoDB存储引擎的缓冲池的命中率不应该小于99%,如:
show global status like 'innodb%read%'\G

上述参数的具体含义如下所示:
Innodb_buffer_pool_reads:表示从物理磁盘读取页的次数。
Innodb_buffer_pool_read_ahead:预读的次数。
Innodb_buffer_pool_read_ahead_evicted:预读的页,但是没有被读取就从缓冲池中被替换的页的数量,一般用来判断预读的效率。
Innodb_buffer_pool_read_requests:从缓冲池中读取页的次数。
Innodb_data_read:总共读入的字节数。
Innodb_data_reads:发起读取请求的次数,每次读取可能需要读取多个页。
以下公式可以计算各种对缓冲池的操作:

从上面的例子看,缓冲池命中率=66946 /(66946+0+713)=99.92%,可见当前内存的压力并不是很大。
即使缓冲池的大小已经大于数据库文件的大小,这也不意味着没有磁盘操作。数据库的缓冲池只是一个用来存放热点的区域,后台的master线程还负责将脏页异步地写入磁盘,每次事务提交时还需要立即写入重做日志文件。
性能调优-CPU方面,内存方面的更多相关文章
- 【总结】性能调优:JVM内存调优相关文章
[总结]性能调优:JVM内存诊断工具 [总结]性能调优:CPU消耗分析 [总结]性能调优:消耗分析 JVM性能调优
- 系统性能调优CPU与内存
CPU相关术语 处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU. 核:一颗多核处理器上的一个独立CPU实例.核的使用时处理器扩展的一种方式,有称为芯片级多 ...
- spark性能调优 数据倾斜 内存不足 oom解决办法
[重要] Spark性能调优——扩展篇 : http://blog.csdn.net/zdy0_2004/article/details/51705043
- Tomcat性能调优及JVM内存工作原理
Java性能优化方向:代码运算性能.内存回收.应用配置. 注:影响Java程序主要原因是垃圾回收,下面会重点介绍这方面 代码层优化:避免过多循环嵌套.调用和复杂逻辑.Tomcat调优主要内容如下:1. ...
- sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)
一.概述 IO 内存是sql server最重要的资源,数据从磁盘加载到内存,再从内存中缓存,输出到应用端,在sql server 内存初探中有介绍.在明白了sqlserver内存原理后,就能更好的分 ...
- Java内存泄露及性能调优实例
内存泄漏及解决方法 1)系统崩溃前的一些现象 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4.5s:FullGC的次数越来越多,最频繁时隔 ...
- CPU开销sql server 性能调优
sql server 性能调优 CPU开销分析 一. 概述 上次在介绍性能调优中讲到了I/O的开销查看及维护,这次介绍CPU的开销及维护, 在调优方面是可以从多个维度去发现问题如I/O,CPU, 内存 ...
- Java性能调优
一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JV ...
- JVM性能调优
摘自:http://uule.iteye.com/blog/2114697 JVM垃圾回收与性能调优总结 JVM调优的几种策略 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将 ...
随机推荐
- [JAVA] Tcp客户端和服务器简单代码
服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...
- DbMigration的使用方法
先打开:工具=>NuGet程序包管理器=>程序包管理器控制台然后输入Enable-Migrations回车然后输入Add-Migration Name回车(这里Name你可以自己命名)最后 ...
- api接口响应类型定义
public class Response<T> { public ResponseStatus Status { get; set; } public string Message { ...
- ADO.NET操作SQL Server:数据库操作类(未封装)
1.添加数据 /// <summary> /// 添加数据 /// </summary> /// <param name="newEntity"> ...
- C#实现AStar寻路算法
AStar寻路算法是一种在一个静态路网中寻找最短路径的算法,也是在游戏开发中最常用到的寻路算法之一:最近刚好需要用到寻路算法,因此把自己的实现过程记录下来. 先直接上可视化之后的效果图,图中黑色方格代 ...
- WPF XamlObjectWriterException:无法创建未知类型"Grid"
using (FileStream fs = new FileStream("UnitFile/Report2.xaml", FileMode.Open)) { rootEleme ...
- iOS 安装包瘦身 (上篇)
本文来自网易云社区 作者:饶梦云 1. 安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的 ...
- 375. 猜数字大小 II leetcode java
题目: 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x 并且猜错 ...
- mysql 批量更新的四种方法
批量更新的方法: 1 ) 逐条更新 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新 ...
- DOM学习日记1
1.通过 id 查找 HTML 元素 var x=document.getElementById("intro"); 2.通过标签名查找 HTML 元素本例查找 id=" ...