mysql 参数调优(1)之内存缓冲池innodb_buffer_pool_size

内存的大小是最能直接反映数据库的性能。InnoDB存储引擎既缓存数据,又缓存索引,并且将它们缓存于一个很大的缓冲池中,即InnoDB Buffer Pool。因此,内存的大小直接影响了数据库的性能性能测试。

Percona公司的CTO Vadin对此做了一次测试,以此反映内存的重要性,结果如下图所示:

image.png

在上述测试中,数据和索引总大小为18GB,然后将缓冲池的大小分别设为2GB、4GB、6GB、8GB、10GB、12GB、14GB、16GB、18GB、20GB、22GB,再进行sysbench的测试可以发现:随着缓冲池的增大,测试结果TPS(Transaction Per Second)会线性增长。

当缓冲池增大到20GB和2GB时,数据库的性能有了极大的提高,因为这时缓冲池的大小已经大于数据文件本身的大小,所有对数据文件的操作都可以在内存中进行。因此这时的性能应该是最优的,再调大缓冲池并不能再提高数据库的性能(再将参数调大就回去使用swap空间了)。所以,应该在开发应用前预估“活跃数据库的大小”是多少,并以此确定数据库服务器内存的大小。但是这样的预估通常是不容易达到准确的。

经过以上实验,可以看出innodb_buffer_pool_size是mysql参数调优中首当其冲的最重要的一个。增大它能够让mysql的性能得到很大提升!!!

专用的mysql服务器
网上很多说innodb_buffer_pool_size为系统的70%,这是错的!因为你真的设了70%你的swap空间(虚拟内存)会被挤压性能反而会变低,你不要忘了你还有os,上面还可能有监控agent端。一旦swap空间被挤压后你的mysql反面严重拖慢读写。

此处强烈建议设成内存的20%-65%间(独立的mysql服务器),为什么有一个20%呢?对于<4gb的mysql用服务器来说按照20%系统内存来设置。由于我们是128gb的内存,此处我建议使用72G(56%),如果内存超过128gb,一般我们会把pool instance设成16个,每个开启10g左右 buffer_pool_size,对于256gb内存的服务器来说我们可以这样设。

共享服务器
如果你的MySQL服务器与其它应用共享资源,那么上面的经验就不那么适用了。在这样的环境下,设置一个对的数字有点难度。对此我们可以使用缓存池命中率总innodb表文件大小来进行判断。

判断当前数据库内存是否达到瓶颈,从而调整缓存池大小
如何判断当前数据库的内存是否已经达到瓶颈了呢?可以通过查看当前服务器的状态,比较物理磁盘的读取和内存读取的比例来判断缓冲池的命中率,即通过 缓存池命中率来判断,我们可以这样得到相关参数:

SHOW GLOBAL STATUS LIKE 'innodb%read%'
image.png

上述参数的具体含义如下所示:
1、Innodb_buffer_pool_reads 表示InnoDB缓冲池无法满足的请求,从而到物理磁盘读取页的次数
2、Innodb_buffer_pool_read_ahead 预读次数
3、Innodb_buffer_pool_read_ahead_evicted 预读的页
4、Innodb_buffer_pool_read_requests 从缓冲池中读取页的次数
5、Innodb_data_read 表示Innodb启动后,从物理磁盘上读取的字节数总和。
6、Innodb_data_reads 表示Innodb启动后,物理磁盘上发起的IO请求次数,每次读取肯能需要读多个页。

缓存池命中率计算方法
x = 缓冲池读次数/( 缓冲池读次数+ 预读数 + 物理磁盘读次数)
= Innodb_buffer_pool_read_requests /(Innodb_buffer_pool_read_requests +Innodb_buffer_pool_read_ahead + Innodb_buffer_pool_reads )
= 0.9665 = 96%

可以直接使用这条sql计算缓冲池命中率

SELECT
    ( SELECT variable_value FROM PERFORMANCE_SCHEMA.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests' ) / ( SELECT SUM( variable_value ) FROM PERFORMANCE_SCHEMA.global_status WHERE variable_name IN ( 'Innodb_buffer_pool_read_requests', 'Innodb_buffer_pool_read_ahead', 'Innodb_buffer_pool_reads' ) )

通常 InnoDB存储引擎的缓冲池的命中率不应该小于99%,所以现在可以调大innodb_buffer_pool_size参数。(我本机内存是8G,我调整到5G,6G的样子只能到98%。无法达到99%,mysql占用内存899M)。在线设置的sql:

SET GLOBAL innodb_buffer_pool_size = 6442450944 -- 6G

如果命中率太低,则应考虑扩充内存,增加innodb_buffer_pool_size的值。即使缓冲池的大小已经大于数据库文件的大小,这也并不意味着没有磁盘操作。数据库的缓冲池只是一个用来存放热点的区域,后台的线程还负责将脏页异步地写入到磁盘。此外,每次事务提交时还需要将日志写入重做日志文件。

物理磁盘上平均每次读取字节数= Innodb_data_read / Innodb_data_reads

SELECT variable_value FROM PERFORMANCE_SCHEMA.global_status WHERE variable_name = 'Innodb_data_read' 

innodb表占用总空间
可以通过下列语句查询得到所有innodb表的数据和索引的总占用空间。可以看到我本机的innodb大小是 1.31G,那么我们至多可以将innodb_buffer_pool_size设置为1.31G了,不过大多数情况你不需要那样做,你只需要缓存你经常使用的数据集。

SELECT engine,
  count(*) as TABLES,
  concat(round(sum(table_rows)/1000000,2),'M') rows,
  concat(round(sum(data_length)/(1024*1024*1024),2),'G') DATA,
  concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,
  concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,
  round(sum(index_length)/sum(data_length),2) idxfrac
FROM information_schema.TABLES
WHERE table_schema not in ('mysql', 'performance_schema', 'information_schema')
GROUP BY engine
ORDER BY sum(data_length+index_length) DESC LIMIT 10;
image.png

调整方式

在线修改,5.7以后可以。但是要注意修改innodb_buffer_pool_size 可能造成业务波动。但也最好选择业务低峰期和没有大事务操作时候进行,同时要修改MySQL配置文件,防止重启后恢复到原来的值。

SET GLOBAL innodb_buffer_pool_size = 2147483648  #2G

配置文件方式,修改后重启

[mysqld]
innodb_buffer_pool_size = 2147483648  #设置2G
innodb_buffer_pool_size = 2G  #设置2G
innodb_buffer_pool_size = 500M  #设置500M

innodb_buffer_pool_instances
还有一个和buffer pool 相关的参数看这里 https://www.jianshu.com/p/f84fe0979cdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353