zoukankan      html  css  js  c++  java
  • mysql为什么会慢

    --2019.4.18 mysql技术大会分享--叶金荣
    mysql为什么会慢
    性能瓶颈分析、排查思路

    先确认一下真的是mysql响应慢了吗
    导致mysql慢可能会有那些因素呢?
    --资源稀缺 ---cpu,memory,io,network
    --系统层面 ---numa,io调度等
    --mysql配置不科学 ---innodb_buffer_pool_size,innodb_io_capacity等
    --垃圾sql ---没有使用索引,大量使用了排序,临时表等

    先查看系统层面的负载情况
    top、free、vmstat/sar、mpstat、iotop、perf

    --top显示了系统总体的cpu和内存使用情况,以及各个进程的资源使用情况
    [root@localhost ~]# top
    top - 01:44:40 up 3 days, 16:08,  4 users,  load average: 0.01, 0.02, 0.05
    Tasks: 170 total,   1 running, 169 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.4 us,  0.1 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem : 18331708 total, 11389252 free,  3680040 used,  3262416 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used. 14285316 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                 
     2828 rabbitmq  20   0 2330112  80920   3504 S   6.2  0.4  65:17.53 beam.smp                                                                                                                
    11947 root      20   0  157712   2228   1508 R   6.2  0.0   0:00.01 top                                                                                                                     
        1 root      20   0  190892   3820   2400 S   0.0  0.0   0:03.80 systemd                                                                                                                 
        2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                                                                                                
        3 root      20   0       0      0      0 S   0.0  0.0   0:00.06 ksoftirqd/0                                                                                                             
        5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                                                            
        7 root      rt   0       0      0      0 S   0.0  0.0   0:00.32 migration/0                                                                                                             
        8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                                                                                  
        9 root      20   0       0      0      0 S   0.0  0.0   1:25.63 rcu_sched                                                                                                               
       10 root      rt   0       0      0      0 S   0.0  0.0   0:01.14 watchdog/0                                                                                                              
       11 root      rt   0       0      0      0 S   0.0  0.0   0:01.03 watchdog/1                                                                                                              
       12 root      rt   0       0      0      0 S   0.0  0.0   0:00.36 migration/1                                                                                                             
       13 root      20   0       0      0      0 S   0.0  0.0   0:00.06 ksoftirqd/1                                                                                                             
       15 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:0H                                                                                                            
       16 root      rt   0       0      0      0 S   0.0  0.0   0:01.02 watchdog/2                                                                                                              
       17 root      rt   0       0      0      0 S   0.0  0.0   0:00.19 migration/2                                                                                                             
       18 root      20   0       0      0      0 S   0.0  0.0   0:00.07 ksoftirqd/2                                                                                                             
       19 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kworker/2:0                                                                                                             
       20 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/2:0H                                                                                                            
       21 root      rt   0       0      0      0 S   0.0  0.0   0:01.03 watchdog/3                                                                                                              
       22 root      rt   0       0      0      0 S   0.0  0.0   0:00.21 migration/3                                                                                                             
       23 root      20   0       0      0      0 S   0.0  0.0   0:00.24 ksoftirqd/3                                                                                                             
       27 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 khelper                                                                                                                 
       28 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kdevtmpfs                                                                                                               
       29 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 netns                                                                                                                   
       30 root      20   0       0      0      0 S   0.0  0.0   0:00.19 khungtaskd                                                                                                              
       31 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 writeback                                                                                                               
       32 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kintegrityd                                                                                                             
       33 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset                                                                                                                  
       34 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kblockd                                                                                                                 
       35 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 md                                                                                                                      
       36 root      20   0       0      0      0 S   0.0  0.0   0:21.68 kworker/2:1                                                                                                             
       41 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kswapd0                                                                                                                 
       42 root      25   5       0      0      0 S   0.0  0.0   0:00.00 ksmd                                                                                                                    
       43 root      39  19       0      0      0 S   0.0  0.0   0:01.71 khugepaged                                                                                                              
       44 root      20   0       0      0      0 S   0.0  0.0   0:00.00 fsnotify_mark                                                                                                           
       45 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 crypto                                                                                                                  
       53 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kthrotld   

    load average: 0.01, 0.02, 0.05 ,依次是过去1分钟、5分钟、15分钟的平均负载。
    --平均负载,单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和cpu使用率并没有直接关系。
    平均负载最理想的情况是等于cpu数,所以在判断平均负载时,首先知道cpu,但是如果load高于5可能就会有问题

    [root@localhost ~]# grep 'model name' /proc/cpuinfo | wc -l
    4
    %Cpu(s): 0.4 us, 0.1 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    us 用户CPU时间
    sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁
    id 空闲 CPU时间,一般来说,id + us + sy = 100
    wa 等待io时间
    --如果us%值占比很高,很可能是sql语句没有使用到索引或使用不当
    --如果是sy%占比很高,要关注mysql的等待时间和锁信息
    --如果wa%太高,要关注系统io,mysql使用磁盘临时表或刷盘等操作,可以后续用iostat来查看磁盘

    [root@localhost ~]# free -g
                  total        used        free      shared  buff/cache   available
    Mem:             17           3          10           0           3          13
    Swap:             1           0           1

    --free查看系统内存及使用情况
    一般mysql服务都不建议使用Swap,所以对应used项为0,如果使用了swap,就查看numa(numactl),看是否有多numa不均衡,建议关闭
    如果available(远远小于)<< total - free的值,说明多半可能出现了内存泄漏,
    出现了内存泄漏解决办法
    --重启mysql服务
    --升级到最新的小版本mysql

    [root@localhost ~]# vmstat 1
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0      0 11385476   1040 3261992    0    0     1     5    1   28  0  0 99  0  0
     0  0      0 11385336   1040 3262024    0    0     0     0  508  838  0  0 100  0  0
     0  0      0 11385336   1040 3262024    0    0     0     0  475  786  0  0 99  0  0
     0  0      0 11385336   1040 3262028    0    0     0     4  486  799  1  0 99  0  0
     0  0      0 11382916   1040 3262028    0    0     0     0  504  854  1  0 99  0  0
     0  0      0 11382668   1040 3262028    0    0     0     0  705 1076  1  1 99  0  0
     0  0      0 11382792   1040 3262036    0    0     0     0  559  902  1  0 99  0  0
     0  0      0 11383660   1040 3262036    0    0     0     0  487  796  1  0 99  0  0
     0  0      0 11383660   1040 3262048    0    0     0     0  533  874  1  0 99  0  0
     0  0      0 11383660   1040 3262048    0    0     0     0  478  833  0  0 99  0  0

    --vmstat 观察内存、swap、io、cpu等详细情况
    --r:就绪队列的长度,表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了
    --b:表示阻塞的进程
    --us(user)和sy(system)列,如果sy很高,说明cpu主要被内核占用
    --in:中断次数,如果值很大,说明中断处理也是个潜在的问题

    [root@localhost ~]# mpstat -P ALL 5
    Linux 3.10.0-514.ky3.kb5.x86_64 (localhost.localdomain)     04/19/2019     _x86_64_    (4 CPU)
    
    02:09:11 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    02:09:16 AM  all    0.50    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.30
    02:09:16 AM    0    1.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   98.80
    02:09:16 AM    1    0.40    0.00    0.40    0.00    0.00    0.20    0.00    0.00    0.00   99.00
    02:09:16 AM    2    0.60    0.00    0.20    0.20    0.00    0.00    0.00    0.00    0.00   99.00
    02:09:16 AM    3    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80

    --mpstat 观察各个逻辑cpu是否负载均衡(可能会出现中断不均衡导致性能问题)
    sys usr iowait

    perf,是linux2.6.31以后内置的性能分析工具,它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。

    [root@mysqlhq ~]# yum install perf -y
    [root@mysqlhq ~]# ps -ef|grep mysql
    [root@mysqlhq ~]# perf top -p 4122
    Samples: 746  of event 'cpu-clock', Event count (approx.): 75362059                                                                                                                                                 
    Overhead  Shared Object       Symbol                                                                                                                                                                                
      43.43%  [kernel]            [k] find_get_pages
      10.55%  [kernel]            [k] radix_tree_next_chunk
       1.87%  mysqld              [.] lfind
       1.75%  libc-2.17.so        [.] __memcpy_ssse3_back
       1.67%  mysqld              [.] MYSQLparse
       1.27%  [kernel]            [k] mpt_put_msg_frame
       0.97%  mysqld              [.] my_hash_sort_utf8
       0.77%  [kernel]            [k] finish_task_switch
       0.74%  mysqld              [.] Protocol::net_store_data
       0.74%  [kernel]            [k] _raw_spin_unlock_irqrestore
       0.67%  mysqld              [.] mtr_commit
       0.62%  mysqld              [.] alloc_root
       0.62%  mysqld              [.] close_thread_table
       0.61%  [kernel]            [k] system_call_after_swapgs
       0.60%  mysqld              [.] Protocol::store_string_aux
       0.59%  mysqld              [.] page_cur_search_with_match
       0.55%  mysqld              [.] buf_page_get_gen
       0.48%  [kernel]            [k] fget_light
       0.46%  mysqld              [.] my_strcasecmp_utf8
       0.45%  [kernel]            [k] xlog_space_left
       0.44%  mysqld              [.] btr_cur_search_to_nth_level
       0.43%  mysqld              [.] show_status_array
       0.42%  mysqld              [.] sync_array_print_long_waits
       0.42%  [kernel]            [k] kmem_cache_alloc
       0.40%  libc-2.17.so        [.] __memcmp_sse4_1
       0.40%  mysqld              [.] THD::enter_stage
       0.37%  mysqld              [.] Item_cond::fix_fields
       0.35%  [kernel]            [k] do_sys_poll
       0.34%  libc-2.17.so        [.] malloc
       0.34%  mysqld              [.] btr_search_guess_on_hash
    [root@mysqlhq ~]# perf top
       Samples: 1K of event 'cpu-clock', Event count (approx.): 189946503                                                                                                                                                  
    Overhead  Shared Object               Symbol                                                                                                                                                                        
       9.06%  [kernel]                    [k] find_get_pages
       3.46%  [kernel]                    [k] __do_softirq
       3.27%  [kernel]                    [k] _raw_spin_unlock_irqrestore
       2.83%  [kernel]                    [k] finish_task_switch
       2.83%  [kernel]                    [k] radix_tree_next_chunk
       1.74%  perf                        [.] __symbols__insert
       1.64%  [kernel]                    [k] clear_page
       1.49%  [kernel]                    [k] kallsyms_expand_symbol.constprop.1
       1.16%  libc-2.17.so                [.] __memcpy_ssse3_back
       1.16%  libslang.so.2.2.4           [.] SLsmg_write_
    --Overhead,是该符号的性能事件所在所有采样中的比例,用百分比来表示
    --Shared,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
    --Object,是动态共享对象的类型,比如[.]表示用户空间的可执行程序、或者动态链接库,而[k]则表示内核空间
    --Symbol 是符号名,也就是函数名,当函数名未知时,用十六进制的地址来表示
    第一行包含3个数据,分别是采样数据Samples,事件类型event和事件总数 Event count,比如这个例子中,perf总共采集了476个cpu时钟事件,而总事件数是75362059
    [root@mysqlhq ~]# perf record #ctrl+c终止
    $ perf report --sort comm,dso,symbol | head -10
      PerfTop:       7 irqs/sec  kernel:42.9%  exact:  0.0% [1000Hz cpu-clock],  (target_pid: 2974)
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------                      
    
                 samples  pcnt function                                                                                                              DSO
                 _______ _____ _____________________________________________________________________________________________________________________ ___________________________
    
                  176.00 14.8% _Z24btr_search_guess_on_hashP12dict_index_tP12btr_search_tPK8dtuple_tmmP9btr_cur_tmP5mtr_t                            /usr/local/mysql/bin/mysqld
                  147.00 12.3% _Z20rec_get_offsets_funcPKhPK12dict_index_tPmmPP16mem_block_info_t                                                    /usr/local/mysql/bin/mysqld
                  108.00  9.1% _Z16buf_page_get_genRK9page_id_tRK11page_size_tmP11buf_block_tmPKcmP5mtr_tb                                           /usr/local/mysql/bin/mysqld
                   85.00  7.1% my_strnncollsp_utf8                                                                                                   /usr/local/mysql/bin/mysqld
                   74.00  6.2% _Z29cmp_dtuple_rec_with_match_lowPK8dtuple_tPKhPKmmPm                                                                 /usr/local/mysql/bin/mysqld
                   70.00  5.9% _Z23ha_insert_for_fold_funcP12hash_table_tmPKh                                                                        /usr/local/mysql/bin/mysqld
                   67.00  5.6% _Z26page_cur_search_with_matchPK11buf_block_tPK12dict_index_tPK8dtuple_t15page_cur_mode_tPmS9_P10page_cur_tP8rtr_info /usr/local/mysql/bin/mysqld
                   65.00  5.5% _raw_spin_unlock_irqrestore                                                                                           [kernel.kallsyms]          
                   49.00  4.1% __GI_memcpy                                                                                                           /lib64/libc-2.12.so        
                   36.00  3.0% _Z8ut_delaym                                                                                                          /usr/local/mysql/bin/mysqld
                   31.00  2.6% _Z27ha_remove_all_nodes_to_pageP12hash_table_tmPKh                                                                    /usr/local/mysql/bin/mysqld
                   28.00  2.3% _Z19ha_delete_hash_nodeP12hash_table_tP9ha_node_t                                                                     /usr/local/mysql/bin/mysqld
                   27.00  2.3% finish_task_switch                                                                                                    [kernel.kallsyms]          
                   23.00  1.9% _ZN11PolicyMutexI14TTASEventMutexI16BlockMutexPolicyEE5enterEjjPKcj                                                   /usr/local/mysql/bin/mysqld
                   17.00  1.4% _ZL15cmp_whole_fieldmmPKhjS0_j                                                                                        /usr/local/mysql/bin/mysqld
                   12.00  1.0% _Z15row_search_mvccPh15page_cur_mode_tP14row_prebuilt_tmm                                                             /usr/local/mysql/bin/mysqld
                   12.00  1.0% _ZN5mtr_t7Command11release_allEv                                                                                      /usr/local/mysql/bin/mysqld
                   11.00  0.9% _Z40row_sel_field_store_in_mysql_format_funcPhPK17mysql_row_templ_tPKhm                                               /usr/local/mysql/bin/mysqld
                   10.00  0.8% _Z41btr_cur_search_to_nth_level_with_no_latchP12dict_index_tmPK8dtuple_t15page_cur_mode_tP9btr_cur_tPKcmP5mtr_tb      /usr/local/mysql/bin/mysqld
                   10.00  0.8% get_charset                                                                                                           /usr/local/mysql/bin/mysqld
                   10.00  0.8% _Z18get_datetime_valueP3THDPPP4ItemS3_S2_Pb                                                                           /usr/local/mysql/bin/mysqld
                   10.00  0.8% _ZL30row_sel_store_mysql_field_funcPhP14row_prebuilt_tPKhPKmmPK17mysql_row_templ_tm                                   /usr/local/mysql/bin/mysqld
                    9.00  0.8% _Z11ut_crc32_hwPKhm                                                                                                   /usr/local/mysql/bin/mysqld
                    8.00  0.7% _Z27btr_cur_search_to_nth_levelP12dict_index_tmPK8dtuple_t15page_cur_mode_tmP9btr_cur_tmPKcmP5mtr_t                   /usr/local/mysql/bin/mysqld
                    7.00  0.6% _ZL18rw_lock_s_lock_lowP9rw_lock_tmPKcm                                                                               /usr/local/mysql/bin/mysqld
                    7.00  0.6% _ZL23row_sel_store_mysql_recPhP14row_prebuilt_tPKhPK8dtuple_tmPK12dict_index_tPKmb                                    /usr/local/mysql/bin/mysqld
                    6.00  0.5% _Z18row_search_no_mvccPh15page_cur_mode_tP14row_prebuilt_tmm                                                          /usr/local/mysql/bin/mysqld
                    6.00  0.5% _ZN11PolicyMutexI14TTASEventMutexI16BlockMutexPolicyEE4exitEv                                                         /usr/local/mysql/bin/mysqld
                    6.00  0.5% _Z38row_mysql_store_col_in_innobase_formatP8dfield_tPhmPKhmm                                                          /usr/local/mysql/bin/mysqld
                    6.00  0.5% _Z21dict_index_copy_typesP8dtuple_tPK12dict_index_tm                                                                  /usr/local/mysql/bin/mysqld
                    5.00  0.4% _Z18buf_block_from_ahiPKh                                                                                             /usr/local/mysql/bin/mysqld
                    5.00  0.4% system_call_after_swapgs                                                                                              [kernel.kallsyms]          
                    5.00  0.4% pfs_start_rwlock_wait_v1                                                                                              /usr/local/mysql/bin/mysqld
    [root@mysqlhq ~]# perf record #ctrl+c终止
    [root@mysqlhq ~]# perf record
    
    ^C[ perf record: Woken up 11 times to write data ]
    [ perf record: Captured and wrote 3.328 MB perf.data (53866 samples) ]
    
    [root@mysqlhq ~]# perf report --sort comm,dso,symbol | head -100
    no symbols found in /usr/bin/cut, maybe install a debug package?
    no symbols found in /usr/sbin/rngd, maybe install a debug package?
    Failed to open /tmp/perf-2276.map, continuing without symbols
    # To display the perf.data header info, please use --header/--header-only options.
    #
    #
    # Total Lost Samples: 0
    #
    # Samples: 53K of event 'cpu-clock'
    # Event count (approx.): 13466500000
    #
    # Overhead  Command        Shared Object                  Symbol                                        
    # ........  .............  .............................  ..............................................
    #
        98.21%  swapper        [kernel.kallsyms]              [k] native_safe_halt
         0.25%  mysqld         [kernel.kallsyms]              [k] find_get_pages
         0.06%  mysqld         [kernel.kallsyms]              [k] radix_tree_next_chunk
         0.05%  swapper        [kernel.kallsyms]              [k] _raw_spin_unlock_irqrestore
         0.04%  swapper        [kernel.kallsyms]              [k] __do_softirq
         0.02%  mysql          libc-2.17.so                   [.] __strncmp_sse42
         0.02%  swapper        [kernel.kallsyms]              [k] tick_nohz_idle_exit
         0.02%  swapper        [kernel.kallsyms]              [k] rcu_process_callbacks
         0.02%  swapper        [kernel.kallsyms]              [k] run_timer_softirq
         0.02%  sh             [kernel.kallsyms]              [k] __do_page_fault
         0.02%  rcu_sched      [kernel.kallsyms]              [k] finish_task_switch

    iotop – simple top-like I/O monitor
    iotop是一个用来监视磁盘I/O使用状况的 top 类工具,可监测到哪一个程序使用的磁盘IO的信息(requires 2.6.20 or later)
    yum -y install iotop

    --version #显示版本号
    -h, --help #显示帮助信息
    -o, --only #显示进程或者线程实际上正在做的I/O,而不是全部的,可以随时切换按o
    -b, --batch #运行在非交互式的模式
    -n NUM, --iter=NUM #在非交互式模式下,设置显示的次数,
    -d SEC, --delay=SEC #设置显示的间隔秒数,支持非整数值
    -p PID, --pid=PID #只显示指定PID的信息
    -u USER, --user=USER #显示指定的用户的进程的信息
    -P, --processes #只显示进程,一般为显示所有的线程
    -a, --accumulated #显示从iotop启动后每个线程完成了的IO总数
    -k, --kilobytes #以千字节显示
    -t, --time #在每一行前添加一个当前的时间
    -q, --quiet #suppress some lines of header (implies --batch). This option can be specified up to three times to remove header lines.
    -q column names are only printed on the first iteration,
    -qq column names are never printed,
    -qqq the I/O summary is never printed.

    # iotop -oP
    Total DISK READ :    0.00 B/s | Total DISK WRITE :      15.49 K/s
    Actual DISK READ:    0.00 B/s | Actual DISK WRITE:      16.46 K/s
      PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                       
      680 be/3 root        0.00 B/s    7.75 K/s  0.00 %  0.29 % auditd -n
       36 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.01 % [kworker/2:1]
      989 be/4 root        0.00 B/s    7.75 K/s  0.00 %  0.00 % rsyslogd -n

    如果出现jbd2/vda1-8 占用大量磁盘io,建议磁盘分区的文件格式XFS,不要使用ext4格式的磁盘


    [root@localhost ~]# df -Th
    Filesystem Type Size Used Avail Use% Mounted on
    /dev/mapper/kylin-root xfs 496G 14G 483G 3% /
    /dev/sda1 xfs 1014M 181M 834M 18% /boot

    如果是虚拟机或者云主机怎么办
    云主机就只能联系云厂商去协商解决
    必要时,也要检查硬件层的情况
    在查看硬件层、系统层有无异常事件


    /var/log/messages*
    /var/log/dmesg
    /var/log/kern*

    在查看mysql的整体情况

    sys schema(mysql 5.7+)
    --select * from sys.host_summary order by statements desc limit 10;
    --select statement,total,total_latency,rows_sent,rows_examined,rows_affected,
    full_scans from sys.host_summary_by_statement_type where host='localhost' order by total desc limit 5;

    pt-summary ##收集和显示系统概况
    pt-mysql-summary ##对mysql配置和status进行汇总
    pt-variable-advisor ##分析参数,并提出建议
    pt-mext ##并行查看status样本信息

    sys schema解读

    查看MySQL当前的线程状态
    (system@127.0.0.1:3306) [information_schema]> show full processlist;
    其他需要关注的状态有: coping to tmp table、sending data、 creating sort index、 sorting result、 query end、 Waiting ... lock等等

    查看InnoDB关键状态指标
    (system@127.0.0.1:3306) [information_schema]> show engine innodb statusG;
    ---TRANSACTION 0, ACTIVE 2130 sec ## 事务的时间,长事务,有问题
    12360 lock struct(s),heap size 15384566,51242 row lock(s), undo log entires 64423 ##大量的行锁和大量的undo 日志
    除此外,也要关注“A long semaphore wait”告警

    查看MySQL关键状态指标
    (system@127.0.0.1:3306) [information_schema]> show global status like 'handler_read%';
    +-----------------------+------------+
    | Variable_name | Value |
    +-----------------------+------------+
    | Handler_read_first | 1463098 |
    | Handler_read_key | 47240483 |
    | Handler_read_last | 2 |
    | Handler_read_next | 172676638 |
    | Handler_read_prev | 44 |
    | Handler_read_rnd | 8799996 | ##查询直接操作了数据文件,很多时候表现为没有使用索引或者文件排序
    | Handler_read_rnd_next | 1374741574 | ##通常说明你的表索引不正确或写入的查询没有利用索引。
    +-----------------------+------------+
    其他指标: Created_tmp_tables、 Created_tmp_disk_tables、Select_scan、 Select_full_join、 Sort_merge_passes等等

    干掉垃圾sql
    explain、 desc
    optimizer_trace
    profiling
    session status
    pt-query-digest

    explain
    type:显示关联类型。重点关注ALL(全表扫描)、 index(全索引扫描)
    key_len:使用到索引的长度。通常该值大于30就要注意被选中的索引是否字符串类型,可否进一步优化
    rows:预估扫描的行数。通常该值大于1万就要注意可否选择更合适的索引减少扫描的行数
    extra:显示额外信息。重点关注Using temporary,Using filesort,尽量通过添加或调整来消除

    optimizer_trace
    mysql> set optimizer_trace='enabled=on';
    mysql>
    set optimizer_trace_max_mem_size=1000000;
    mysql> explain ...
    mysql> select * from
    information_schema.optimizer_traceG
    
    "analyzing_range_alternatives": {
                        "range_scan_alternatives": [
                          {
                            "index": "ind_c2",
                            "ranges": [
                              "b <= c2 <= b"
                            ],
                            "index_dives_for_eq_ranges": true,
                            "rowid_ordered": true,
                            "using_mrr": false,
                            "index_only": false,
                            "rows": 4,  --扫描行数
                            "cost": 5.81, --代价
                            "chosen": false, --未被选中
                            "cause": "cost" --未被选中原因是"成本太高"
                          },
                          {
                            "index": "ind_c4",
                            "ranges": [
                              "20 <= c4 <= 20"
                            ],
                            "index_dives_for_eq_ranges": true,
                            "rowid_ordered": true,
                            "using_mrr": false,
                            "index_only": false,
                            "rows": 2, --扫描行数
                            "cost": 3.41, --代价
                            "chosen": true  --被选中
                          },
                          {
                            "index": "ind_c2_c4",
                            "ranges": [
                              "b <= c2 <= b AND 20 <= c4 <= 20"
                            ],
                            "index_dives_for_eq_ranges": true,
                            "rowid_ordered": true,
                            "using_mrr": false,
                            "index_only": false,
                            "rows": 2,
                            "cost": 3.41,
                            "chosen": false,
                            "cause": "cost"
                          }
                        ],

    profiling

    mysql> set profiling=1;
    mysql> select * from t order by non_key_col;
    mysql> show profiles;
    mysql> show profile for query 1;
    
    session status
    mysql> pager cat - > /dev/null;
    mysql> flush status;
    mysql> select * from t order by non_key_col;
    mysql> nopager;
    mysql> show status like ‘handler_read_%’;

    pt-query-digest

    [root@DSI log]# pt-query-digest mysql-slow.log > pt_slow.log
    [root@DSI log]# cat pt_slow.log 
    
    # A software update is available:
    
    # 140ms user time, 40ms system time, 25.21M rss, 214.06M vsz
    # Current date: Fri Apr 19 16:34:42 2019
    # Hostname: DSI
    # Files: mysql-slow.log
    # Overall: 70 total, 20 unique, 0.00 QPS, 0.00x concurrency ______________
    # Time range: 2019-04-17T14:30:16 to 2019-04-18T09:40:49
    # Attribute          total     min     max     avg     95%  stddev  median
    # ============     ======= ======= ======= ======= ======= ======= =======
    # Exec time            51s   355us      7s   724ms      4s      1s     7ms
    # Lock time          118ms       0    14ms     2ms     8ms     3ms   131us
    # Rows sent         11.21M       0   2.71M 164.03k 419.40k 545.43k   14.52
    # Rows examine     106.53M     120  13.56M   1.52M  13.08M   3.64M  363.48
    # Query size         9.87k      47     554  144.34  234.30   98.56   97.36
    
    # Profile
    # Rank Query ID                         Response time Calls R/Call V/M   I
    # ==== ================================ ============= ===== ====== ===== =
    #    1 0xAF2BD8B9E02829BB4A867D8C3EE... 14.4647 28.5%     2 7.2324  0.02 SELECT employees salaries
    #    2 0xE3C753C2F267B2D767A347A2812... 12.9679 25.6%    12 1.0807  0.76 SELECT salaries
    #    3 0x8266D3C2CA3BBCEDB3A67A18A29...  9.8776 19.5%     3 3.2925  0.00 SELECT employees salaries
    #    4 0xCEE7829C0836E31C7E6778A1B13...  7.1704 14.1%     2 3.5852  0.00 SELECT employees salaries
    #    5 0xD41AD7ECDD2C0E2E8210300E878...  3.6396  7.2%     1 3.6396  0.00 SELECT employees salaries
    #    6 0xBF4B43B9689E5DF79B0A74D7D42...  1.2942  2.6%     1 1.2942  0.00 SELECT salaries cte
    # MISC 0xMISC                            1.2712  2.5%    49 0.0259   0.0 <14 ITEMS>
    
    # Query 1: 0.08 QPS, 0.58x concurrency, ID 0xAF2BD8B9E02829BB4A867D8C3EE5F2BB at byte 10609
    # Scores: V/M = 0.02
    # Time range: 2019-04-17T16:01:32 to 2019-04-17T16:01:57
    # Attribute    pct   total     min     max     avg     95%  stddev  median
    # ============ === ======= ======= ======= ======= ======= ======= =======
    # Count          2       2
    # Exec time     28     14s      7s      7s      7s      7s   365ms      7s
    # Lock time      7     8ms   162us     8ms     4ms     8ms     6ms     4ms
    # Rows sent      0      20      10      10      10      10       0      10
    # Rows examine  25  27.12M  13.56M  13.56M  13.56M  13.56M       0  13.56M
    # Query size     6     688     341     347     344     347    4.24     344
    # String:
    # Databases    employees
    # Hosts        10.15.7.126 (1/50%), localhost (1/50%)
    # Users        root (1/50%), system (1/50%)
    # Query_time distribution
    #   1us
    #  10us
    # 100us
    #   1ms
    #  10ms
    # 100ms
    #    1s  ################################################################
    #  10s+
    # Tables
    #    SHOW TABLE STATUS FROM `employees` LIKE 'employees'G
    #    SHOW CREATE TABLE `employees`.`employees`G
    #    SHOW TABLE STATUS FROM `employees` LIKE 'salaries'G
    #    SHOW CREATE TABLE `employees`.`salaries`G
    # EXPLAIN /*!50100 PARTITIONS*/
    select year(hire_date) hire_date_year,salary,rank()over w as 'rank',
    first_value(salary) over w as 'first',
    nth_value(salary,3) over w as 'third',
    last_value(salary) over w as 'last'
    from employees join salaries on salaries.emp_no=employees.emp_no
    window w as (partition by year(hire_date) order by salary desc)
    order by salary desc limit 10G

    几个窍门
    mysqld进程消耗cpu长时间超过90%的话,99.9%是因为没用好索引
    cpu的%sys很高的话,大概率是swap或中断不均衡导致,也有可能是有多个索引且超高并发写入(更新),或者有很严重的锁等待事件
    最大的瓶颈通常是在磁盘I/O上,因此尽量用高速磁盘设备
    如果物理磁盘无法再升级,则通过增加内存提升性能容量
    遇到无法诊断的问题时,试试用perf top来观测跟踪
    sql执行慢,有时未必是效率低,也可能是因为锁等待导致,甚至是磁盘满了

    这次分享,叶老师的还是很给力。感谢分享。

  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10737275.html
Copyright © 2011-2022 走看看