• Mysql 优化


     1.优化的范围

    a. 存储.主机和操作系统:
        主机架构稳定性
        I/O规划及配置
        Swap
        OS 内核参数
        网络问题
        
    b. 应用:(Index,lock,session)
         应用程序稳定性和性能
         SQL语句性能
         串行访问资源
         性能欠佳会话管理
         
    c. 数据库优化:(内存.数据库设计.参数)
         内存
         数据库结构(物理&逻辑)
         实例配置

    2.优化工具介绍

     1.系统屋 :CPU IO MEM

    CPU: 计算(主)和调度 (次)
    MEM: 缓存和缓冲   (用于磁盘)
    IO: 输入
    
    1. top 命令 (用于查看CPU MEM)
    a. CPU:
    [root@db01 ~15:27:42]# top
    %Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st  平均占比 最多100%
    
    举列:%Cpu(s): 99.3 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
    us: 用户程序工作所占用的时间片占比  (用于有效计算--) 这个高表示说明CPU 是在做计算,做正事
        
    sy: 内核工作花费的cpu时间片占比    (用于调度--)如果高表示cpu 在做不正常事,调度占比少比较好
    过高原因:
    内核本身bug  中病毒等
    各种资源的调度和分配
    并发很高
    锁
    
    id: 空闲的CPU时间片占比   值越小,表示CPU越繁忙
    
    wa: CPU 用来等待的时间片占比
    IO 如radio 做的不好
    等待大的处理事件
    锁
    
    
    PID  USER      PR  NI    VIRT    RES    SHR S   %CPU   %MEM     TIME+ COMMAND    实时观察CPU 内存情况
    %CPU 当前某个程序占用总CPU的使用率. 如果是4核CPU,满核为400%,如果是单核100%.
    
    压力测试:
    create database test;
    use test;
    source /root/t100w.sql   #导入数据  
    
    mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='test' --query="select * from test.t100w where k2='780P'" engine=innodb --number-of-queries=2000 -uroot -p123456abcd -verbose
    
    --concurrency=100 : 模拟同时100会话连接
    --create-schema='test' : 操作的库是谁
    --query="select * from test.t100w where k2='780P'" :做了什么操作
    --number-of-queries=2000 : ⼀共做了多少次查询
    Running for engine rbose
    Average number of seconds to run all queries: 648.657 seconds
    Minimum number of seconds to run all queries: 648.657 seconds
    Maximum number of seconds to run all queries: 648.657 seconds
    Number of clients running queries: 100
    Average number of queries per client: 20
    
     PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 
    7476 mysql     20   0 1183400 320876  12868 S 99.0 32.2     3:45.84 mysqld     可以看出mysql占用cpu率
    *************************************************************************
    在top 界面按数字1,可以看到每片cpu 的使用率.因为有时需要查看每片cpu 是用使用的平均
    *************************************************************************
    
    b. 内存
    [root@db01 ~22:56:49]# top
    KiB Mem :   995896 total,   124292 free,   421644 used,   449960 buff/cache
    KiB Swap:  1048572 total,  1048572 free,        0 used.   396272 avail Mem 
    
    mysql服务器中一般会禁用掉Swap ,如果是文件服务器可以有这个Swap 
     主要看这条:
     396272 avail Mem  表示可用的内存大小,如果不够可以增加内存条 
    
    
    2. IOstat 命令  (用于查IO)
       iostat -dk 1  如果没有这个命令用 yum install -y sysstat 
    [root@db01 ~23:17:18]# iostat -dk 1
    Linux 3.10.0-957.el7.x86_64 (db01)     02/08/2021     _x86_64_    (1 CPU)
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               0.22         2.99         8.35     187538     523781
    scd0              0.00         0.02         0.00       1028          0
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               0.00         0.00         0.00          0          0
    scd0              0.00         0.00         0.00          0          0
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               0.00         0.00         0.00          0          0
    scd0              0.00         0.00         0.00          0          0
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               0.00         0.00         0.00          0          0
    scd0              0.00         0.00         0.00          0          0
    
    一般情况下,cpu 高,IO 也应该高.
    如果:CPU 高 ,IO 比较低
    wait 高: 有可能IO出问题了(raid,过度条带化)
    SYS 高: 有可能是锁的问题,需要进一步去数据库中判断和排查
    3. glances 命令(查看cpu mem IO)
    [root@db01 ~23:30:14]# glances
    如果没有可以直接yum install -y glances
    db01 (CentOS Linux 7.6.1810 64bit / Linux 3.10.0-957.el7.x86_64)                                 Uptime: 17:36:50
    
    CPU  [  3.8%]   CPU       3.8%  nice:     0.0%        MEM     61.2%        SWAP      0.0%        LOAD    1-core
    MEM  [ 61.2%]   user:     2.2%  irq:      0.0%        total:   973M        total:   1024M        1 min:    0.10
    SWAP [  0.0%]   system:   1.3%  iowait:   0.0%        used:    595M        used:     264K        5 min:    5.50
                    idle:    96.5%  steal:    0.0%        free:    377M        free:    1024M        15 min:  30.85
    
    4. htop 命令(查看CPU MEM )

    2 .数据库层

    show status
    show variables
    show index
    show processlist
    show slave status
    show engine innodb status
    desc /explain
    slowlog
    
    扩展类深度优化:
    PT 系列(pt-query-sigest pt-osc pt-index 等)
    mysqlslap    压力测试
    sysbench
    information_schema
    performance_schema  (P_S)
    sys

    3.优化思路(单独主机)

    1. 未优化前的压力测试

    create database test charset utf8mb4;
    use test;
    set sql_log_bin=0;
    source t100w.sql;
    grant 0n *.* to root@'localhost' identified by '123456abcd'
    
    mysqlslap --defaults-file=/etc/my.cnf 
    --concurrency=100 --iterations=1 --create-schema='test'
     --query="select * from test.t100w where k2='ABxy'" engine=innodb 
     --number-of-queries=2000 -uroot -p123456abcd -verbose

    2.主机.存储.网络

    主机:
    真实的硬件(PC server):DELL R系统,华为,浪潮,HP,曙光.联想
    云产品:
    ECS.数据库RDS.DRDS.PolarDB
     
    CPU 根据数据库类型
    OLTP
    OLAP
    IO密集型:线上系统,OLTP主要是IO密集型的业务,高并发
    CPU密集型:数据分板数据处理,OLAP,CPU密集型的,需要cpu高计算能力(i 系列,IBM Power系列)
    cpu密集型: I系列的,主频很高,核心少
    IO密集型: E系列的,主频相对低,核心数量多
    
    内存:
    建议2-3倍cpu核心数量 ( ECC)
    
    磁盘选择:
    SATA-III SAS FC SSD
    主机 RAID 卡的BBU 关闭
    
    存储:
    raid0:条带化,性能高
    raid1:镜像,安全
    raid5:校验+条带化,安全较高+性能较高(读),写性能较低(适合于读多写少)
    raid10:安全+性能都很高,最少四块磁盘,浪费一增的空间(高IO要求)
    
    网络:
    1.硬件买好的(单卡单口)
    2.网卡绑定(bonding),交换机堆叠
    以上问题,提前规避掉.

    3.系统

    Swap 调整
    临时调整
    echo 0 >/proc/sys/vm/swapiness   #将内容改为0,默认为30,当内存达到70%时就会使用Swap分区
    永久调整
    vim /etc/sysctl.conf
    在最后一行增加一行vm.swapiness=0  永久生效
    执行sysctl -p
    
    IO调度策略
    centos7 默认是deadline
    cat /sys/block/sda/queue/scheduler
    
    临时修改为deadline(centos6)
    echo deadline >/sys/block/sda/queue/scheduler
    
    vim /boot/grub/grub.conf
    更改到如下内容:
    kernel /boot/vmlinuz-2.6.18-e15 ro root=LABEL=/ elevator=deadline rhgb quiet
    
    IO:
       raid
       no lvm
       ext4或xfs   最好是xfs
       ssd
       IO调度策略

    4.数据库实例(参数) ----参照以上参数微调

    [mysqld]
    basedir=/data/mysql
    datadir=/data/mysql/data
    socket=/tmp/mysql.sock
    log-error=/var/log/mysql.log
    log_bin=/data/binlog/mysql-bin
    binlog_format=row
    skip-name-resolve
    server-id=52
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    relay_log_purge=0
    max_connections=1024
    back_log=128
    wait_timeout=60
    interactive_timeout=7200
    key_buffer_size=16M
    query_cache_size=64M
    query_cache_type=1
    query_cache_limit=50M
    max_connect_errors=20
    sort_buffer_size=2M
    max_allowed_packet=32M
    join_buffer_size=2M
    thread_cache_size=200
    innodb_buffer_pool_size=1024M
    innodb_flush_log_at_trx_commit=1
    innodb_log_buffer_size=32M
    innodb_log_file_size=128M
    innodb_log_files_in_group=3
    binlog_cache_size=2M
    max_binlog_cache_size=8M
    max_binlog_size=512M
    expire_logs_days=7
    read_buffer_size=2M
    read_rnd_buffer_size=2M
    bulk_insert_buffer_size=8M
    [client]
    socket=/tmp/mysql.sock  
            
    再次压力测试  :
     mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='oldboy' --query="select * from oldboy.t_100w where k2='FGCD'" engine=innodb --number-of-queries=200000 -uroot -p123 -verbose

     

     

    Do everything well
  • 相关阅读:
    Java_JAVA6动态编译的问题
    Java_动态加载类(英文)
    Java_Java Compiler 应用实例
    Java_关于App class loader的总结
    Java_动态加载
    Java_Java SE6调用动态编译
    python捕获Ctrl+C信号
    python使用协程并发
    python使用多进程
    python使用多线程
  • 原文地址:https://www.cnblogs.com/linuxmysql/p/15440543.html
Copyright © 2020-2023  润新知