zoukankan      html  css  js  c++  java
  • mysql核心参数优化

    MySQL数据库服务器配置
    CPU的优化
    内存的优化
    IO的优化
    连接的优化
    数据一致性的优化


    1.描述back_log参数的作用?

    back_log = 500 要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,
    这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
    不需要配置 =50 + (max_connections / 5),===50+ 3000/5=650
    Default Value -1 (autosized)
    back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,
    你需要增 加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。
    你的操作系统在这个队列大小上有它自己的限制。试图设定 back_log高于你的操作系统的限制将是无效的。
    当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login |
    NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。
    作用:MySQL每处理一个连接请求的时候都会对应的创建一个新线程与之对应,那么在主线程创建新线程期间,如果前端应用有
    大量的短连接请求到达数据库,MySQL 会限制此刻新的连接进入请求队列,由参数back_log控制,如果等待的连接数量超过back_log,
    则将不会接受新的连接请求,所以如果需要MySQL能够处理大量的短连接,需要提高此参数的大小。 现象:如果参数过小可能会导致应用报错

    2.描述thread_cache_size参数的作用?

    thread_cache_size = 64  缓存可重用线程数,减小创建新线程的开销)

    可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,
    当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性 能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用

    3.描述table_open_cache参数的作用?

    show status like 'Opened_files';--当前打开表的数量
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Opened_files | 180 |
    | table_definition_cache | 1400 |
    | table_open_cache | 2000 |
    | table_open_cache_instances | 1
    一个是打开表的缓存 ---> table_open_cache,每打开一个表,都会读入该值中,当mysql在缓存中找不到,才会读取磁盘
    一个是表定义的缓存 ---> table_definition_cache

    MySQL数据库服务器配置
    --
    mysql服务器:2*E5 2690
    innodb_thread_concurrency=32
    innodb内部自己控制 kernel_mutex竞争 innodb_thread_concurrency设置为cpu的核心数
    #内存
    query_cache_type=0
    query_cache_size=0
    #io
    innodb_buffer_pool_size=50G
    innodb_io_capacity=20000
    innodb每秒后台进程处理IO操作的数据页上限,default 200
    innodb_buffer_pool_size总的io处理能力上限
    innodb_buffer_pool_instances分割成多个内存块时,每个内存块的IO处理能力为:innodb_io_capacity/innodb_buffer_pool_instances
    对于个别5400转或7200转硬盘系统上,可能降低值的100前者默认。
    innodb_log_files_in_group=4
    innodb_log_file_size=1000M
    innodb_flush_method=O_DIRECT
    O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲(page cache),
    而真正的完成也是在flush这步,日志(redo log)还是要经过OS缓冲
    --innodb是怎样打开和刷新日志文件及数据文件
    --参数innodb_flush_method=O_DIRECT
    --fdatasync:非windows的默认值,innodb用fsync()来刷新数据和日志文件,fsync的缺点是操作系统会在自己的缓存中缓冲一些数据
    --O_DIRECT,会使用fsync来刷新文件到磁盘,但是会通知操作系统不要缓存数据,也不要预读,避免双重缓冲,如果RAID卡支持预读,这个选项不会关闭raid卡的预读
    --ALL_O_DIRECT 在percona server和mariadb中使用,可以用mysql的o_direct方式
    --O_DSYNC没有避免双重缓冲
    --async_unbuffered :Windows下的默认值,让innodb对大部分写使用没有缓冲的I/O
    --unbuffered 只对Windows有效,不使用原生的异步I/O
    --normal 只对window有效,让innodb不要使用原生异步I/O或者五缓冲I/O
    innodb_max_dirty_pages_pct=50
    default 75 InnoDB试着从缓冲池刷新数据,使脏页的百分比不超过这个值
    innodb从innodb buffer中刷新脏页的比例
    刷新脏页,产生checkpoint脏页刷新innodb_max_dirty_pages_pct * innodb_io_capacity
    innodb_file_per_table=on
    innodb_page_size=4k#ssd
    innodb_flush_neighbors=0#ssd。随机访问转换成顺序访问
    ##show global status like 'innodb_log_waits';
    ##当Innodb_log_waits值较大时,说明可用log buffer不足,需等待释放次数,数量较大时需要加大innodb_log_buffer_size的值

    #连接
    back_log=300
    max_connections=3000
    max_user_connections=2800
    table_open_cache=1024#打开缓存的表数
    thread_cache_size=512#连接池
    wait_timeout=120#服务器关闭交互式连接前等待活动的秒数
    interactive_timeout=120#交互超时
    #数据库一致性优化
    innodb_flush_log_at_trx_commit=1,commit/write/flush/sync
    sync_binlog=1
    max_connections/max_user_connections
    (system@127.0.0.1:3306) [(none)]> show variables like '%open%';
    +----------------------------+----------+
    | Variable_name | Value |
    +----------------------------+----------+
    | have_openssl | DISABLED |
    | innodb_open_files | 60000 |
    | open_files_limit | 65535 |
    | table_open_cache | 2000 |
    | table_open_cache_instances | 16 |
    +----------------------------+----------+

    ----
    建议调整下面几个关键参数以获得较好的性能
    1、选择Percona或MariaDB版本的话,强烈建议启用thread pool特性,可使得在高并发的情况下,性能不会发生大幅下降。此外,还有extra_port功能,非常实用,
    关键时刻能救命的。还有另外一个重要特色是 QUERY_RESPONSE_TIME 功能,也能使我们对整体的SQL响应时间分布有直观感受;
    2、设置default-storage-engine=InnoDB,也就是默认采用InnoDB引擎,强烈建议不要再使用MyISAM引擎了,InnoDB引擎绝对可以满足99%以上的业务场景;
    3、调整innodb_buffer_pool_size大小,如果是单实例且绝大多数是InnoDB引擎表的话,可考虑设置为物理内存的50% ~ 70%左右;
    4、根据实际需要设置innodb_flush_log_at_trx_commit、sync_binlog的值。如果要求数据不能丢失,那么两个都设为1。如果允许丢失一点数据,则可分别设为2和10。
    而如果完全不用care数据是否丢失的话(例如在slave上,反正大不了重做一次),则可都设为0。这三种设置值导致数据库的性能受到影响程度分别是:高、中、低,也就是第一个会另数据库最慢,最后一个则相反;
    5、设置innodb_file_per_table = 1,使用独立表空间,我实在是想不出来用共享表空间有什么好处了;
    6、设置innodb_data_file_path = ibdata1:1G:autoextend,千万不要用默认的10M,否则在有高并发事务时,会受到不小的影响;
    7、设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可满足90%以上的场景;
    8、设置long_query_time = 1,而在5.5版本以上,已经可以设置为小于1了,建议设置为0.05(50毫秒),记录那些执行较慢的SQL,用于后续的分析排查;
    9、根据业务实际需要,适当调整max_connection(最大连接数)、max_connection_error(最大错误数,建议设置为10万以上,
    open_files_limit、innodb_open_files、table_open_cache、table_definition_cache这几个参数则可设为约10倍于max_connection的大小;
    10、常见的误区是把tmp_table_size和max_heap_table_size设置的比较大,曾经见过设置为1G的,这2个选项是每个连接会话都会分配的,因此不要设置过大,
    否则容易导致OOM发生;其他的一些连接会话级选项例如:sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等,也需要注意不能设置过大;
    11、由于已经建议不再使用MyISAM引擎了,因此可以把key_buffer_size设置为32M左右,并且强烈建议关闭query cache功能;
    ----

  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10251390.html
Copyright © 2011-2022 走看看