Sử dụng thời gian hệ thống CPU cao trên máy chủ MySQL


9

Một chút lạc hậu, một thời gian trước, chúng tôi đã bắt đầu trải nghiệm thời gian hệ thống CPU cao trên một trong các cơ sở dữ liệu MySQL của chúng tôi. Cơ sở dữ liệu này cũng bị sử dụng đĩa cao, vì vậy chúng tôi đã tìm ra rằng những thứ đó được kết nối. Và vì chúng tôi đã có kế hoạch chuyển nó sang SSD, chúng tôi nghĩ rằng nó sẽ giải quyết cả hai vấn đề.

Nó giúp ... nhưng không lâu đâu.

Trong một vài tuần sau khi đồ thị CPU di chuyển là như thế này: đồ thị tải cpu tốt

Nhưng bây giờ chúng tôi trở lại điều này: đồ thị tải cpu xấu

Điều này xảy ra từ hư không, không có bất kỳ thay đổi rõ ràng nào về tải trọng hoặc logic ứng dụng.

Số liệu thống kê DB:

  • Phiên bản MySQL - 5.7.20
  • HĐH - Debian
  • Kích thước DB - 1,2Tb
  • RAM - 700Gb
  • Lõi CPU - 56
  • Tải Peek - đọc khoảng 5kq / giây, ghi 600q / giây (mặc dù các truy vấn chọn thường khá phức tạp)
  • Chủ đề - 50 chạy, 300 kết nối
  • Nó có khoảng 300 bảng, tất cả InnoDB

Cấu hình MySQL:

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /opt/mysql-data
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

log-error = /opt/mysql-log/error.log

# Replication

server-id = 76

gtid-mode = ON
enforce-gtid-consistency = true

relay-log = /opt/mysql-log/mysql-relay-bin
relay-log-index = /opt/mysql-log/mysql-relay-bin.index
replicate-wild-do-table = dbname.%

log-bin = /opt/mysql-log/mysql-bin.log
expire_logs_days = 7
max_binlog_size = 1024M
binlog-format = ROW
log-bin-trust-function-creators = 1
log_slave_updates = 1

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

# Here goes

skip_name_resolve = 1
general_log = 0
slow_query_log = 1
slow_query_log_file = /opt/mysql-log/slow.log
long_query_time = 3

max_allowed_packet = 16M
max_connections = 700
max_execution_time = 200000

open_files_limit = 32000
table_open_cache = 8000
thread_cache_size = 128
innodb_buffer_pool_size = 550G
innodb_buffer_pool_instances = 28
innodb_log_file_size = 15G
innodb_log_files_in_group = 2
innodb_flush_method = O_DIRECT

max_heap_table_size = 16M
tmp_table_size = 128M
join_buffer_size = 1M
sort_buffer_size = 2M

innodb_lru_scan_depth = 256

query_cache_type = 0
query_cache_size = 0

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:30G 

Những quan sát khác

sự hoàn hảo của quá trình mysql trong khi tải cao điểm:

68,31%    68,31%  mysqld  [kernel.kallsyms]    [k] _raw_spin_lock                                                                                                                                                                                                        
   - _raw_spin_lock                                                                                                                                                                                                                                                          
      + 51,63% 0x7fd118e9dbd9                                                                                                                                                                                                                                                
      + 48,37% 0x7fd118e9dbab                                                                                                                                                                                                                                                
+   37,36%     0,02%  mysqld  libc-2.19.so         [.] 0x00000000000f4bd9                                                                                                                                                                                                    
+   33,83%     0,01%  mysqld  libc-2.19.so         [.] 0x00000000000f4bab                                                                                                                                                                                                    
+   26,92%     0,00%  mysqld  libpthread-2.19.so   [.] start_thread                                                                                                                                                                                                          
+   26,82%     0,00%  mysqld  mysqld               [.] pfs_spawn_thread                                                                                                                                                                                                      
+   26,82%     0,00%  mysqld  mysqld               [.] handle_connection                                                                                                                                                                                                     
+   26,81%     0,01%  mysqld  mysqld               [.] do_command(THD*)                                                                                                                                                                                                      
+   26,65%     0,02%  mysqld  mysqld               [.] dispatch_command(THD*, COM_DATA const*, enum_server_command)                                                                                                                                                          
+   26,29%     0,01%  mysqld  mysqld               [.] mysql_parse(THD*, Parser_state*)                                                                                                                                                                                      
+   24,85%     0,01%  mysqld  mysqld               [.] mysql_execute_command(THD*, bool)                                                                                                                                                                                     
+   23,61%     0,00%  mysqld  mysqld               [.] handle_query(THD*, LEX*, Query_result*, unsigned long long, unsigned long long)                                                                                                                                       
+   23,54%     0,00%  mysqld  mysqld               [.] 0x0000000000374103                                                                                                                                                                                                    
+   19,78%     0,00%  mysqld  mysqld               [.] JOIN::exec()                                                                                                                                                                                                          
+   19,13%     0,15%  mysqld  mysqld               [.] sub_select(JOIN*, QEP_TAB*, bool)                                                                                                                                                                                     
+   13,86%     1,48%  mysqld  mysqld               [.] row_search_mvcc(unsigned char*, page_cur_mode_t, row_prebuilt_t*, unsigned long, unsigned long)                                                                                                                       
+    8,48%     0,25%  mysqld  mysqld               [.] ha_innobase::general_fetch(unsigned char*, unsigned int, unsigned int)                                                                                                                                                
+    7,93%     0,00%  mysqld  [unknown]            [.] 0x00007f40c4d7a6f8                                                                                                                                                                                                    
+    7,57%     0,00%  mysqld  mysqld               [.] 0x0000000000828f74                                                                                                                                                                                                    
+    7,25%     0,11%  mysqld  mysqld               [.] handler::ha_index_next_same(unsigned char*, unsigned char const*, unsigned int)                                                                                                                                       

Nó cho thấy mysql đang dành rất nhiều thời gian cho spin_locks . Tôi đã hy vọng có được manh mối về việc những chiếc khóa đó đến từ đâu, thật đáng buồn, không có may mắn.

Hồ sơ truy vấn trong khi tải cao cho thấy số lượng lớn các chuyển đổi ngữ cảnh. Tôi đã sử dụng select * từ MyTable trong đó pk = 123 , MyTable có khoảng 90M hàng. Hồ sơ đầu ra:

Status               Duration CPU_user CPU_system Context_voluntary Context_involuntary Block_ops_in Block_ops_out Messages_sent Messages_received Page_faults_major Page_faults_minor Swaps Source_function       Source_file          Source_line
starting             0,000756 0,028000 0,012000   81                1                   0            0             0             0                 0                 0                 0                             
checking permissions 0,000057 0,004000 0,000000   4                 0                   0            0             0             0                 0                 0                 0     check_access          sql_authorization.cc 810
Opening tables       0,000285 0,008000 0,004000   31                0                   0            40            0             0                 0                 0                 0     open_tables           sql_base.cc          5650
init                 0,000304 0,012000 0,004000   31                1                   0            0             0             0                 0                 0                 0     handle_query          sql_select.cc        121
System lock          0,000303 0,012000 0,004000   33                0                   0            0             0             0                 0                 0                 0     mysql_lock_tables     lock.cc              323
optimizing           0,000196 0,008000 0,004000   20                0                   0            0             0             0                 0                 0                 0     optimize              sql_optimizer.cc     151
statistics           0,000885 0,036000 0,012000   99                6                   0            0             0             0                 0                 0                 0     optimize              sql_optimizer.cc     367
preparing            0,000794 0,000000 0,096000   76                2                   32           8             0             0                 0                 0                 0     optimize              sql_optimizer.cc     475
executing            0,000067 0,000000 0,000000   10                1                   0            0             0             0                 0                 0                 0     exec                  sql_executor.cc      119
Sending data         0,000469 0,000000 0,000000   54                1                   32           0             0             0                 0                 0                 0     exec                  sql_executor.cc      195
end                  0,000609 0,000000 0,016000   64                4                   0            0             0             0                 0                 0                 0     handle_query          sql_select.cc        199
query end            0,000063 0,000000 0,000000   3                 1                   0            0             0             0                 0                 0                 0     mysql_execute_command sql_parse.cc         4968
closing tables       0,000156 0,000000 0,000000   20                4                   0            0             0             0                 0                 0                 0     mysql_execute_command sql_parse.cc         5020
freeing items        0,000071 0,000000 0,004000   7                 1                   0            0             0             0                 0                 0                 0     mysql_parse           sql_parse.cc         5596
cleaning up          0,000533 0,024000 0,008000   62                0                   0            0             0             0                 0                 0                 0     dispatch_command      sql_parse.cc         1902

Peter Zaitsev đã thực hiện một bài đăng gần đây về chuyển đổi bối cảnh, nơi ông nói:

Tuy nhiên, trong thế giới thực, tôi sẽ không lo lắng về việc tranh chấp là một vấn đề lớn nếu bạn có ít hơn mười chuyển đổi ngữ cảnh cho mỗi truy vấn.

Nhưng nó cho thấy hơn 600 thiết bị chuyển mạch!

Điều gì có thể gây ra những triệu chứng này và những gì có thể được thực hiện về nó? Tôi sẽ đánh giá cao bất kỳ con trỏ hoặc thông tin nào về vấn đề này, mọi thứ tôi gặp phải cho đến nay đều khá cũ và / hoặc không có kết luận.

PS tôi sẽ sẵn sàng cung cấp thêm thông tin, nếu cần.

Đầu ra của SHOW GLOBAL STATUS và SHOW VARIABLES

Tôi không thể đăng nó ở đây vì nội dung vượt quá giới hạn kích thước bài viết.

HIỂN THỊ TÌNH TRẠNG TOÀN CẦU
HIỂN THỊ BIỂU TƯỢNG

i điều hòa

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7,35    0,00    5,44    0,20    0,00   87,01

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0,00     0,00    0,00    0,00     0,00     0,00     8,00     0,00   32,00   32,00    0,00  32,00   0,00
sda               0,04     2,27    0,13    0,96     0,86    46,52    87,05     0,00    2,52    0,41    2,80   0,28   0,03
sdb               0,21   232,57   30,86  482,91   503,42  7769,88    32,21     0,34    0,67    0,83    0,66   0,34  17,50

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9,98    0,00   77,52    0,46    0,00   12,04

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
sda               0,00     1,60    0,00    0,60     0,00     8,80    29,33     0,00    0,00    0,00    0,00   0,00   0,00
sdb               0,00   566,40   55,60  981,60   889,60 16173,60    32,90     0,84    0,81    0,76    0,81   0,51  53,28

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          11,83    0,00   72,72    0,35    0,00   15,10

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
sda               0,00     2,60    0,00    0,40     0,00    12,00    60,00     0,00    0,00    0,00    0,00   0,00   0,00
sdb               0,00   565,20   51,60  962,80   825,60 15569,60    32,32     0,85    0,84    0,98    0,83   0,54  54,56

Cập nhật 2018-03-15

> show global status like 'uptime%'
Uptime;720899
Uptime_since_flush_status;720899

> show global status like '%rollback'
Com_rollback;351422
Com_xa_rollback;0
Handler_rollback;371088
Handler_savepoint_rollback;0

Trung bình mất bao lâu (thời gian trôi qua) select * from MyTable where pk = 123?
Rick James

1
@RickJames Trung bình mất khoảng 5ms.
chimmi

1
@WilsonHauck Các bài kiểm tra cho thấy khoảng 30k viết IOps. Đối với các trang bẩn, số tiền 9% mà chúng tôi có, dường như không phải là vấn đề đối với tôi. Chúng tôi phát hiện ra rằng sau khi khởi động lại, việc sử dụng CPU vẫn bình thường trong khoảng một tuần, vì vậy kế hoạch là chờ lần khởi động lại tiếp theo và theo dõi global statusxem có gì liên quan đến việc tăng mức sử dụng CPU không. Tôi không tin bất cứ điều gì có thể đạt được với dữ liệu có sẵn tại thời điểm này. Tôi sẽ hỏi một câu hỏi khác nếu tôi tìm thấy bất cứ điều gì mới.
chimmi

1
@WilsonHauck Chúng tôi đã khởi động lại và nó đã diễn ra như trước: thời gian hệ thống bắt đầu phát triển. Vẫn đang tìm kiếm nguồn gốc của vấn đề.
chimmi

1
@WilsonHauck Câu hỏi cập nhật.
chimmi

Câu trả lời:


6

600q / s ghi với một lần xả mỗi lần xác nhận có thể đạt đến giới hạn của các đĩa quay hiện tại của bạn. Chuyển sang SSD sẽ giảm bớt áp lực.

Cách khắc phục nhanh (trước khi nhận SSD) có thể thay đổi thành cài đặt này:

innodb_flush_log_at_trx_commit = 2

Nhưng hãy đọc những cảnh báo về việc thay đổi.

Có cài đặt đó SSD sẽ cho phép bạn phát triển hơn nữa.

Một cách khắc phục khác có thể là kết hợp một số ghi thành một COMMIT(trong đó logic không bị vi phạm).

Hầu như luôn luôn, CPU và / hoặc I / O cao là do chỉ mục kém và / hoặc công thức truy vấn kém. Bật Slowlog với long_query_time=1, đợi một lúc, sau đó xem những gì bật lên. Với các truy vấn trong tay, cung cấp SELECT, EXPLAIN SELECT ...SHOW CREATE TABLE. Ditto cho các truy vấn viết. Từ những thứ đó, có lẽ chúng ta có thể chế ngự CPU và / hoặc I / O. Ngay cả với cài đặt hiện tại của bạn là 3,pt-query-digest có thể tìm thấy một số điều thú vị.

Lưu ý rằng với 50 chủ đề "đang chạy", có rất nhiều sự tranh chấp; điều này có thể gây ra sự chuyển đổi, vv, mà bạn lưu ý. Chúng ta cần nhận được các truy vấn để hoàn thành nhanh hơn. Với 5.7, hệ thống có thể hoạt động với 100 luồng đang chạy . Tăng lên khoảng 64, các công tắc bối cảnh, mutexes, khóa, v.v., âm mưu làm chậm mọi luồng, dẫn đến không cải thiện thông lượng trong khi độ trễ đi qua mái nhà.

Đối với một cách tiếp cận khác nhau để phân tích vấn đề, xin vui lòng cung cấp SHOW VARIABLESSHOW GLOBAL STATUS? Thảo luận thêm ở đây .

Phân tích VARIABLES & TÌNH TRẠNG

(Xin lỗi, không có gì nhảy ra khi giải quyết Câu hỏi của bạn.)

Quan sát:

  • Phiên bản: 5.7.20-log
  • 700 GB RAM
  • Thời gian hoạt động = 36d 13:21:34
  • Bạn không chạy trên Windows.
  • Chạy phiên bản 64 bit
  • Bạn dường như đang chạy hoàn toàn (hoặc chủ yếu) InnoDB.

Các vấn đề quan trọng hơn:

Rất nhiều bảng tạm thời, đặc biệt là dựa trên đĩa, được tạo cho các truy vấn phức tạp. Chúng ta hãy hy vọng rằng nhật ký chậm sẽ xác định một số truy vấn có thể được cải thiện (thông qua lập chỉ mục / cải cách / v.v.) Các chỉ số khác được tham gia mà không có chỉ mục và sort_merge_passes; tuy nhiên, cả hai điều này đều không có kết luận, chúng ta cần xem các truy vấn.

Max_used_connections = 701là> = Max_connections = 700, vì vậy có thể có một số kết nối bị từ chối. Ngoài ra, nếu điều đó chỉ ra nhiều hơn, giả sử, 64 luồng đang chạy , thì hiệu năng hệ thống có thể bị ảnh hưởng tại thời điểm đó. Xem xét điều chỉnh số lượng kết nối bằng cách điều chỉnh các máy khách. Bạn đang sử dụng Apache, Tomcat, hay cái gì khác? 70 Threads_runningchỉ ra rằng, tại thời điểm thực hiện việc này SHOW, hệ thống đã gặp sự cố.

Tăng số lượng báo cáo trong mỗi COMMIT(khi hợp lý) có thể giúp thực hiện một số.

innodb_log_file_size, ở mức 15 GB, lớn hơn mức cần thiết, nhưng tôi thấy không cần thay đổi.

Hàng ngàn bảng thường không phải là một thiết kế tốt.

eq_range_index_dive_limit = 200quan tâm đến tôi, nhưng tôi không biết làm thế nào để tư vấn. Đó có phải là một sự lựa chọn có chủ ý?

Tại sao rất nhiều THỦ TỤC TẠO + DROP?

Tại sao nhiều lệnh SHOW?

Chi tiết và các quan sát khác:

( Innodb_buffer_pool_pages_flushed ) = 523,716,598 / 3158494 = 165 /sec - Writes (tuôn ra) - kiểm tra innodb_buffer_pool_size

( table_open_cache ) = 10,000 - Số lượng mô tả bảng vào bộ đệm - Vài trăm thường là tốt.

( (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) ) = ((61,040,718 + 523,716,598) ) / 3158494 = 185 /sec - I / O của InnoDB

( Innodb_dblwr_pages_written/Innodb_pages_written ) = 459,782,684/523,717,889 = 87.8% - Có vẻ như những giá trị này nên bằng nhau?

( Innodb_os_log_written ) = 1,071,443,919,360 / 3158494 = 339226 /sec- Đây là một chỉ số về mức độ bận rộn của InnoDB. - InnoDB rất bận rộn.

( Innodb_log_writes ) = 110,905,716 / 3158494 = 35 /sec

( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 1,071,443,919,360 / (3158494 / 3600) / 2 / 15360M = 0.0379 - Tỷ lệ - (xem phút)

( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 3,158,494 / 60 * 15360M / 1071443919360 = 791- Phút giữa các lần quay nhật ký InnoDB Bắt đầu với 5.6.8, điều này có thể được thay đổi linh hoạt; hãy chắc chắn cũng thay đổi my.cnf. - (Đề xuất 60 phút giữa các lần quay có phần tùy ý.) Điều chỉnh innodb_log_file_size. (Không thể thay đổi trong AWS.)

( Com_rollback ) = 770,457 / 3158494 = 0.24 /sec- ROLLBACK trong InnoDB. - Tần suất quay vòng quá mức có thể cho thấy logic ứng dụng không hiệu quả.

( Innodb_row_lock_waits ) = 632,292 / 3158494 = 0.2 /sec- Mức độ thường xuyên có một sự chậm trễ trong việc có được một khóa hàng. - Có thể được gây ra bởi các truy vấn phức tạp có thể được tối ưu hóa.

( Innodb_dblwr_writes ) = 97,725,876 / 3158494 = 31 /sec- "Doublewrite buffer" ghi vào đĩa. "Doublewrites" là một tính năng đáng tin cậy. Một số phiên bản / cấu hình mới hơn không cần chúng. - (Triệu chứng của các vấn đề khác)

( Innodb_row_lock_current_waits ) = 13- Số lượng khóa hàng hiện đang được chờ đợi bởi các thao tác trên bảng InnoDB. Zero là khá bình thường. - Một cái gì đó lớn đang xảy ra?

( innodb_print_all_deadlocks ) = OFF- Có đăng nhập tất cả các Deadlocks. - Nếu bạn đang loay hoay với Deadlocks, hãy bật cái này lên. Thận trọng: Nếu bạn có nhiều bế tắc, điều này có thể ghi rất nhiều vào đĩa.

( local_infile ) = ON - local_infile = ON là một vấn đề bảo mật tiềm năng

( bulk_insert_buffer_size / _ram ) = 8M / 716800M = 0.00%- Bộ đệm cho INSERT nhiều hàng và LOAD DATA - Quá lớn có thể đe dọa kích thước RAM. Quá nhỏ có thể cản trở các hoạt động như vậy.

( Questions ) = 9,658,430,713 / 3158494 = 3057 /sec- Truy vấn (bên ngoài SP) - "qps" -> 2000 có thể gây căng thẳng cho máy chủ

( Queries ) = 9,678,805,194 / 3158494 = 3064 /sec- Truy vấn (bao gồm cả SP bên trong) -> 3000 có thể gây căng thẳng cho máy chủ

( Created_tmp_tables ) = 1,107,271,497 / 3158494 = 350 /sec - Tần suất tạo các bảng "tạm thời" như là một phần của các CHỌN phức tạp.

( Created_tmp_disk_tables ) = 297,023,373 / 3158494 = 94 /sec- Tần suất tạo bảng "temp" đĩa như một phần của các CHỌN phức tạp - tăng tmp_table_size và max_heap_table_size. Kiểm tra các quy tắc cho các bảng tạm thời khi MEMOR được sử dụng thay vì MyISAM. Có lẽ lược đồ nhỏ hoặc thay đổi truy vấn có thể tránh MyISAM. Các chỉ mục tốt hơn và cải cách các truy vấn có nhiều khả năng giúp đỡ.

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (693300264 + 214511608 + 37537668 + 0) / 1672382928 = 0.565- Báo cáo trên mỗi Cam kết (giả sử tất cả InnoDB) - Thấp: Có thể giúp nhóm các truy vấn cùng nhau trong các giao dịch; Cao: giao dịch dài căng thẳng nhiều thứ.

( Select_full_join ) = 338,957,314 / 3158494 = 107 /sec - tham gia không có chỉ mục - Thêm (các) chỉ mục phù hợp vào các bảng được sử dụng trong THAM GIA.

( Select_full_join / Com_select ) = 338,957,314 / 6763083714 = 5.0% -% số lượt chọn tham gia không có chỉ mục - Thêm (các) chỉ mục phù hợp vào các bảng được sử dụng trong THAM GIA.

( Select_scan ) = 124,606,973 / 3158494 = 39 /sec - quét toàn bộ bảng - Thêm chỉ mục / tối ưu hóa truy vấn (trừ khi chúng là các bảng nhỏ)

( Sort_merge_passes ) = 1,136,548 / 3158494 = 0.36 /sec - Sắp xếp nặng nề - Tăng sort_buffer_size và / hoặc tối ưu hóa các truy vấn phức tạp.

( Com_insert + Com_delete + Com_delete_multi + Com_replace + Com_update + Com_update_multi ) = (693300264 + 37537668 + 198418338 + 0 + 214511608 + 79274476) / 3158494 = 387 /sec - write / sec - 50 write / sec + log tuôn ra có thể sẽ tối đa hóa khả năng ghi I / O của các ổ đĩa thông thường

( ( Com_stmt_prepare - Com_stmt_close ) / ( Com_stmt_prepare + Com_stmt_close ) ) = ( 39 - 38 ) / ( 39 + 38 ) = 1.3%- Bạn đang đóng báo cáo chuẩn bị của bạn? - Thêm Đóng.

( Com_stmt_close / Com_stmt_prepare ) = 38 / 39 = 97.4%- Báo cáo đã chuẩn bị nên được đóng lại. - Kiểm tra xem tất cả các báo cáo Chuẩn bị có "Đóng" không.

( innodb_autoinc_lock_mode ) = 1- Galera: mong muốn 2 - 2 = "xen kẽ"; 1 = "liên tiếp" là điển hình; 0 = "truyền thống".

( Max_used_connections / max_connections ) = 701 / 700 = 100.1% -% cao nhất của kết nối - tăng max_connections và / hoặc giảm Wait_timeout

( Threads_running - 1 ) = 71 - 1 = 70 - Chủ đề hoạt động (đồng thời khi thu thập dữ liệu) - Tối ưu hóa truy vấn và / hoặc lược đồ

Lớn bất thường: (Hầu hết trong số này bắt nguồn từ một hệ thống rất bận rộn.)

Com_commit = 529 /sec
Com_create_procedure = 0.01 /HR
Com_drop_procedure = 0.01 /HR
Com_delete = 12 /sec
Com_delete_multi = 63 /sec
Com_insert = 219 /sec
Com_kill = 0.69 /HR
Com_reset = 0.0011 /HR
Com_revoke = 0.0023 /HR
Com_select = 2141 /sec
Com_show_binlogs = 12 /HR
Com_show_create_func = 0.011 /HR
Com_show_privileges = 0.0034 /HR
Com_show_profile = 0.027 /HR
Com_show_profiles = 0.028 /HR
Com_show_slave_status = 0.037 /sec
Com_show_storage_engines = 12 /HR
Com_show_warnings = 0.14 /sec
Com_slave_stop = 0.0011 /HR
Com_update_multi = 25 /sec
Created_tmp_files = 0.3 /sec
Handler_commit = 3251 /sec
Handler_external_lock = 18787 /sec
Handler_prepare = 615 /sec
Handler_read_first = 239 /sec
Handler_read_key = 173669 /sec
Handler_read_next = 1291439 /sec
Handler_read_prev = 28535 /sec
Handler_read_rnd = 32789 /sec

(còn tiếp)

Innodb_buffer_pool_bytes_dirty = 7.03e+10
Innodb_buffer_pool_pages_data = 3.41e+7
Innodb_buffer_pool_pages_dirty = 4.29e+6
Innodb_buffer_pool_pages_misc = 2.15e+6
Innodb_buffer_pool_pages_total = 3.62e+7
Innodb_data_fsyncs = 132 /sec
Innodb_data_writes = 232 /sec
Innodb_data_written = 5440151 /sec
Innodb_dblwr_pages_written = 145 /sec
Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group = 582.3MB
Innodb_pages_written = 165 /sec
Innodb_row_lock_time = 5.97e+7
Innodb_rows_deleted + Innodb_rows_inserted = 2180 /sec
Innodb_rows_inserted = 2155 /sec
Innodb_rows_read = 1398531 /sec
Max_used_connections = 701
Open_tables = 10,000
Select_full_range_join = 2.57e+7
Select_range = 130 /sec
Sort_range = 30 /sec
Sort_scan = 332 /sec
Table_open_cache_hits = 9354 /sec
Threads_running = 71
eq_range_index_dive_limit = 200
innodb_purge_threads = 4
innodb_thread_sleep_delay = 16,925

1
Vâng, cảm ơn bạn, tôi đánh giá cao công việc của bạn. Thật không may, tôi không thấy bất cứ điều gì có thể giải thích sự thay đổi đột ngột của chúng tôi trong việc sử dụng CPU (về cơ bản xảy ra qua đêm mà không có thay đổi rõ ràng về kích thước hoặc tải hoặc ứng dụng DB). innodb_flush_log_at_trx_commit = 2dường như không có bất kỳ ảnh hưởng nào và sự tranh chấp luồng cũng dường như không phải là vấn đề bởi vì ngay cả ở mức tải vừa phải (Chủ đề runnig <50) CPU sys / CPU người dùng cũng giống như 3 đến 1.
chimmi

4

Chúng tôi không bao giờ tìm ra nguyên nhân chính xác của vấn đề này là gì, nhưng để đưa ra một số đóng cửa tôi sẽ nói những gì tôi có thể.

Nhóm của chúng tôi đã thực hiện một số thử nghiệm tải và kết luận rằng MySQLcó vấn đề trong việc phân bổ bộ nhớ. Vì vậy, họ đã cố gắng sử dụng jemallocthay vì glibcvà vấn đề biến mất. Chúng tôi đã sử dụng jemalloctrong sản xuất hơn 6 tháng nay mà không gặp lại vấn đề này.

Tôi không nói rằng jemalloctốt hơn, hoặc mọi người nên sử dụng nó với MySQL. Nhưng có vẻ như đối với trường hợp cụ thể của chúng tôi glibckhông hoạt động đúng.


2

2cents của tôi.

Chạy "iostat -xk 5" để thử xem đĩa có còn vấn đề không. Ngoài ra hệ thống CPU có liên quan đến mã hệ thống (kernell), kiểm tra kỹ đĩa / trình điều khiển / cấu hình mới.


1
iostat không hiển thị bất kỳ số lượng lớn.
chimmi

yup tôi có thể thấy iuler ở trên nhưng các số được dịch chuyển không khớp với biểu đồ. Bạn đã chạy i bổ sung cùng một khung thời gian?
andres

1
Dù ít hay nhiều, chúng tôi đã thực hiện một số thay đổi đối với ứng dụng để giảm số lượng truy vấn đạt DB này, do đó CPU không còn tồn tại 100% nữa. Tôi đã đính kèm một đầu ra i bổ sung khác, hiện tại CPU trung bình ở mức 75%, hệ thống 60%.
chimmi

0

Gợi ý cho phần my.cnf / ini [mysqld] cho RẤT RẤT NHIỀU

max_heap_table_size=128M  # from 16M to match tmp_table_size
innodb_lru_scan_depth=100  # from 256 to reduce depth every second
innodb_change_buffer_max_size=15  # from 25 max used misc is 6%
innodb_flush_neighbors=0  # from 1 with SSD there is no rotational delay
innodb_read_ahead_threshold=8  # from 56 to expedite RD nxt extent
read_rnd_buffer_size=128K  # from 256K to reduce RD RPS

Kỳ vọng của tôi là giảm dần kết quả của SHOW GLOBAL STATUS THÍCH 'innodb_buffer_pool_pages_denty'; với những gợi ý được áp dụng. Vào ngày 13/1/18 bạn đã có hơn 4 triệu trang bẩn.

Tôi hy vọng những sự giúp đỡ này. Đây có thể được sửa đổi động. Nhiều cơ hội hơn tồn tại, nếu bạn muốn chúng, hãy cho tôi biết.


Cảm ơn đề xuất của bạn, nhưng vấn đề này đã được giải quyết từ lâu. Xem câu trả lời của tôi để biết chi tiết.
chimmi

0

Với IOPS ở mức 30K được thử nghiệm (chúng tôi cần một số IOPS cho các Bài viết ngẫu nhiên), hãy xem xét Đề xuất này cho phần my.cnf / ini [mysqld]

innodb_io_capacity_max=20000  # from 2000 and keep top 10000 free for now
innodb_io_capacity=10000  # from 200 to ensure we stay away from the limits

có thể được thay đổi động với SET GLOBAL và sẽ giảm innodb_buffer_pool_pages_denty nhanh chóng.

Nguyên nhân của COM_ROLLBACK trung bình 1 cứ sau 4 giây sẽ vẫn là một vấn đề về hiệu suất cho đến khi được giải quyết.

@chimmi Ngày 9 tháng 4 năm 2018 Nhặt tập lệnh MySQL này từ https://pastebin.com/aZAu2zZ0 để kiểm tra nhanh các tài nguyên Trạng thái Toàn cầu được sử dụng hoặc phát hành trong nn giây bạn có thể đặt trong SLEEP. Điều này sẽ cho phép bạn xem có ai đã giúp giảm tần suất COM_ROLLBACK của bạn không. Muốn nghe từ bạn qua email.


@chimmi Vui lòng bắt đầu một Câu hỏi mới với yêu cầu thông tin bổ sung, vui lòng. Đăng trên pastebin.com hoặc ở đây. hoàn thành (chưa chỉnh sửa) my.cnf-ini Kết quả văn bản của: A) SHOW GLOBAL STATUS; B) HIỂN THỊ BIỂU TƯỢNG TOÀN CẦU; C) hoàn thành báo cáo MySQLTuner.com nếu có sẵn - 7 ngày trở lên là hữu ích D) SHOW Engine INNODB STATUS; Thông tin rất hữu ích tùy chọn, nếu có bao gồm - htop HOẶC hàng đầu cho hầu hết các ứng dụng đang hoạt động, ulimit -a cho danh sách giới hạn, df -h cho danh sách không gian trống của thiết bị, miễn phí -m cho bộ nhớ miễn phí linux / unix cho máy chủ hiện tại phân tích.
Wilson Hauck

@chimmi Ngoài ra, vui lòng đăng cat / Proc / meminfo để biết số lần chuyển đổi ngữ cảnh. Hãy cho tôi biết liên kết cho câu hỏi mới, xin vui lòng. Cảm ơn
Wilson Hauck

0

TÌNH TRẠNG TOÀN CẦU SHOW của bạn biểu thị innodb_buffer_pool_pages_denty là 4.291.574.

Để theo dõi số lượng hiện tại,

SHOW GLOBAL STATUS LIKE '%pages_dirty';

Để khuyến khích giảm số lượng này,

SET GLOBAL innodb_flushing_avg_loops=5;

Trong một giờ chạy yêu cầu màn hình để xem nơi bạn đứng với các trang bẩn.

Xin vui lòng cho tôi biết số lượng của bạn lúc đầu và một giờ sau.

Áp dụng thay đổi cho my.cnf của bạn để giảm thiểu tình trạng bẩn trang lâu dài hơn.


@chimmi Cảm ơn bạn đã chia sẻ độ phân giải chính của jemalloc. Quá trình giám sát này cho Pages_denty có thể hữu ích cho môi trường sản xuất của bạn. Hãy thử và chia sẻ số của bạn với tôi. Cảm ơn
Wilson Hauck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.