• 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功能;
    ----

  • 相关阅读:
    Java ConcurrentModificationException 异常分析与解决方案
    android studio 怎么做屏幕适配?
    java Class.getSimpleName() 的用法
    LeetCode——Remove Element
    用WidgeDuino创建一个SCADA(监控与数据採集)系统
    【Oracle】OCR的备份和恢复之导出导入
    Java大数类介绍
    POJ 1113 Wall 凸包
    OPENCV中滑动条的使用
    Android
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10251390.html
Copyright © 2020-2023  润新知