डेबियन पर एकल MySQL प्रश्नों के लिए कई कोर का उपयोग करना


10

मैं अतिथि OS के रूप में डेबियन के साथ VM (VMWare) पर परीक्षण के लिए एक MySQL सर्वर चला रहा हूं। अतिथि के पास चार अनुकरणीय सीपीयू कोर हैं, इसलिए मैंने थ्रेड_कॉन्केंसी को चार पर सेट किया है।

मैं बड़ी तालिकाओं पर महंगी जॉइन कर रहा हूं, जिसमें कई मिनट लग सकते हैं, लेकिन मैं अतिथि ओएस पर देखता हूं, कि एक समय में केवल एक कोर का उपयोग किया जाता है। यह शामिल मेज के लिए उपयोग किए जाने वाले भंडारण इंजन की परवाह किए बिना होता है (MyISAM और InnoDB के साथ परीक्षण किया गया)। इसके अतिरिक्त, इन बड़े प्रश्नों को करते समय पूरा डेटाबेस अवरुद्ध हो जाता है, मैं समानांतर में कोई अतिरिक्त प्रश्न नहीं कर सकता। अजीब तरह से htop से पता चलता है, कि क्वेरी के रनटाइम के दौरान क्वेरी में बदलाव के लिए इस्तेमाल किया जाने वाला कोर!

ऐसा क्यों होता है?

यह प्रासंगिक प्रविष्टि है SHOW FULL PROCESSLIST;(कोई अन्य प्रश्न नहीं हैं):

| 153 | root       | localhost | pulse_stocks  | Query   |   50 | Copying to tmp table | 
SELECT DISTINCT * FROM 
`pulse_stocks`.`stocks` sto,
`pulse_new`.`security` sec
WHERE
(sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR
( sto.isin = sec.isin AND sto.isin <> "" AND sec.isin <> "" )
ORDER BY
sto.id
LIMIT 0, 30 

कोई अन्य प्रश्न लंबित नहीं हैं। एक और दिलचस्प अवलोकन यह है, कि यदि मैं ORDER BYभाग छोड़ देता हूं, तो MySQL इस क्वेरी का उत्तर एक सेकंड में देगा ।

यह SHOW ENGINE INNODB STATUS;दिखाता है:

=====================================
120316  9:55:56 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 49 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 47258, signal count 47258
Mutex spin waits 0, rounds 10260, OS waits 39
RW-shared spins 94442, OS waits 47210; RW-excl spins 1, OS waits 1
------------
TRANSACTIONS
------------
Trx id counter 0 5381
Purge done for trx's n:o < 0 1810 undo n:o < 0 0
History list length 2
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 7503, OS thread id 140316748777216
MySQL thread id 154, query id 654 localhost root
SHOW ENGINE INNODB STATUS
---TRANSACTION 0 5380, ACTIVE 105 sec, process no 7503, OS thread id 140316748977920
 fetching rows, thread declared inside InnoDB 429
mysql tables in use 2, locked 0
MySQL thread id 153, query id 623 localhost root Copying to tmp table
SELECT DISTINCT * FROM 
    `pulse_stocks`.`stocks` sto,
    `pulse_new`.`security` sec
WHERE
    (sto.excntry = sec.excntry AND sto.stock_id = sec.ibtic) OR
    ( sto.isin = sec.isin AND sto.isin <> "" AND sec.isin <> "" )
ORDER BY
    sto.id
LIMIT 0, 30

Trx read view will not see trx with id >= 0 5381, sees < 0 5381
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
116089 OS file reads, 7 OS file writes, 7 OS fsyncs
1063.16 reads/s, 117085 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 5, seg size 7,
0 inserts, 0 merged recs, 0 merges
Hash table size 17393, node heap has 1 buffer(s)
0.00 hash searches/s, 14.73 non-hash searches/s
---
LOG
---
Log sequence number 0 38201270
Log flushed up to   0 38201270
Last checkpoint at  0 38201270
0 pending log writes, 0 pending chkp writes
10 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 20638760; in additional pool allocated 994816
Dictionary memory allocated 162680
Buffer pool size   512
Free buffers       0
Database pages     511
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 816631, created 0, written 1
7597.72 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 964 / 1000
--------------
ROW OPERATIONS
--------------
1 queries inside InnoDB, 0 queries in queue
2 read views open inside InnoDB
Main thread process no. 7503, id 140316711446272, state: waiting for server activity
Number of rows inserted 0, updated 0, deleted 0, read 160338394
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 1495933.31 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

कृपया "पूर्ण डेटाबेस" लॉक होने का निदान करने में हमारी सहायता करने के लिए SHOW FULL PROCESSLIST (संभवतः sanitized) और SHOW Engine INNODB STATUS का आउटपुट पोस्ट करें।
आरोन ब्राउन

धन्यवाद, मैंने अनुरोधित जानकारी के साथ प्रश्न को अद्यतन किया।
थॉमस

1
यदि कोई अन्य क्वेरी नहीं चल रही है, तो ऐसा कोई सबूत नहीं है कि पूरा डेटाबेस लॉक है। क्या आप इस स्थिति को पुन: उत्पन्न कर सकते हैं और क्या कर सकते हैं जब लंबे समय से चल रही क्वेरी स्पष्ट रूप से दूसरों को लॉक कर रही हो?
बैरन श्वार्ट्ज

ठीक है, मैंने इसे चेक किया। जब बड़ी क्वेरी चल रही हो, तब भी mysql कंसोल में अन्य क्वेरी करना संभव है। हालाँकि, phpmyadmin बिल्कुल भी जवाब नहीं दे रहा है, यहां तक ​​कि सरल लॉगिन प्रयासों के लिए भी, जबकि क्वेरी निष्पादित हो रही है। निष्पादन का समय अक्सर 10 सेकंड से कम होता है, लेकिन क्वेरी "डेटा भेजने" की स्थिति में कई मिनट तक रहती है।
थॉमस

जवाबों:


10

आपको यह आश्चर्यजनक लग सकता है, लेकिन आपको innodb_thread_concurrency को 0 पर सेट करना चाहिए (जो कि अनंत संगामिति है)। यह InnoDB स्टोरेज इंजन को यह तय करने की अनुमति देगा कि कितने समवर्ती टिकट जारी करने हैं।

मैंने 26 मई, 2011 को InnoDB के मल्टीकोर एंगेजमेंट (MySQL 5.5, भी MySQL 5.1.38 InnoDB Plugin) के बारे में एक पोस्ट लिखी थी

MySQL डॉक्यूमेंटेशन के अनुसार, थ्रेड_केंसीरी वैरिएबल केवल सोलारिस के लिए काम करता है

मुझे एक और चिंता है: क्या आपके जोइन में MyISAM और InnoDB शामिल हैं? MyISAM का पूर्ण-टेबल लॉकिंग व्यवहार InnoDB की पंक्ति-स्तरीय लॉकिंग और MVCC को अशक्त करता है

यदि आप MySQL 5.5 का उपयोग नहीं कर रहे हैं, तो कृपया InnoDB मल्टीकोर सगाई विकल्पों को सेटअप करने के लिए ASAP को अपग्रेड करें

UPDATE 2012-03-19 08:30 EDT

MySQL 5.1.38 से शुरू होकर, आप मल्टीकोर एंगेजमेंट के लिए नई सेटिंग्स का उपयोग करने के लिए InnoDB प्लगइन स्थापित कर सकते हैं। हालाँकि, आपको सेटिंग्स को ठीक से ट्यून करना होगा।

वास्तव में, अपुष्ट छोड़ दिया

  • MySQL के लिए InnoDB 4.1 इससे पहले या बाद में MySQL के अन्य सभी संस्करणों की तुलना में एकल-थ्रेडेड वातावरण में बेहतर चलता है
  • InnoDB 5.1 प्लग इन से पहले या बाद में MySQL के अन्य सभी संस्करणों की तुलना में एकल CPU वातावरण में बेहतर चलता है
  • मैंने नवंबर 2011 में इस बारे में एक पोस्ट लिखी थी: क्यों mysql 5.5 5.1 की तुलना में धीमी है (लिनक्स, mysqll का उपयोग करके)
  • मैंने जून 2011 में एक पोस्ट भी लिखी थी कि आप MySQL, Percona Server, और MariaDB के खिलाफ अपना स्वयं का बेंचमार्क कैसे चला सकते हैं: मैं MySQL सेंक-ऑफ कैसे ठीक से करूं?
  • मेरे सभी दावे पेरकोना पर आधारित हैं जिन्होंने वास्तव में MySQL के सभी संस्करणों के खिलाफ एक प्रदर्शन बेंचमार्क चलाया: http://www.mysqlperformanceblog.com/2011/10/10/mysql-versions-shootout/

आपका बहुत बहुत धन्यवाद। क्या आपका उत्तर स्पष्ट है, कि संस्करण 5.1.X में कई कोर का उपयोग नहीं किया गया है?
थॉमस

हां और ना। मैं कहता हूं कि YES becasue InnoDB 5.1.x में मल्टीकोर सेटिंग्स नहीं हैं। मैं कहता हूं कि आप इन नई सेटिंग्स के लिए इनओबीडी प्लगइन स्थापित कर सकते हैं, लेकिन यह केवल MySQL 5.1.38 और इसके बाद के संस्करण के लिए उपलब्ध है।
रोलैंडम्यूसीडीडीबीए

@RolandoMySQLDBA: क्षमा करें, मुझे पता है कि यह पोस्ट पुरानी है, लेकिन मैंने पाया कि मेरे सर्वर पर mysql (जिसमें 24 कोर हैं) केवल 1 कोर का उपयोग कर रहा है। मैंने innodb_thread_cuncurrencyआपके उल्लेख के अनुसार जाँच की और यह 0 पर सेट है, इसलिए मैं सोच रहा था कि mysql अधिक कोर का उपयोग क्यों नहीं करता है?
मोनोमोना

1
@monamona इसके साथ खेलने के लिए केवल सेटिंग नहीं है। आपको innodb_read_io_threads और innodb_write_io_threads उच्च (8, 16, 32 और 64 आज़माएं) भी सेट करना होगा।
रोलैंडमाइसीडीडीबीए 14

@monamona कृपया मेरी पुरानी पोस्ट पढ़ें dba.stackexchange.com/questions/2918/… अधिक जानकारी के लिए
RolandoMySQLDBA

2

MySQL, किसी भी संस्करण, एक कनेक्शन में कई कोर का उपयोग करने के लिए कोई कोड नहीं है ।

Percona अपने Xtradb में कई कनेक्शनों में कई कोर का उपयोग करने का एक बेहतर काम करता है । InnoDB लगभग 8 कोर पर भाप से निकलता है; Xtradb 32 या तो बाहर समतल करता है।

एक "बड़ी क्वेरी" तालिका (या तालिका की पंक्तियों) को लॉक कर सकती है जिसे कुछ अन्य कनेक्शन की आवश्यकता होती है। आइए क्वेरी और शो क्रिएट टेबल पर नजर डालें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.