I/O प्रदर्शन MySQL डेटाबेस के लिए महत्वपूर्ण है। डेटा को कई जगहों पर डिस्क पर पढ़ा और लिखा जाता है। लॉग, टेबलस्पेस, बाइनरी और रिले लॉग फिर से करें। सॉलिड स्टेट ड्राइव के उपयोग में वृद्धि के साथ I/O प्रदर्शन में काफी वृद्धि हुई है जिससे उपयोगकर्ता अपने डेटाबेस को और भी तेज़ी से आगे बढ़ा सकते हैं लेकिन फिर भी I/O पूरे डेटाबेस के प्रदर्शन का एक बाधा और सीमित कारक बन सकता है। इस ब्लॉग पोस्ट में हम उन चीजों पर एक नज़र डालेंगे जिन्हें आप जांचना चाहते हैं कि क्या आप देखते हैं कि आपका I/O प्रदर्शन आपके MySQL इंस्टेंस पर उच्च है।
“उच्च” I/O उपयोग का क्या अर्थ है? संक्षेप में, यदि आपके डेटाबेस का प्रदर्शन इससे प्रभावित होता है, तो यह उच्च है। आम तौर पर आप इसे डेटाबेस में धीमा लिखते समय देखेंगे। यह आपके सिस्टम पर उच्च I/O प्रतीक्षा के रूप में भी स्पष्ट रूप से प्रकट होगा। कृपया ध्यान रखें, हालांकि, 32 और अधिक CPU कोर वाले होस्ट पर, भले ही एक कोर 100% I/O प्रतीक्षा दिखाएगा, हो सकता है कि आप इसे समग्र दृश्य पर न देखें - यह पूरे लोड के केवल 1/32 का प्रतिनिधित्व करेगा . ऐसा लगता है कि असर नहीं कर रहा है, लेकिन वास्तव में कुछ सिंगल-थ्रेडेड I/O ऑपरेशन आपके CPU को संतृप्त कर रहे हैं और कुछ एप्लिकेशन उस I/O गतिविधि के समाप्त होने की प्रतीक्षा कर रहे हैं।
मान लें कि हमने I/O गतिविधि में वृद्धि देखी है, बस जैसा कि ऊपर स्क्रीनशॉट में है। यदि आपने उच्च I/O गतिविधि देखी है तो क्या देखें? सबसे पहले, सिस्टम में प्रक्रियाओं की सूची देखें। I/O प्रतीक्षा के लिए कौन जिम्मेदार है? आप इसे जांचने के लिए iotop का उपयोग कर सकते हैं:
हमारे मामले में यह बिल्कुल स्पष्ट है कि यह MySQL है जो इसके लिए जिम्मेदार है बहुत हद तक। हमें सबसे सरल जांच से शुरू करना चाहिए - अभी MySQL में वास्तव में क्या चल रहा है?
हम देख सकते हैं कि हमारे दास पर प्रतिकृति गतिविधि है। गुरु को क्या हो रहा है?
हम स्पष्ट रूप से देख सकते हैं कि कुछ बैच लोड कार्य चल रहा है। इस तरह से हमारी यात्रा यहीं समाप्त होती है क्योंकि हम समस्या को आसानी से ठीक करने में कामयाब रहे।
हालांकि, ऐसे और भी मामले हैं, जिन्हें समझना और ट्रैक करना इतना आसान नहीं हो सकता है। MySQL कुछ इंस्ट्रूमेंटेशन के साथ आता है, जिसका उद्देश्य सिस्टम में I/O गतिविधि को समझने में मदद करना है। जैसा कि हमने उल्लेख किया है, सिस्टम में कई स्थानों पर I/O उत्पन्न किया जा सकता है। राइट्स सबसे स्पष्ट हैं लेकिन हमारे पास ऑन-डिस्क अस्थायी टेबल भी हो सकते हैं - यह देखना अच्छा है कि आपके प्रश्न ऐसी तालिकाओं का उपयोग करते हैं या नहीं।
यदि आपके पास performance_schema सक्षम है, तो यह जांचने का एक तरीका है कि कौन सी फ़ाइलें I/O लोड के लिए ज़िम्मेदार हैं, 'table_io_waits_summary_by_table' को क्वेरी करना हो सकता है:
*************************** 13. row ***************************
FILE_NAME: /tmp/MYfd=68
EVENT_NAME: wait/io/file/sql/io_cache
OBJECT_INSTANCE_BEGIN: 140332382801216
COUNT_STAR: 17208
SUM_TIMER_WAIT: 23332563327000
MIN_TIMER_WAIT: 1596000
AVG_TIMER_WAIT: 1355913500
MAX_TIMER_WAIT: 389600380500
COUNT_READ: 10888
SUM_TIMER_READ: 20108066180000
MIN_TIMER_READ: 2798750
AVG_TIMER_READ: 1846809750
MAX_TIMER_READ: 389600380500
SUM_NUMBER_OF_BYTES_READ: 377372793
COUNT_WRITE: 6318
SUM_TIMER_WRITE: 3224434875000
MIN_TIMER_WRITE: 16699500
AVG_TIMER_WRITE: 510356750
MAX_TIMER_WRITE: 223219960500
SUM_NUMBER_OF_BYTES_WRITE: 414000000
COUNT_MISC: 2
SUM_TIMER_MISC: 62272000
MIN_TIMER_MISC: 1596000
AVG_TIMER_MISC: 31136000
MAX_TIMER_MISC: 60676000
*************************** 14. row ***************************
FILE_NAME: /tmp/Innodb Merge Temp File
EVENT_NAME: wait/io/file/innodb/innodb_temp_file
OBJECT_INSTANCE_BEGIN: 140332382780800
COUNT_STAR: 1128
SUM_TIMER_WAIT: 16465339114500
MIN_TIMER_WAIT: 8490250
AVG_TIMER_WAIT: 14596931750
MAX_TIMER_WAIT: 583930037500
COUNT_READ: 540
SUM_TIMER_READ: 15103082275500
MIN_TIMER_READ: 111663250
AVG_TIMER_READ: 27968670750
MAX_TIMER_READ: 583930037500
SUM_NUMBER_OF_BYTES_READ: 566231040
COUNT_WRITE: 540
SUM_TIMER_WRITE: 1234847420750
MIN_TIMER_WRITE: 286167500
AVG_TIMER_WRITE: 2286754250
MAX_TIMER_WRITE: 223758795000
SUM_NUMBER_OF_BYTES_WRITE: 566231040
COUNT_MISC: 48
SUM_TIMER_MISC: 127409418250
MIN_TIMER_MISC: 8490250
AVG_TIMER_MISC: 2654362750
MAX_TIMER_MISC: 43409881500
जैसा कि आप ऊपर देख सकते हैं, यह अस्थायी तालिकाओं को भी दिखाता है जो उपयोग में हैं।
यह जांचने के लिए कि क्या कोई विशेष क्वेरी अस्थायी तालिका का उपयोग करती है, आप EXPLAIN FOR CONNECTION का उपयोग कर सकते हैं:
mysql> EXPLAIN FOR CONNECTION 3111\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sbtest1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 986400
filtered: 100.00
Extra: Using temporary; Using filesort
1 row in set (0.16 sec)
उपरोक्त उदाहरण में एक अस्थायी तालिका का उपयोग फाइल सॉर्ट के लिए किया जाता है।
डिस्क गतिविधि को पकड़ने का एक और तरीका है, यदि आप पूर्ण धीमी लॉग वर्बोसिटी को सक्षम करने के लिए MySQL के लिए Percona सर्वर का उपयोग करते हैं:
mysql> SET GLOBAL log_slow_verbosity='full';
Query OK, 0 rows affected (0.00 sec)
फिर, धीमे लॉग में, आप इस तरह की प्रविष्टियां देख सकते हैं:
# Time: 2020-01-31T12:05:29.190549Z
# [email protected]: root[root] @ localhost [] Id: 12395
# Schema: Last_errno: 0 Killed: 0
# Query_time: 43.260389 Lock_time: 0.031185 Rows_sent: 1000000 Rows_examined: 2000000 Rows_affected: 0
# Bytes_sent: 197889110 Tmp_tables: 0 Tmp_disk_tables: 0 Tmp_table_sizes: 0
# InnoDB_trx_id: 0
# Full_scan: Yes Full_join: No Tmp_table: No Tmp_table_on_disk: No
# Filesort: Yes Filesort_on_disk: Yes Merge_passes: 141
# InnoDB_IO_r_ops: 9476 InnoDB_IO_r_bytes: 155254784 InnoDB_IO_r_wait: 5.304944
# InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000
# InnoDB_pages_distinct: 8191
SET timestamp=1580472285;
SELECT * FROM sbtest.sbtest1 ORDER BY RAND();
जैसा कि आप देख सकते हैं, आप बता सकते हैं कि डिस्क पर अस्थायी तालिका थी या डिस्क पर डेटा सॉर्ट किया गया था। आप I/O संचालन की संख्या और एक्सेस किए गए डेटा की मात्रा भी देख सकते हैं।
हमें उम्मीद है कि यह ब्लॉग पोस्ट आपको सिस्टम में I/O गतिविधि को समझने में मदद करेगी और आपको इसे बेहतर ढंग से प्रबंधित करने देगी।