इस लेख में हम sysbench पर चर्चा करने जा रहे हैं, जो MySQL बेंचमार्किंग के लिए वास्तविक मानक है। हम sysbench उपयोग मूल बातें पर एक नज़र डालने जा रहे हैं और हम MySQL के बारे में सीखने के लिए sysbench का उपयोग कैसे कर सकते हैं और दूसरा हमारे लिए सबसे महत्वपूर्ण पहलू है। हम व्यावहारिक रूप से sysbench का उपयोग ट्रैफ़िक उत्पन्न करने के लिए एक उपकरण के रूप में करेंगे, जिसके बारे में हम बहुत कुछ जानते हैं क्योंकि sysbench हर सेकंड उत्पन्न ट्रैफ़िक के बारे में कुछ जानकारी रखता है।
SysBench MySQL टेस्ट
Sysbench luaJIT पर आधारित एक बहु-थ्रेडेड बेंचमार्क टूल है, यह MySQL बेंचमार्क के लिए वास्तविक मानक है, इसे डेटाबेस से कनेक्ट करने में सक्षम होना चाहिए।
सिसबेंच इंस्टालेशन
सबसे पहले, हमें sysbench स्थापित करने की आवश्यकता है, मैं दूसरे सर्वर पर sysbench स्थापित कर रहा हूं ताकि हम अपने MySQL सर्वर पर लोड के वास्तविक प्रभाव का परीक्षण कर सकें।
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash yum -y install sysbench
यह सेट है कि sysbench को स्थापित करना बहुत आसान है, sysbench को फ़ायरवॉल स्तर पर MySQL सर्वर के साथ इंटरैक्ट करने की अनुमति देना बेहतर है, क्योंकि यह एक परीक्षण वातावरण है जिसे मैंने किसी भी कठिनाई को रोकने के लिए दोनों होस्ट पर फ़ायरवॉल को अक्षम कर दिया है।
SysBench के लिए तैयार वातावरण:
इस परीक्षण के लिए, मैं sbtest डेटाबेस और उपयोगकर्ता sbtest_user बना रहा हूँ और sbtest_user को sbtest डेटाबेस पर सभी विशेषाधिकार प्रदान करूँगा।
रूट का उपयोग करना;
mysql> create database sbtest mysql> create user sbtest_user identified by 'password'; mysql> grant all on sbtest.* to `sbtest_user`@`%`; mysql> show grants for sbtest_user; +---------------------------------------------------------+ | Grants for [email protected]% | +---------------------------------------------------------+ | GRANT USAGE ON *.* TO `sbtest_user`@`%` | | GRANT ALL PRIVILEGES ON `sbtest`.* TO `sbtest_user`@`%` | +---------------------------------------------------------+
SysBench का उपयोग करके MySQL का प्रदर्शन
बेंचमार्क कॉन्फ़िगरेशन:
सिसबेंच का तैयार चरण डेटा के साथ टेबल बनाता है जिसका उपयोग बेंचमार्क में किया जाएगा। इस उदाहरण में हम तैयार कमांड चला रहे हैं। शुरुआत में MySQL के साथ कुछ पैरामीटर हैं, वे कनेक्शन पैरामीटर होंगे। अन्य पैरामीटर oltp_read_write.lua परीक्षण के पैरामीटर हैं और हम स्वयं परीक्षण निर्दिष्ट कर रहे हैं जो oltp_read_write.lua है और हम तैयार कमांड चला रहे हैं। MySQL से शुरू होने वाला विकल्प MySQL कनेक्शन, कनेक्ट करने के लिए होस्टनाम और पोर्ट, कनेक्ट करने के लिए उपयोगकर्ता नाम और पासवर्ड और कनेक्शन के लिए डिफ़ॉल्ट स्कीमा निर्दिष्ट कर रहा है। टेबल और टेबल_साइज पैरामीटर oltp_read_write.lua टेस्ट के गुण हैं।
इसका मतलब है कि तैयारी चरण उनमें से प्रत्येक में 10,000 नियमों के साथ 16 टेबल बनाएगा। अगला कदम बेंचमार्क चलाना है।
चलाने के लिए आम तौर पर सभी पैरामीटर पारित किए जाते हैं जो तैयार किए गए और कुछ अतिरिक्त पैरामीटर जिन्हें हमने अभी समीक्षा की थी, ये बेंचमार्क के वास्तविक रन के लिए विशिष्ट हैं। “समय” पैरामीटर बेंचमार्क चलाने के लिए समय सीमा निर्दिष्ट करता है, शून्य का अर्थ असीमित समय है, बेंचमार्क तब तक चलेगा जब तक हम नियंत्रण + सी हिट नहीं करते। इस तरह से हम लैब में sysbench का उपयोग करेंगे और इस तरह से लोग आमतौर पर इसका उपयोग सीखने में करते हैं न कि बेंचमार्किंग सेटअप में।
हम केवल उस चीज़ पर ट्रैफ़िक लाना चाहते हैं जिसकी हम जाँच करेंगे और परीक्षा पूरी होने के बाद हम इसे control+c से रोक सकते हैं।
“रिपोर्ट-अंतराल” पैरामीटर निर्दिष्ट करते हैं कि कितनी बार sysbench आँकड़े मुद्रित किए गए थे। आमतौर पर, यह हमारे उदाहरण की तरह 1 पर सेट होता है, जो हर सेकंड के लिए sysbench को लाइन का प्रिंट आउट देता है। बेंचमार्किंग सेटअप में भी इस पैरामीटर का व्यापक रूप से उपयोग किया जाता है क्योंकि कल्पना करें कि अगर हमारे पास एक घंटे का बेंचमार्क है और हमारे पास अंत में केवल कुल आंकड़े हैं, तो यह डेटा के वितरण के बारे में कुछ भी नहीं बताता है जैसे कि समय के साथ सर्वर पर प्रदर्शन कैसा था। . “धागा” विकल्प sysbench में उपयोग करने के लिए क्लाइंट थ्रेड्स या MySQL कनेक्शन की संख्या निर्दिष्ट करता है। क्लाइंट के थ्रेड्स की संख्या का उपयोग किए जा सकने वाले सर्वर थ्रेड्स की संख्या पर भी प्रभाव पड़ेगा। “दर” पैरामीटर वास्तव में बेंचमार्क के कारण लोड को पूरा करने के तरीके के रूप में sysbench लेनदेन की आगमन दर को निर्दिष्ट करता है। यदि लेन-देन आगे बढ़ सकते हैं, तो वे कतारबद्ध हैं, यह फिर से कुछ ऐसा है जो आमतौर पर इस तरह के सेटअप में उपयोग किया जाता है जिसे हम अब सीखने के प्रकार के सेटअप में उपयोग करने जा रहे हैं।
sysbench होस्ट से:
डेटा सेट तैयार करें:
बेंचमार्किंग वर्चुअल मशीन पर, हम अपने बेंचमार्क के लिए डेटाबेस बनाने के लिए sysbench तैयार कमांड चलाने जा रहे हैं।
यहां हम देख सकते हैं कि हम sbtest_user को उपयोगकर्ता नाम के रूप में उपयोग कर रहे हैं, पासवर्ड पासवर्ड है और हम डेटाबेस सर्वर के रूप में 192.168.66.5 DB से कनेक्ट कर रहे हैं।
sysbench \ --db-driver=mysql \ --mysql-user=sbtest_user \ --mysql_password=password \ --mysql-db=sbtest \ --mysql-host=192.168.66.5 \ --mysql-port=3306 \ --tables=16 \ --table-size=10000 \ /usr/share/sysbench/oltp_read_write.lua prepare sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Creating table 'sbtest1'... Inserting 10000 records into 'sbtest1' Creating a secondary index on 'sbtest1'... . . . Creating table 'sbtest16'... Inserting 10000 records into 'sbtest16' Creating a secondary index on 'sbtest16'..
आपके पास यहाँ sbtest डेटाबेस है, आइए डिफ़ॉल्ट स्कीमा को sbtest डेटाबेस में बदलें, जाँचें कि हमारे पास कौन सी तालिकाएँ हैं।
हमने निर्दिष्ट किया कि बेंचमार्क को सोलह टेबल बनाना चाहिए और इसने 16 टेबल बनाए, हम इसे यहां देख सकते हैं
mysql> show tables; +------------------+ | Tables_in_sbtest +------------------+ | sbtest1 | | sbtest2 | . . . | sbtest16 | +------------------+ 16 rows in set (0.01 sec)
आइए एक टेबल से कुछ रिकॉर्ड देखें।
mysql> select * from sbtest1 limit 6;
हम एक बेंचमार्क चलाने जा रहे हैं। इस बेंचमार्क में हर सेकेंड के लिए आउटपुट की एक लाइन होगी क्योंकि हम तालमेल सेट करते हैं अंतराल एक के बराबर होता है और इसमें चार क्लाइंट थ्रेड होते हैं क्योंकि हम थ्रेड्स को चार के बराबर सेट करते हैं।
--events=N limit for total number of events [0] --time=N limit for total execution time in seconds [10]
उपरोक्त दो सेटिंग्स (घटनाएँ और समय) यह नियंत्रित करती हैं कि SysBench को कितने समय तक चलते रहना चाहिए। यह या तो कुछ प्रश्नों को निष्पादित कर सकता है या यह पूर्वनिर्धारित समय तक चलता रह सकता है।
sysbench होस्ट पर:
sysbench \ --db-driver=mysql \ --mysql-user=sbtest_user \ --mysql_password=password \ --mysql-db=sbtest \ --mysql-host=192.168.66.5 \ --mysql-port=3306 \ --tables=16 \ --table-size=10000 \ --threads=4 \ --time=0 \ --events=0 \ --report-interval=1 \ /usr/share/sysbench/oltp_read_write.lua run WARNING: Both event and time limits are disabled, running an endless test sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with the following options: Number of threads: 4 Report intermediate results every 1 second(s) Initializing random number generator from current time Initializing worker threads... Threads started! [ 1s ] thds: 4 tps: 62.79 qps: 1320.63 (r/w/o: 933.91/257.15/129.57) lat (ms,95%): 80.03 err/s: 0.00 reconn/s: 0.00 [ 2s ] thds: 4 tps: 77.01 qps: 1530.26 (r/w/o: 1065.18/312.05/153.03) lat (ms,95%): 61.08 err/s: 0.00 reconn/s: 0.00 [ 3s ] thds: 4 tps: 74.03 qps: 1463.67 (r/w/o: 1025.47/289.13/149.07) lat (ms,95%): 70.55 err/s: 0.00 reconn/s: 0.00 [ 4s ] thds: 4 tps: 69.99 qps: 1414.84 (r/w/o: 991.89/282.97/139.98) lat (ms,95%): 65.65 err/s: 0.00 reconn/s: 0.00 [ 5s ] thds: 4 tps: 74.02 qps: 1488.34 (r/w/o: 1048.24/292.07/148.03) lat (ms,95%): 74.46 err/s: 0.00 reconn/s: 0.00 [ 6s ] thds: 4 tps: 72.99 qps: 1444.89 (r/w/o: 1003.92/294.98/145.99) lat (ms,95%): 70.55 err/s: 0.00 reconn/s: 0.00 [ 7s ] thds: 4 tps: 63.00 qps: 1271.04 (r/w/o: 890.03/255.01/126.00) lat (ms,95%): 87.56 err/s: 0.00 reconn/s: 0.00 [ 8s ] thds: 4 tps: 72.99 qps: 1439.82 (r/w/o: 1008.87/284.96/145.98) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00 [ 9s ] thds: 4 tps: 74.00 qps: 1488.01 (r/w/o: 1038.01/302.00/148.00) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00
इसलिए हम देख सकते हैं कि यह मेरी मशीन पर प्रति सेकंड लगभग 70 80 लेनदेन कर रहा है जो प्रति सेकंड लगभग एक हजार से अधिक प्रश्नों का अनुवाद करता है। यह वर्चुअलबॉक्स में लैपटॉप पर चल रहा है।
इन प्रश्नों से, हम देख सकते हैं कि उनमें से कितने पढ़े गए हैं, उनमें से कितने लिखे गए हैं, उनमें से कितने अन्य हैं जो लेन-देन के लिए 95 वाँ प्रतिशत विलंबता है (r/w/o:1038.01/302.00/148.00), कैसे प्रति सेकंड कई त्रुटियां (गलती / एस:0.00) हमारे पास हैं और हमारे पास प्रति सेकंड कितने कनेक्शन हैं (पुनः / एस:0.00)। क्योंकि हम निर्दिष्ट करते हैं कि समय शून्य के बराबर है, यह तब तक चलेगा जब तक हम ctrl+c हिट नहीं करते।
आइए डेटाबेस होस्ट पर शो प्रक्रिया सूची देखें।
mysql> show processlist; +----+-----------------+--------------------+--------+---------+-------+----------------------------+--------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+--------------------+--------+---------+-------+----------------------------+--------------------------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 23200 | Waiting on empty queue | NULL | | 11 | root | localhost | NULL | Sleep | 18438 | | NULL | | 19 | root | localhost | sbtest | Query | 0 | starting | show processlist | | 23 | root | localhost | NULL | Sleep | 4098 | | NULL | | 30 | sbtest_user | 192.168.66.6:37298 | sbtest | Sleep | 0 | | NULL | | 31 | sbtest_user | 192.168.66.6:37300 | sbtest | Execute | 0 | waiting for handler commit | COMMIT | | 32 | sbtest_user | 192.168.66.6:37302 | sbtest | Sleep | 0 | | NULL | | 33 | sbtest_user | 192.168.66.6:37304 | sbtest | Execute | 0 | Opening tables | SELECT c FROM sbtest13 WHERE id=4978 | +----+-----------------+--------------------+--------+---------+-------+----------------------------+--------------------------------------+
सेट में 8 पंक्तियाँ (0.00 सेकंड)
डेटाबेस सर्वर व्यावहारिक रूप से हमेशा व्यस्त रहता था। मैंने देखा कि निष्पादित समय व्यावहारिक रूप से शून्य से कभी नहीं बदलता है, और डेटाबेस सर्वर को कार्रवाई में पकड़ना बहुत आसान था जैसे कि "sbtest13 से चुनें सी जहां आईडी =4978" चल रहा हो। और निश्चित रूप से, हमारे पास बेंचमार्किंग मशीन से चार कनेक्शन हैं
डिफ़ॉल्ट रूप से, SysBench जितनी जल्दी हो सके प्रश्नों को निष्पादित करने का प्रयास करेगा। धीमे ट्रैफ़िक का अनुकरण करने के लिए इस विकल्प का उपयोग किया जा सकता है। आप यहां परिभाषित कर सकते हैं कि प्रति सेकंड कितने लेनदेन निष्पादित किए जाने चाहिए।
--rate=N average transactions rate. 0 for unlimited rate [0]
sysbench होस्ट पर
[[email protected] ~]# sysbench \ --db-driver=mysql \ --mysql-user=sbtest_user \ --mysql_password=password \ --mysql-db=sbtest \ --mysql-host=192.168.66.5 \ --mysql-port=3306 \ --tables=16 \ --table-size=10000 \ --threads=4 \ --time=0 \ --events=0 \ --report-interval=1 \ --rate=40 \ /usr/share/sysbench/oltp_read_write.lua run WARNING: Both event and time limits are disabled, running an endless test sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 4 Target transaction rate: 40/sec Report intermediate results every 1 second(s) Initializing random number generator from current time Initializing worker threads... Threads started! [ 1s ] thds: 4 tps: 42.87 qps: 858.43 (r/w/o: 600.20/171.49/86.74) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00 [ 1s ] queue length: 0, concurrency: 1 [ 2s ] thds: 4 tps: 41.01 qps: 857.25 (r/w/o: 609.17/164.05/84.02) lat (ms,95%): 101.13 err/s: 0.00 reconn/s: 0.00 [ 2s ] queue length: 0, concurrency: 3 [ 3s ] thds: 4 tps: 57.01 qps: 1119.29 (r/w/o: 778.20/228.06/113.03) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00 [ 3s ] queue length: 0, concurrency: 2 . . . [ 15s ] thds: 4 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00 [ 15s ] queue length: 145, concurrency: 4 [ 16s ] thds: 4 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00 [ 16s ] queue length: 179, concurrency: 4
तो यहाँ नया पैरामीटर –rate . है बराबर 40 जिसका अर्थ है कि हमारे पास प्रति सेकंड दो लाइनें आउटपुट की दो लाइनें होंगी और एक नहीं। चूंकि हम बेंचमार्किंग इवेंट की आगमन दर 40 प्रति सेकंड पर सेट करते हैं, हम वर्तमान टीपीएस देखेंगे।
यह 40/सेकंड होने की गारंटी नहीं है, लेकिन आगमन यह गारंटी देता है कि औसतन हम प्रति सेकंड 40 लेनदेन करते हैं और हम दूसरी पंक्ति पर कतार की लंबाई और समवर्ती की निगरानी कर सकते हैं। यदि हम एक छोटी प्रक्रिया सूची करते हैं तो उस स्थिति में डेटाबेस को पकड़ना बहुत आसान है जहां कुछ कनेक्शन यहां प्रतीक्षा कर रहे हैं।
एक सत्र व्यस्त होने पर आप देख सकते हैं कि प्रति सेकंड लेनदेन शून्य है (tps:0.00)।
mysql> show processlist; +----+-----------------+--------------------+--------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+--------------------+--------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 19162 | Waiting on empty queue | NULL | | 8 | root | localhost | NULL | Query | 0 | starting | show processlist | | | 21 | sbtest_user | 192.168.66.6:49060 | sbtest | Execute | 33 | updating | UPDATE sbtest8 SET k=k+1 WHERE id=5005 | | 22 | sbtest_user | 192.168.66.6:49062 | sbtest | Execute | 22 | updating | UPDATE sbtest14 SET c='54592761471-89397085016-24424731626-29460127219-18466786462-73074657089-48925 | 23 | sbtest_user | 192.168.66.6:49064 | sbtest | Execute | 21 | updating | UPDATE sbtest10 SET c='68520795048-46094139936-88850487689-12482054639-29231339380-71050139550-93403 | | 24 | sbtest_user | 192.168.66.6:49066 | sbtest | Execute | 31 | updating | DELETE FROM sbtest14 WHERE id=4994 | +----+-----------------+--------------------+--------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+ 10 rows in set (0.00 sec)
हम देख सकते हैं कि यह कुछ सेकंड के लिए सो रहा है, पिछले परिदृश्य में ऐसा कुछ प्राप्त करना काफी असंभव था।
अंतिम रिपोर्ट के साथ भारी ट्रैफ़िक लिखें:
जैसा कि मैंने time=300 उल्लेख किया है, आइए एक लेखन-भारी (लेकिन केवल-लिखने के लिए नहीं) कार्यभार निष्पादित करें और, उदाहरण के लिए, I/O सबसिस्टम के प्रदर्शन का परीक्षण करें। तब बेंचमार्क 300 सेकेंड तक चलेगा और यह हमें इसका विश्लेषण करने के लिए एक अंतिम रिपोर्ट देगा।
[[email protected] ~]# sysbench \ --db-driver=mysql \ --mysql-user=sbtest_user \ --mysql_password=password \ --mysql-db=sbtest \ --mysql-host=192.168.66.5 \ --mysql-port=3306 \ --tables=16 \ --table-size=10000 \ --threads=8 \ --time=300 \ --events=0 \ --report-interval=1 \ --rate=40 \ /usr/share/sysbench/oltp_read_write.lua run sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 8 Target transaction rate: 40/sec Report intermediate results every 1 second(s) Initializing random number generator from current time Initializing worker threads... Threads started! [ 1s ] thds: 8 tps: 39.87 qps: 810.27 (r/w/o: 570.08/159.46/80.73) lat (ms,95%): 82.96 err/s: 0.00 reconn/s: 0.00 [ 1s ] queue length: 0, concurrency: 1 [ 2s ] thds: 8 tps: 43.02 qps: 847.39 (r/w/o: 590.27/172.08/85.04) lat (ms,95%): 125.52 err/s: 0.00 reconn/s: 0.00 [ 2s ] queue length: 0, concurrency: 0 . . . [ 350s ] thds: 8 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00 [ 350s ] queue length: 6545, concurrency: 1 SQL statistics: queries performed: read: 78624 write: 22385 other: 11205 total: 112214 transactions: 5589 (15.94 per sec.) queries: 112214 (320.02 per sec.) ignored errors: 27 (0.08 per sec.) reconnects: 0 (0.00 per sec.) General statistics: total time: 350.6412s total number of events: 5589 Latency (ms): min: 12.45 avg: 74639.59 max: 213244.02 95th percentile: 100000.00 sum: 417160677.24 Threads fairness: events (avg/stddev): 698.6250/196.36 execution time (avg/stddev): 52145.0847/15557.93
रिपोर्ट विश्लेषण:
यह जांचने के लिए काफी उपयोगी है कि अंतिम रिपोर्ट आपको केवल औसत देगी। इंटरमीडिएट के परिणाम दूसरे आधार पर प्रदर्शन को ट्रैक करना संभव बना देंगे। अंतिम रिपोर्ट ऊपर की तरह दिख सकती है, आपको यहां निष्पादित प्रश्नों, लेनदेन निष्पादित किए गए, कितनी त्रुटियां हुईं, कोई कनेक्शन खो गया, थ्रूपुट क्या था और कुल बीता हुआ समय के बारे में जानकारी मिलेगी। आप विलंबता मीट्रिक और थ्रेड में क्वेरी वितरण भी देख सकते हैं।