Mysql

在組複製上調整 MySQL

  • April 5, 2022

我即將在 GROUP REPLICATION 中從舊版本的 MySQL 5.6(主/從配置)切換到 MySQL 8(多主配置上的 3 個節點)。

這些表是 99% 的 InnoDB。

webfarm 只是將之前的 InnoDB 配置變數複製到這些新機器上。我想知道如何提高性能,每台機器都有以下配置:

1) Cpu:    
           12 core (Intel Xeon Processor (Skylake, IBRS))

2) RAM:        
           total        used       free           shared   buff/cache   available

Mem:        49456252     5164100    11487392       18972    32804760     43676276
Swap:        1998844        6924     1991920

3) Disk:
           Filesystem             Size  Used Avail Use% Mounted on
           /dev/sda2               54G  1.2G   50G   3% /
           /dev/mapper/vg0-mysql 1004G  414G  590G  42% /var/lib/mysql

我所有的數據庫都是 250GB 的數據。

InnnoDB 變數:

*************************** 1. row ***************************
Variable_name: innodb_adaptive_flushing
       Value: ON
*************************** 2. row ***************************
Variable_name: innodb_adaptive_flushing_lwm
       Value: 10
*************************** 3. row ***************************
Variable_name: innodb_adaptive_hash_index
       Value: ON
*************************** 4. row ***************************
Variable_name: innodb_adaptive_hash_index_parts
       Value: 8
*************************** 5. row ***************************
Variable_name: innodb_adaptive_max_sleep_delay
       Value: 150000
*************************** 6. row ***************************
Variable_name: innodb_api_bk_commit_interval
       Value: 5
*************************** 7. row ***************************
Variable_name: innodb_api_disable_rowlock
       Value: OFF
*************************** 8. row ***************************
Variable_name: innodb_api_enable_binlog
       Value: OFF
*************************** 9. row ***************************
Variable_name: innodb_api_enable_mdl
       Value: OFF
*************************** 10. row ***************************
Variable_name: innodb_api_trx_level
       Value: 0
*************************** 11. row ***************************
Variable_name: innodb_autoextend_increment
       Value: 64
*************************** 12. row ***************************
Variable_name: innodb_autoinc_lock_mode
       Value: 2
*************************** 13. row ***************************
Variable_name: innodb_buffer_pool_chunk_size
       Value: 134217728
*************************** 14. row ***************************
Variable_name: innodb_buffer_pool_dump_at_shutdown
       Value: ON
*************************** 15. row ***************************
Variable_name: innodb_buffer_pool_dump_now
       Value: OFF
*************************** 16. row ***************************
Variable_name: innodb_buffer_pool_dump_pct
       Value: 25
*************************** 17. row ***************************
Variable_name: innodb_buffer_pool_filename
       Value: ib_buffer_pool
*************************** 18. row ***************************
Variable_name: innodb_buffer_pool_in_core_file
       Value: ON
*************************** 19. row ***************************
Variable_name: innodb_buffer_pool_instances
       Value: 8
*************************** 20. row ***************************
Variable_name: innodb_buffer_pool_load_abort
       Value: OFF
*************************** 21. row ***************************
Variable_name: innodb_buffer_pool_load_at_startup
       Value: ON
*************************** 22. row ***************************
Variable_name: innodb_buffer_pool_load_now
       Value: OFF
*************************** 23. row ***************************
Variable_name: innodb_buffer_pool_size
       Value: 34359738368
*************************** 24. row ***************************
Variable_name: innodb_change_buffer_max_size
       Value: 25
*************************** 25. row ***************************
Variable_name: innodb_change_buffering
       Value: all
*************************** 26. row ***************************
Variable_name: innodb_checksum_algorithm
       Value: crc32
*************************** 27. row ***************************
Variable_name: innodb_cmp_per_index_enabled
       Value: OFF
*************************** 28. row ***************************
Variable_name: innodb_commit_concurrency
       Value: 0
*************************** 29. row ***************************
Variable_name: innodb_compression_failure_threshold_pct
       Value: 5
*************************** 30. row ***************************
Variable_name: innodb_compression_level
       Value: 6
*************************** 31. row ***************************
Variable_name: innodb_compression_pad_pct_max
       Value: 50
*************************** 32. row ***************************
Variable_name: innodb_concurrency_tickets
       Value: 5000
*************************** 33. row ***************************
Variable_name: innodb_data_file_path
       Value: ibdata1:12M:autoextend
*************************** 34. row ***************************
Variable_name: innodb_data_home_dir
       Value:
*************************** 35. row ***************************
Variable_name: innodb_deadlock_detect
       Value: ON
*************************** 36. row ***************************
Variable_name: innodb_dedicated_server
       Value: OFF
*************************** 37. row ***************************
Variable_name: innodb_default_row_format
       Value: dynamic
*************************** 38. row ***************************
Variable_name: innodb_directories
       Value:
*************************** 39. row ***************************
Variable_name: innodb_disable_sort_file_cache
       Value: OFF
*************************** 40. row ***************************
Variable_name: innodb_doublewrite
       Value: ON
*************************** 41. row ***************************
Variable_name: innodb_fast_shutdown
       Value: 1
*************************** 42. row ***************************
Variable_name: innodb_file_per_table
       Value: ON
*************************** 43. row ***************************
Variable_name: innodb_fill_factor
       Value: 100
*************************** 44. row ***************************
Variable_name: innodb_flush_log_at_timeout
       Value: 1
*************************** 45. row ***************************
Variable_name: innodb_flush_log_at_trx_commit
       Value: 1
*************************** 46. row ***************************
Variable_name: innodb_flush_method
       Value: O_DIRECT
*************************** 47. row ***************************
Variable_name: innodb_flush_neighbors
       Value: 0
*************************** 48. row ***************************
Variable_name: innodb_flush_sync
       Value: ON
*************************** 49. row ***************************
Variable_name: innodb_flushing_avg_loops
       Value: 30
*************************** 50. row ***************************
Variable_name: innodb_force_load_corrupted
       Value: OFF
*************************** 51. row ***************************
Variable_name: innodb_force_recovery
       Value: 0
*************************** 52. row ***************************
Variable_name: innodb_fsync_threshold
       Value: 0
*************************** 53. row ***************************
Variable_name: innodb_ft_aux_table
       Value:
*************************** 54. row ***************************
Variable_name: innodb_ft_cache_size
       Value: 8000000
*************************** 55. row ***************************
Variable_name: innodb_ft_enable_diag_print
       Value: OFF
*************************** 56. row ***************************
Variable_name: innodb_ft_enable_stopword
       Value: ON
*************************** 57. row ***************************
Variable_name: innodb_ft_max_token_size
       Value: 84
*************************** 58. row ***************************
Variable_name: innodb_ft_min_token_size
       Value: 3
*************************** 59. row ***************************
Variable_name: innodb_ft_num_word_optimize
       Value: 2000
*************************** 60. row ***************************
Variable_name: innodb_ft_result_cache_limit
       Value: 2000000000
*************************** 61. row ***************************
Variable_name: innodb_ft_server_stopword_table
       Value:
*************************** 62. row ***************************
Variable_name: innodb_ft_sort_pll_degree
       Value: 2
*************************** 63. row ***************************
Variable_name: innodb_ft_total_cache_size
       Value: 640000000
*************************** 64. row ***************************
Variable_name: innodb_ft_user_stopword_table
       Value:
*************************** 65. row ***************************
Variable_name: innodb_io_capacity
       Value: 200
*************************** 66. row ***************************
Variable_name: innodb_io_capacity_max
       Value: 2000
*************************** 67. row ***************************
Variable_name: innodb_lock_wait_timeout
       Value: 120
*************************** 68. row ***************************
Variable_name: innodb_log_buffer_size
       Value: 134217728
*************************** 69. row ***************************
Variable_name: innodb_log_checksums
       Value: ON
*************************** 70. row ***************************
Variable_name: innodb_log_compressed_pages
       Value: ON
*************************** 71. row ***************************
Variable_name: innodb_log_file_size
       Value: 268435456
*************************** 72. row ***************************
Variable_name: innodb_log_files_in_group
       Value: 2
*************************** 73. row ***************************
Variable_name: innodb_log_group_home_dir
       Value: ./
*************************** 74. row ***************************
Variable_name: innodb_log_spin_cpu_abs_lwm
       Value: 80
*************************** 75. row ***************************
Variable_name: innodb_log_spin_cpu_pct_hwm
       Value: 50
*************************** 76. row ***************************
Variable_name: innodb_log_wait_for_flush_spin_hwm
       Value: 400
*************************** 77. row ***************************
Variable_name: innodb_log_write_ahead_size
       Value: 8192
*************************** 78. row ***************************
Variable_name: innodb_lru_scan_depth
       Value: 1024
*************************** 79. row ***************************
Variable_name: innodb_max_dirty_pages_pct
       Value: 90.000000
*************************** 80. row ***************************
Variable_name: innodb_max_dirty_pages_pct_lwm
       Value: 10.000000
*************************** 81. row ***************************
Variable_name: innodb_max_purge_lag
       Value: 0
*************************** 82. row ***************************
Variable_name: innodb_max_purge_lag_delay
       Value: 0
*************************** 83. row ***************************
Variable_name: innodb_max_undo_log_size
       Value: 1073741824
*************************** 84. row ***************************
Variable_name: innodb_monitor_disable
       Value:
*************************** 85. row ***************************
Variable_name: innodb_monitor_enable
       Value:
*************************** 86. row ***************************
Variable_name: innodb_monitor_reset
       Value:
*************************** 87. row ***************************
Variable_name: innodb_monitor_reset_all
       Value:
*************************** 88. row ***************************
Variable_name: innodb_numa_interleave
       Value: OFF
*************************** 89. row ***************************
Variable_name: innodb_old_blocks_pct
       Value: 37
*************************** 90. row ***************************
Variable_name: innodb_old_blocks_time
       Value: 1000
*************************** 91. row ***************************
Variable_name: innodb_online_alter_log_max_size
       Value: 134217728
*************************** 92. row ***************************
Variable_name: innodb_open_files
       Value: 3459
*************************** 93. row ***************************
Variable_name: innodb_optimize_fulltext_only
       Value: OFF
*************************** 94. row ***************************
Variable_name: innodb_page_cleaners
       Value: 4
*************************** 95. row ***************************
Variable_name: innodb_page_size
       Value: 16384
*************************** 96. row ***************************
Variable_name: innodb_parallel_read_threads
       Value: 4
*************************** 97. row ***************************
Variable_name: innodb_print_all_deadlocks
       Value: OFF
*************************** 98. row ***************************
Variable_name: innodb_print_ddl_logs
       Value: OFF
*************************** 99. row ***************************
Variable_name: innodb_purge_batch_size
       Value: 300
*************************** 100. row ***************************
Variable_name: innodb_purge_rseg_truncate_frequency
       Value: 128
*************************** 101. row ***************************
Variable_name: innodb_purge_threads
       Value: 4
*************************** 102. row ***************************
Variable_name: innodb_random_read_ahead
       Value: OFF
*************************** 103. row ***************************
Variable_name: innodb_read_ahead_threshold
       Value: 56
*************************** 104. row ***************************
Variable_name: innodb_read_io_threads
       Value: 4
*************************** 105. row ***************************
Variable_name: innodb_read_only
       Value: OFF
*************************** 106. row ***************************
Variable_name: innodb_redo_log_archive_dirs
       Value:
*************************** 107. row ***************************
Variable_name: innodb_redo_log_encrypt
       Value: OFF
*************************** 108. row ***************************
Variable_name: innodb_replication_delay
       Value: 0
*************************** 109. row ***************************
Variable_name: innodb_rollback_on_timeout
       Value: OFF
*************************** 110. row ***************************
Variable_name: innodb_rollback_segments
       Value: 128
*************************** 111. row ***************************
Variable_name: innodb_sort_buffer_size
       Value: 1048576
*************************** 112. row ***************************
Variable_name: innodb_spin_wait_delay
       Value: 6
*************************** 113. row ***************************
Variable_name: innodb_spin_wait_pause_multiplier
       Value: 50
*************************** 114. row ***************************
Variable_name: innodb_stats_auto_recalc
       Value: ON
*************************** 115. row ***************************
Variable_name: innodb_stats_include_delete_marked
       Value: OFF
*************************** 116. row ***************************
Variable_name: innodb_stats_method
       Value: nulls_equal
*************************** 117. row ***************************
Variable_name: innodb_stats_on_metadata
       Value: OFF
*************************** 118. row ***************************
Variable_name: innodb_stats_persistent
       Value: ON
*************************** 119. row ***************************
Variable_name: innodb_stats_persistent_sample_pages
       Value: 20
*************************** 120. row ***************************
Variable_name: innodb_stats_transient_sample_pages
       Value: 8
*************************** 121. row ***************************
Variable_name: innodb_status_output
       Value: OFF
*************************** 122. row ***************************
Variable_name: innodb_status_output_locks
       Value: OFF
*************************** 123. row ***************************
Variable_name: innodb_strict_mode
       Value: ON
*************************** 124. row ***************************
Variable_name: innodb_sync_array_size
       Value: 1
*************************** 125. row ***************************
Variable_name: innodb_sync_spin_loops
       Value: 30
*************************** 126. row ***************************
Variable_name: innodb_table_locks
       Value: ON
*************************** 127. row ***************************
Variable_name: innodb_temp_data_file_path
       Value: ibtmp1:12M:autoextend
*************************** 128. row ***************************
Variable_name: innodb_temp_tablespaces_dir
       Value: ./#innodb_temp/
*************************** 129. row ***************************
Variable_name: innodb_thread_concurrency
       Value: 12
*************************** 130. row ***************************
Variable_name: innodb_thread_sleep_delay
       Value: 0
*************************** 131. row ***************************
Variable_name: innodb_tmpdir
       Value:
*************************** 132. row ***************************
Variable_name: innodb_undo_directory
       Value: ./
*************************** 133. row ***************************
Variable_name: innodb_undo_log_encrypt
       Value: OFF
*************************** 134. row ***************************
Variable_name: innodb_undo_log_truncate
       Value: ON
*************************** 135. row ***************************
Variable_name: innodb_undo_tablespaces
       Value: 2
*************************** 136. row ***************************
Variable_name: innodb_use_native_aio
       Value: ON
*************************** 137. row ***************************
Variable_name: innodb_version
       Value: 8.0.17
*************************** 138. row ***************************
Variable_name: innodb_write_io_threads
       Value: 4
*************************** 139. row **************************
Variable_name: max_connections
       Value: 3072
*************************** 140. row ***************************
Variable_name: max_user_connections
       Value: 3072

我讀了很多關於緩衝池大小的文章(80% 的規則),但我仍在考慮是否還有其他變數需要增加。

在實際的主伺服器中,我有以下統計數據: 在此處輸入圖像描述

另外我嘗試執行 mysqltuner perl 腳本,這些是建議:

-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
   Control warning line(s) into /var/log/mysql/error.log file
   Control error line(s) into /var/log/mysql/error.log file
   MySQL was started within the last 24 hours - recommendations may be inaccurate
   Reduce your overall MySQL memory footprint for system stability
   Dedicate this server to your database for highest performance.
   Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
   Before changing innodb_log_file_size and/or innodb_log_files_in_group read this: https://bit.ly/2TcGgtU
Variables to adjust:
 *** MySQL's maximum memory usage is dangerously high ***
 *** Add RAM before increasing MySQL buffer variables ***
   table_definition_cache(2000) > 464470 or -1 (autosizing if supported)
   innodb_buffer_pool_size (>= 241.7G) if possible.
   innodb_log_file_size should be (=3G) if possible, so InnoDB total log files size equals to 25% of buffer pool size.
   innodb_buffer_pool_instances(=24)

行“innodb_buffer_pool_size (>= 241.7G) 如果可能的話。” 讓我有點震驚,怎麼可能有這麼大的 RAM 和緩衝池?

我知道這與我之前提到的數據大小(250GB)有關,但不建議使用這麼大的記憶體嗎?隨時詢問其他細節,感謝您的幫助!

@danblack

在其中一台 GROUP REPLICATION 機器的 mysql 配置文件下方,我的客戶現在不使用這些機器,當一切準備就緒並正確配置後,我將切換到它們。

https://pastebin.com/dS1AeM2R

這是關於 GR 機器的完整 mysqltuner 報告: https ://pastebin.com/XEFbpGUV

@Wilson Hauck 我沒有將 SSD 或 NVMEE 視為設備:

pvdisplay
 --- Physical volume ---
 PV Name               /dev/sdc
 VG Name               vg0
 PV Size               <651.93 GiB / not usable 4.00 MiB
 Allocatable           yes
 PE Size               4.00 MiB
 Total PE              166893
 Free PE               493
 Allocated PE          166400
 PV UUID               4Xco4e-Es5d-LcZ2-FHxt-8PYw-B1E6-h9nwP8

cat /sys/block/sdc/queue/rotational
1

這些是我要切換的一台機器的輸出,我再說一遍,這些機器仍然沒有被應用程序使用:

正常執行時間 25 小時:

B) https://pastebin.com/Uqtre6BS

C) https://pastebin.com/3HfWdCTR

D) https://pastebin.com/EazB2XWZ

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 193064
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 193064
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

除了這些資訊之外,我還提供了我的客戶現在使用的從機的輸出

正常執行時間:26 天

MySQL 配置文件:

https://pastebin.com/EztvxgYX

mysqltuning script + SHOW GLOBAL STATUS + SHOW GLOBAL VARIABLES + SHOW FULL PROCESSLIST

https://pastebin.com/5rq8sLF1

磁碟類型:

pvdisplay
--- Physical volume ---
PV Name               /dev/vdb1
VG Name               vg0
PV Size               912.54 GiB / not usable 2.00 MiB
Allocatable           yes
PE Size               4.00 MiB
Total PE              233611
Free PE               5259
Allocated PE          228352
PV UUID               G8aSfO-Ktbg-UcfP-4yoL-jjH9-qjxe-OUN9ni

cat /sys/block/vdb/queue/rotational
1

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 459880
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 459880
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


iostat -xm 5 3
Linux 3.2.0-4-amd64  02/24/20        _x86_64_        (12 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
   6.95    0.00    0.65    1.20    0.01   91.19

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.16    0.09    0.15     0.00     0.00    22.30     0.00    1.02    1.94    0.46   0.46   0.01
vdb               5.84    89.65  156.08  208.73     7.59     3.05    59.71     0.92    2.53    1.93    2.97   0.68  24.89
dm-0              0.00     0.00  161.92  269.31     7.59     3.05    50.51     1.21    2.81    2.52    2.98   0.58  24.96

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
   3.35    0.00    0.54    4.43    0.00   91.69

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.60    4.40    1.40     0.02     0.01     9.10     0.01    1.93    2.55    0.00   0.14   0.08
vdb               3.40    35.60  830.40   51.20    17.90     0.30    42.26     1.16    1.31    1.18    3.53   0.85  75.04
dm-0              0.00     0.00  833.80   74.60    17.90     0.30    41.01     1.54    1.69    1.53    3.47   0.83  75.20

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
   3.40    0.00    0.43    4.64    0.00   91.52

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.40    0.00    0.40     0.00     0.00    16.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               5.80    30.80  810.60   46.80    14.65     0.27    35.63     1.39    1.59    1.61    1.32   1.04  89.36
dm-0              0.00     0.00  816.20   67.20    14.67     0.27    34.63     2.02    2.24    2.34    1.04   1.01  89.36

更新第二次編輯

  • 從伺服器

(顯示全域狀態;+ 顯示全域變數;+ 顯示完整程序列表;)

https://pastebin.com/nTeSuCjZ

  • 舞台伺服器

顯示全域變數;

https://pastebin.com/n369zpdB

(顯示全球狀態;+ 顯示完整的程序列表;)

https://pastebin.com/8rDtkubv

每秒速率 = RPS

為您的 SLAVE my.cnf 考慮的建議

$$ mysqld $$部分

max_connections=750  # from 3072 to conserve RAM - max_used_connections was 507 in 27 days
read_rnd_buffer_size=192K  # from 2M to reduce handler_read_rnd_next RPS 133,629
innodb_io_capacity=900  # from 200 to enable higher IOPS to your HDD
join_buffer_size=16M  # from ~ 32M will still support 2.6M rows to be joined
connect_timeout=20  # from 8 seconds for tolerance and to reduce aborted_connects RPHr 593
table_definition_cache=20000  # from 1400 to reduce opened_table_definitions RPS 104
key_cache_age_threshold=7200  # from 300 (seconds) to reduce key_reads RPS 3
log_queries_not_using_indexes=OFF  # from ON to conserve CPU cycles - since log is OFF.

這僅僅是開始。查看我的個人資料、聯繫資訊的網路個人資料和免費的實用程序腳本以幫助進行性能調整。

觀察結果:48G RAM 不足以承受負載,19% 的查詢需要 10 秒以上才能完成,需要投資獲取需要的索引以避免表掃描,com_analyze 和 com_optimize 均表示 27 中沒有活動天和更多的機會來提高性能。

B)C)D)——一個負載很輕的 8.0 伺服器。

更新 2 - 一個非常忙碌的奴隸。這是一個批評:

觀察:

  • 版本:5.6.26-日誌
  • 48 GB 記憶體
  • 正常執行時間 = 27 天 07:48:48
  • 您沒有在 Windows 上執行。
  • 執行 64 位版本
  • 您似乎完全(或大部分)執行 InnoDB。

更重要的問題:

從 2000 增加到5000。table_open_cache和/或查看您是否有太多桌子。密切關注 Table_open_cache_misses/Uptime 增加table_definition_cache

正在以大致相同的速度插入和刪除很多或行。如果您要“替換”大塊數據,請解釋一下。可能有更好的方法來完成這項任務。也許:http: //mysql.rjweb.org/doc.php/deletebig#optimal_reload_of_a_table

Max_used_connections 相當高(507)。這可能意味著活動的爆發以及一堆緩慢的查詢。你有近乎崩潰的經歷嗎?

你確實有很多慢查詢。有關如何獲得特定幫助的資訊,請參見:http: //mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog

如果您使用的是 SSD 驅動器,那麼 innodb_io_capacity = 1000 可能會有所幫助。

你為什麼每秒使用 SHOW SLAVE STATUS 3.8 次?這可能是系統的負擔。其他各種SHOW異常頻繁執行。

似乎有一些 MyISAM 表。它們可以轉換為 InnoDB 嗎?

Performance_schema…lost – 這些表明表配置得不夠大。它可能表明您沒有使用 P_S。所以,也許它應該被關閉。

完全關閉查詢記憶體——更改query_cache_size為 0。如果您確實想要它,請不要將大小設置為大於 50M。

細節和其他觀察:

( (key_buffer_size - 1.2 * Key_blocks_used * 1024) ) = ((1024M - 1.2 * 6797 * 1024)) / 49152M = 2.1%– key_buffer 中浪費的 RAM 百分比。– 減小 key_buffer_size(現在為 1073741824)。

( Key_blocks_used * 1024 / key_buffer_size ) = 6,797 * 1024 / 1024M = 0.65%– 使用的 key_buffer 的百分比。高水位線。– 降低 key_buffer_size(現在為 1073741824)以避免不必要的記憶體使用。

( Key_reads + Key_writes + Innodb_pages_read + Innodb_pages_written + Innodb_dblwr_writes + Innodb_buffer_pool_pages_flushed ) = (7204545 + 51732 + 265181067 + 156828295 + 12360935 + 156828295) / 2360928 = 253 /sec——眼壓?– 如果硬體可以處理,將 innodb_io_capacity(現在為 200)設置為這個值。

( ( Key_reads + Key_writes + Innodb_pages_read + Innodb_pages_written + Innodb_dblwr_writes + Innodb_buffer_pool_pages_flushed ) / innodb_io_capacity / Uptime ) = ( 7204545 + 51732 + 265181067 + 156828295 + 12360935 + 156828295 ) / 200 / 2360928 = 126.7%– 這可能是一個指標,表明合理設置了 innodb_io_capacity。– 如果硬體可以處理,則增加 innodb_io_capacity(現在為 200)。

( Opened_tables ) = 295,211,003 / 2360928 = 125 /sec– 打開表格的頻率 – 增加 table_open_cache (現在 2000)

( Opened_table_definitions ) = 245,012,524 / 2360928 = 103 /sec– 打開 .frm 文件的頻率 – 增加 table_definition_cache(現在是 1400)和/或 table_open_cache(現在是 2000)。

( Table_open_cache_overflows ) = 295,192,212 / 2360928 = 125 /sec – 可能需要增加table_open_cache(現在是2000)

( Table_open_cache_misses ) = 295,208,827 / 2360928 = 125 /sec – 可能需要增加table_open_cache(現在是2000)

( Table_open_cache_misses / (Table_open_cache_hits + Table_open_cache_misses) ) = 295,208,827 / (1552264289 + 295208827) = 16.0%– table_open_cache 的有效性。– 增加table_open_cache(現在是2000)並檢查table_open_cache_instances(現在是1)。

( innodb_lru_scan_depth ) = 1,024 – “InnoDB: page_cleaner: 1000ms 預期循環佔用了……”可以通過降低 lru_scan_depth 來修復

( innodb_io_capacity_max / innodb_io_capacity ) = 2,000 / 200 = 10– 容量:max/plain – 推薦 2. Max 應該大約等於您的 I/O 子系統可以處理的 IOP。(如果驅動器類型未知,2000/200 可能是合理的一對。)

( (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) ) = ((236228471 + 156828295) ) / 2360928 = 166 /sec– InnoDB I/O – 增加 innodb_buffer_pool_size(現在是 25769803776)?

( Innodb_os_log_written ) = 581,123,630,592 / 2360928 = 246142 /sec– 這是 InnoDB 繁忙程度的指標。– 非常空閒或非常繁忙的 InnoDB。

( innodb_log_buffer_size ) = 128M– 建議 2MB-64MB,至少和事務中最大的 blob 一樣大。– 調整 innodb_log_buffer_size(現在為 134217728)。

( innodb_log_buffer_size / innodb_log_file_size ) = 128M / 256M = 50.0%– 緩衝區在 RAM 中;文件在磁碟上。– buffer_size 應該更小和/或 file_size 應該更大。

( Innodb_log_writes ) = 72,150,946 / 2360928 = 31 /sec

( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 2,360,928 / 60 * 256M / 581123630592 = 18.2– InnoDB 日誌輪換之間的分鐘數從 5.6.8 開始,可以動態更改;請務必同時更改 my.cnf。– (輪換間隔 60 分鐘的建議有些隨意。)調整 innodb_log_file_size(現在為 268435456)。(不能在 AWS 中更改。)

( Innodb_dblwr_writes ) = 12,360,935 / 2360928 = 5.2 /sec– “雙寫緩衝區”寫入磁碟。“雙寫”是一項可靠性功能。一些較新的版本/配置不需要它們。–(其他問題的症狀)

( innodb_flush_neighbors ) = 1– 將塊寫入磁碟時的小優化。– 使用 0 表示 SSD 驅動器;1 用於硬碟。

( innodb_io_capacity ) = 200- 磁碟上每秒的 I/O 操作數。100 用於慢速驅動器;200 用於旋轉驅動器;SSD 1000-2000;乘以 RAID 係數。

( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF– 是否記錄所有死鎖。– 如果你被死鎖困擾,打開它。注意:如果你有很多死鎖,這可能會寫入很多磁碟。

( max_connections ) = 3,072– 最大連接數(執行緒)。影響各種分配。– 如果 max_connections(現在是 3072)太高並且各種記憶體設置很高,您可能會用完 RAM。

( join_buffer_size * Max_used_connections ) = (32M * 507) / 49152M = 33.0%– (用於考慮 join_buffer_size 大小的指標。) – join_buffer_size(現在為 33554432)可能應該縮小以避免記憶體不足。

( character_set_server ) = character_set_server = latin1 – 將 character_set_server(現在是 latin1)設置為 utf8mb4 可以幫助解決字元集問題。那是未來的預設值。

( local_infile ) = local_infile = ON – local_infile (now ON) = ON 是一個潛在的安全問題

( bulk_insert_buffer_size ) = 8 / 49152M = 0.02%– 用於多行插入和載入數據的緩衝區 – 太大可能會威脅 RAM 大小。太小可能會阻礙此類操作。

( Created_tmp_tables ) = 173,730,482 / 2360928 = 74 /sec– 創建“臨時”表作為複雜 SELECT 的一部分的頻率。

( Created_tmp_disk_tables ) = 60,901,114 / 2360928 = 26 /sec– 作為複雜 SELECT 的一部分創建磁碟“臨時”表的頻率 – 增加 tmp_table_size(現在為 201326592)和 max_heap_table_size(現在為 201326592)。檢查何時使用 MEMORY 而不是 MyISAM 的臨時表規則。也許較小的模式或查詢更改可以避免 MyISAM。更好的索引和查詢的重新制定更有可能有所幫助。

( Created_tmp_disk_tables / Questions ) = 60,901,114 / 1167645085 = 5.2%– 需要磁碟 tmp 表的查詢的百分比。– 更好的索引/沒有斑點/等等。

( tmp_table_size ) = 192M– 限制用於支持 SELECT 的MEMORY臨時表的大小 – 減少 tmp_table_size(現在為 201326592)以避免記憶體不足。也許不超過64M。

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (33982982 + 45639342 + 27851942 + 6777983) / 97943382 = 1.17– 每個送出的語句(假設所有 InnoDB) – 低:可能有助於在事務中將查詢分組;高:長期交易使各種事情緊張。

( Select_full_join ) = 9,805,365 / 2360928 = 4.2 /sec– 無索引連接 – 為 JOIN 中使用的表添加合適的索引。

( Select_scan ) = 251,823,622 / 2360928 = 106 /sec– 全表掃描 – 添加索引/優化查詢(除非它們是小表)

( Select_scan / Com_select ) = 251,823,622 / 1037614281 = 24.3%– % 的選擇進行全表掃描。(可能被儲存常式愚弄。)——添加索引/優化查詢

( binlog_error_action ) = binlog_error_action = IGNORE_ERROR– 無法寫入binlog怎麼辦。– IGNORE_ERROR 是向後兼容的預設值,但建議使用 ABORT_SERVER。

( binlog_format ) = binlog_format = MIXED– 聲明/行/混合。– ROW 是 5.7 (10.3) 的首選

( slow_query_log ) = slow_query_log = OFF– 是否記錄慢查詢。(5.1.12)

( long_query_time ) = 10– 用於定義“慢”查詢的截止時間(秒)。– 建議 2

( Slow_queries ) = 224,832,658 / 2360928 = 95 /sec– 頻率(每秒慢查詢) – 返工慢人;改進指標;觀察慢速日誌文件的磁碟空間

( Slow_queries / Questions ) = 224,832,658 / 1167645085 = 19.3%– 頻率(所有查詢的百分比) – 查找慢查詢;檢查索引。

( log_slow_slave_statements ) = log_slow_slave_statements = OFF– (5.6.11, 5.7.1) 預設情況下,複製的語句不會出現在慢日誌中;這導致他們顯示。– 在慢日誌中查看可能干擾從屬讀取的寫入會很有幫助。

( log_queries_not_using_indexes ) = log_queries_not_using_indexes = ON– 是否在慢日誌中包含此類。– 這會使慢日誌變得混亂;把它關掉,這樣你就可以看到真正的慢查詢。並減少 long_query_time(現在為 10)以擷取最有趣的查詢。

( Max_used_connections ) = 507– 連接的高水位線 – 大量不活動的連接是可以的;超過 100 個活動連接可能是個問題。Max_used_connections(現在是 507)不區分它們;Threads_running(現在為 1)是瞬時的。

( Com_change_db ) = 43,570,240 / 2360928 = 18 /sec– 可能來自 USE 語句。– 考慮與 DB 連接,使用 db.tbl 語法,消除虛假的 USE 語句等。

( Connections ) = 52,611,835 / 2360928 = 22 /sec– Connections – 增加wait_timeout(現在是720);使用池化?

你有一半的查詢記憶體。您應該同時設置 query_cache_type = OFF 和 query_cache_size = 0 。(根據傳言)QC 程式碼中有一個“錯誤”,除非您關閉這兩個設置,否則某些程式碼會保持打開狀態。

異常小:

(query_cache_size - Qcache_free_memory) / query_cache_size = 0.01%
1 - Qcache_free_memory / query_cache_size = 0.01%
delayed_insert_timeout = 8

異常大:

Com_begin = 41 /sec
Com_create_view = 0.014 /HR
Com_rename_table = 0.1 /HR
Com_rollback_to_savepoint = 2 /HR
Com_show_binlogs = 11 /HR
Com_show_create_db = 2.2 /HR
Com_show_create_table = 0.2 /sec
Com_show_slave_status = 3.8 /sec
Com_show_table_status = 0.2 /sec
Com_show_triggers = 0.2 /sec
Handler_delete = 220 /sec
Handler_read_first = 99 /sec
Handler_read_key = 60959 /sec
Handler_read_last = 1 /sec
Handler_read_next = 467752 /sec
Handler_read_rnd = 11341 /sec
Handler_savepoint_rollback = 2 /HR
Handler_update = 3004 /sec
Innodb_buffer_pool_pages_misc = 134,346
Innodb_buffer_pool_pages_misc * 16384 / innodb_buffer_pool_size = 8.5%
Innodb_buffer_pool_write_requests = 8241 /sec
Innodb_rows_deleted = 220 /sec
Key_read_requests = 9261 /sec
Key_write_requests = 1843 /sec
Performance_schema_digest_lost = 5.68e+8
Performance_schema_file_instances_lost = 5.05e+8
Performance_schema_table_instances_lost = 8.75e+7
Qcache_free_memory = 192.0MB
Select_full_range_join = 0.62 /sec
Select_full_range_join / Com_select = 0.14%
Sort_range = 61 /sec
Sort_rows = 9214 /sec
Sort_scan = 68 /sec
Threads_cached = 95
max_user_connections = 3,072
net_buffer_length = 262,144
optimizer_trace_offset = --1
performance_schema_max_cond_instances = 15,188
performance_schema_max_file_instances = 31,508
performance_schema_max_socket_instances = 6,164
performance_schema_max_thread_instances = 6,244
thread_concurrency = 12

異常字元串:

Slave_heartbeat_period = 1800
Slave_running = ON
ignore_db_dirs = lost+found
innodb_fast_shutdown = 1
optimizer_trace = enabled=off,one_line=off
optimizer_trace_features = greedy_search=on, range_optimizer=on, dynamic_range=on, repeated_subselect=on
read_only = ON
slave_rows_search_algorithms = TABLE_SCAN,INDEX_SCAN

引用自:https://dba.stackexchange.com/questions/260377