MySQL核心参数优化(内存优化)

配置内存

内存组件介绍

Innodb缓冲池(占用物理内存80%)

# 控制缓冲池的大小(10G)
Innodb_buffer_pool_size
# 划分缓冲池几个区域,如果是10G的话划分5个区域,每个区域2G,默认值-1,划分8个区域,大于1G才有意义
Innodb_buffer_pool_instances
# 脏页控制比例,默认值为75%,被修改的
Innodb_max_dirty_pages_pct

每个连接(线程)需要的缓存【100个并发需要100*(1+。。。。。。5)】

# 排序
sort_buffer_size
# 
read_buffer_size
# 
read_rnd_buffer_size
# 多表关联
join_buffer_size
# binlog相关
binlog_cache_size

其他缓存

# 线程缓存 链接池 中间件
thread_cache_size
# 表缓存 表比较多的时候
table_open_cache
# MyISAM缓存 现在是innodb,用的比较少

内存优化示例

环境介绍

硬件环境

8核16G内存

软件环境

centos7.7 mysql5.7.26

优化策略

抓大放小,当前只调整缓冲池的大小

开启performance-schema

performance-schema-instrument='wait/%=ON'
performance-schema-consumer-events-waits-current=ON
performance-schema-consumer-events-waits-history=ON
performance-schema-consumer-events-waits-history-long=ON

查看默认buffer大小

第一次压测

[root@cnbugs1 tpcc-mysql]# ./tpcc_start -h127.0.0.1 -P 3306 -d tpcc -u root -p Aa123456 -w 10 -c 1 -r 300 -l 200

查看分页状态

mysql> show engine status\G;
Total large memory allocated 137428992
Dictionary memory allocated 169602
Buffer pool size   8192
Free buffers       1020
Database pages     6960
Old database pages 2557
Modified db pages  3014
Pending reads      0

一直在减少,有时候直接为0,不够使用

优化前的压测数据

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.49% (>=43.0%) [OK]
   Order-Status: 4.34% (>= 4.0%) [OK]
       Delivery: 4.34% (>= 4.0%) [OK]
    Stock-Level: 4.35% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 16.24%  [NG] *
        Payment: 94.93%  [OK]
   Order-Status: 98.42%  [OK]
       Delivery: 97.63%  [OK]
    Stock-Level: 18.55%  [NG] *

<TpmC>
                 3800.700 TpmC

语句执行时间

mysql> use performance_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select EVENT_NAME,COUNT_STAR,sys.format_time(SUM_TIMER_WAIT) from events_statements_summary_global_by_event_name order by SUM_TIMER_WAIT desc limit 5;
+----------------------------+------------+---------------------------------+
| EVENT_NAME                 | COUNT_STAR | sys.format_time(SUM_TIMER_WAIT) |
+----------------------------+------------+---------------------------------+
| statement/com/Execute      |  347121716 | 16.46 h                         |
| statement/sql/commit       |     119865 | 5.70 m                          |
| statement/sql/create_index |          8 | 2.52 m                          |
| statement/sql/alter_table  |         20 | 12.87 s                         |
| statement/sql/drop_db      |          1 | 4.31 s                          |
+----------------------------+------------+---------------------------------+
5 rows in set (0.00 sec)

等待时间

mysql> select EVENT_NAME,COUNT_STAR,sys.format_time(SUM_TIMER_WAIT) from events_waits_summary_global_by_event_name where EVENT_NAME!='idle' order by SUM_TIMER_WAIT desc limit 5;
+---------------------------------------------+------------+---------------------------------+
| EVENT_NAME                                  | COUNT_STAR | sys.format_time(SUM_TIMER_WAIT) |
+---------------------------------------------+------------+---------------------------------+
| wait/io/socket/sql/client_connection        |  694486374 | 3.19 h                          |
| wait/synch/sxlock/innodb/index_tree_rw_lock |   43122267 | 2.79 h                          |
| wait/synch/mutex/innodb/buf_pool_mutex      |   85979811 | 1.61 h                          |
| wait/synch/sxlock/innodb/btr_search_latch   |  677902342 | 38.38 m                         |
| wait/io/file/innodb/innodb_data_file        |    8312016 | 27.85 m                         |
+---------------------------------------------+------------+---------------------------------+
5 rows in set (0.01 sec)

优化过程

停掉数据库

[root@cnbugs1 ~]# /etc/init.d/mysqld57 stop

修改my.cnf配置文件

innodb_buffer_pool_size = 10G
innodb_buffer_pool_instances = -1

启动数据库

[root@cnbugs1 ~]# /etc/init.d/mysqld57 start

重新进行压测

[root@cnbugs1 ~]# cd /usr/local/tpcc-mysql/
[root@cnbugs1 tpcc-mysql]# ./tpcc_start -h127.0.0.1 -P 3306 -d tpcc -u root -p Aa123456 -w 10 -c 1 -r 300 -l 200

优化后的数据

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.48% (>=43.0%) [OK]
   Order-Status: 4.35% (>= 4.0%) [OK]
       Delivery: 4.35% (>= 4.0%) [OK]
    Stock-Level: 4.35% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 31.09%  [NG] *
        Payment: 98.50%  [OK]
   Order-Status: 100.00%  [OK]
       Delivery: 99.38%  [OK]
    Stock-Level: 91.31%  [OK]

<TpmC>
                 4865.700 TpmC

语句执行时间

mysql> select EVENT_NAME,COUNT_STAR,sys.format_time(SUM_TIMER_WAIT) from events_statements_summary_global_by_event_name order by SUM_TIMER_WAIT desc limit 5;
+--------------------------+------------+---------------------------------+
| EVENT_NAME               | COUNT_STAR | sys.format_time(SUM_TIMER_WAIT) |
+--------------------------+------------+---------------------------------+
| statement/com/Execute    |    3275878 | 4.45 m                          |
| statement/sql/commit     |     128815 | 1.83 m                          |
| statement/sql/rollback   |        413 | 681.95 ms                       |
| statement/com/Prepare    |         35 | 10.01 ms                        |
| statement/com/Field List |        174 | 8.66 ms                         |
+--------------------------+------------+---------------------------------+
5 rows in set (0.00 sec)

等待时间

mysql> select EVENT_NAME,COUNT_STAR,sys.format_time(SUM_TIMER_WAIT) from events_waits_summary_global_by_event_name where EVENT_NAME!='idle' order by SUM_TIMER_WAIT desc limit 5;
+----------------------------------------+------------+---------------------------------+
| EVENT_NAME                             | COUNT_STAR | sys.format_time(SUM_TIMER_WAIT) |
+----------------------------------------+------------+---------------------------------+
| wait/io/file/innodb/innodb_log_file    |     244059 | 1.75 m                          |
| wait/io/table/sql/handler              |    6101334 | 1.23 m                          |
| wait/io/file/innodb/innodb_data_file   |     165539 | 36.33 s                         |
| wait/io/socket/sql/client_connection   |    6810727 | 35.82 s                         |
| wait/synch/mutex/innodb/buf_pool_mutex |    4267691 | 3.31 s                          |
+----------------------------------------+------------+---------------------------------+
5 rows in set (0.00 sec)

从优化后可以看出节省了很多时间!

发表评论

后才能评论