MySQL डिस्क पर अस्थायी टेबल बनाता है। मैं इसे कैसे रोरूं?


27

हम एक साइट (Moodle) चला रहे हैं, जो वर्तमान में उपयोगकर्ताओं को धीमी गति से मिल रही है। मुझे लगता है कि मैंने डिस्क पर अस्थायी टेबल बनाने के लिए MySQL के लिए समस्या को ट्रैक किया है। मैं created_tmp_disk_tablesमैसूरल वर्कबेंच सर्वर प्रशासन में चर देखता हूं और संख्या लगभग 50 टेबल / एस के साथ बढ़ जाती है। एक दिन के उपयोग के बाद, created_tmp_disk_tables> 100k है। इसके अलावा, स्मृति जारी नहीं लगती है। जब तक सिस्टम बहुत अधिक अनुपयोगी नहीं हो जाता, तब तक उपयोग बढ़ता रहता है और हमें MySQL को फिर से शुरू करना पड़ता है। मुझे लगभग हर दिन इसे फिर से शुरू करने की आवश्यकता है और यह उपलब्ध मेमोरी के लगभग 30-35% का उपयोग करने और दिन को 80% के साथ समाप्त करने के साथ शुरू होता है।

मेरे पास डेटाबेस में कोई ब्लूब नहीं है और प्रश्नों पर कोई नियंत्रण नहीं है, इसलिए मैं उन्हें अनुकूलित करने का प्रयास नहीं कर सकता। मैंने एक कॉन्फ़िगरेशन फ़ाइल जनरेट करने के लिए Percona Confirguration Wizard का भी उपयोग किया है, लेकिन my.ini ने मेरी समस्या का समाधान नहीं किया है।

प्रशन

  1. MySQL को डिस्क पर अस्थायी टेबल बनाने से रोकने के लिए मुझे क्या बदलना चाहिए? क्या ऐसी सेटिंग्स हैं जिन्हें मुझे बदलने की आवश्यकता है? क्या मुझे इसमें अधिक मेमोरी फेंकनी चाहिए?

  2. मैं अपनी मेमोरी खाने से MySQL को कैसे रोक सकता हूं?

संपादित करें

मैंने slow_queriesलॉग को सक्षम किया और पाया कि क्वेरी SELECT GET_LOCK()को धीमी गति से लॉग किया गया था। एक त्वरित खोज से पता चला कि मैंने PHP कॉन्फ़िगरेशन ( mysqli.allow_persistent = ON) में लगातार कनेक्शन की अनुमति दी थी । मैंने इसे बंद कर दिया। इसने उस दर को कम कर दिया जिस पर MySQL मेमोरी खाती है। हालांकि यह अभी भी अस्थायी टेबल बना रहा है।

मैंने यह भी जाँच की कि key_buffer sizeकाफी बड़ी है। मैंने चर को देखा key_writes। यह शून्य होना चाहिए। यदि नहीं, तो वृद्धि करें। मेरे key_buffer_sizeपास शून्य key_readsऔर शून्य है key_writesइसलिए मैं मानता हूं कि यह key_buffer_sizeकाफी बड़ा है।

मैंने बनाया- tmp_table_sizeऔर max-heap-table-sizeबढ़कर 1024M को बनाया_tmp_disk_tables में वृद्धि से संकेत मिल सकता है कि टेबल मेमोरी में फिट नहीं हो सकते हैं। यह हल नहीं किया।

रेफरी: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

संपादित करें 2

यदि आप sort_merge_passesSHOW GLOBAL STATUS आउटपुट में प्रति सेकंड कई देखते हैं , तो आप sort_buffer_sizeमूल्य बढ़ाने पर विचार कर सकते हैं । मेरे पास sort_merge_passesएक घंटे में 2 थे इसलिए मैं काफी sort_buffer_sizeबड़ा होना चाहता हूं ।

रेफरी: मैसूरल मैनुअल ऑन sort_buffer_size

संपादित करें 3

मैंने @RolandoMySQLDBA द्वारा सुझाए गए प्रकारों को संशोधित किया है और बफ़र्स में शामिल हो गए हैं। परिणाम नीचे तालिका में प्रदर्शित किया गया है, लेकिन मुझे लगता है created_tmp_tables_on_diskकि अभी भी उच्च है। मैंने मान बदलने के बाद mysql सर्वर को फिर से शुरू किया और created_tmp_tables_on_diskएक दिन (8h) के बाद जाँच की और औसत की गणना की। कोई अन्य सुझाव? यह मुझे लगता है कि कुछ ऐसा है जो किसी प्रकार के कंटेनर के अंदर फिट नहीं होता है, लेकिन मैं यह नहीं बता सकता कि यह क्या है।

+---------------------+-------------+-------------+--------------------+
| Tmp_table_size,     | Sort_buffer | Join_buffer | No of created      |
| max_heap_table_size |             |             | tmp_tables on disk |
+---------------------+-------------+-------------+--------------------+
| 125M                | 256K        | 256K        |  100k/h            |
+---------------------+-------------+-------------+--------------------+
| 125M                | 512K        | 512K        |  100k/h            |
+---------------------+-------------+-------------+--------------------+
| 125M                | 1M          | 1M          |  100k/h            |
+---------------------+-------------+-------------+--------------------+
| 125M                | 4M          | 4M          |  100k/h            |
+---------------------+-------------+-------------+--------------------+   



यह मेरा विन्यास है:

+-----------------------+-----------------------+
|DATABASE SERVER        |WEB SERVER             |
+-----------------------+-----------------------+
|Windows Server 2008 R2 |Windows Server 2008 R2 |
+-----------------------+-----------------------+
|MySQL 5.1.48           |IIS 7.5                |
+-----------------------+-----------------------+
|4 Core CPU             |4 Core CPU             |
+-----------------------+-----------------------+
|4GB RAM                |8GB RAM                |
+-----------------------+-----------------------+

अतिरिक्त जानकारी

+--------------------+---------+
|PARAM               |VALUE    |
+--------------------+---------+
|Num of tables in Db |361      |
+--------------------+---------+
|Size of database    |2.5G     |
+--------------------+---------+
|Database engine     |InnoDB   |
+--------------------+---------+
|Read/write ratio    |3.5      |
|(Innodb_data_read/  |         |
|innodb_data_written)|         |
+--------------------+---------+
|Avg table size      |15k rows |
+--------------------+---------+
|Max table size      |744k rows|
+--------------------+---------+

यह सेटअप मुझे दिया गया था, इसलिए मेरा इस पर सीमित नियंत्रण है। वेब सर्वर बहुत कम CPU और RAM का उपयोग कर रहा है इसलिए मैंने उस मशीन को अड़चन के रूप में बाहर रखा है। MySQL सेटिंग्स का अधिकांश हिस्सा एक कॉन्फ़िगर ऑटो-जेनरेशन टूल से उत्पन्न होता है।

मैंने कुछ प्रतिनिधि दिनों में PerfMon का उपयोग करके सिस्टम की निगरानी की है। उस से, मैं यह निष्कर्ष निकालता हूं कि यह ओएस नहीं है जो डिस्क को स्वैप कर रहा है।

My.ini

[client]
port=3306
[mysql]
default-character-set=utf8

[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/DBs/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=125
query_cache_size=350M
table_cache=1520
tmp_table_size=125M
table-definition-cache= 1024
max-heap-table-size= 32M
thread_cache_size=38

MyISAM Specific options
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=125M
key_buffer_size=55M
read_buffer_size=1024K
read_rnd_buffer_size=256K
sort_buffer_size=1024K
join_buffer_size=1024K


INNODB Specific options
innodb_data_home_dir="D:/DBs/"
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_buffer_pool_size=2G
innodb_log_file_size=407M
innodb_thread_concurrency=8

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट GoFundMonica कहते

जवाबों:


16

को देखते हुए my.ini, मेरे पास दो सुझाव हैं

शुक्रिया # 1

मैं आपके बाद निम्न सेटिंग्स से टकराऊंगा my.ini

sort_buffer_size=4M
join_buffer_size=4M

यह स्मृति में कुछ जुड़ाव और क्रमबद्ध बनेगा। बेशक, एक बार JOINया एक ORDER BYसे अधिक की जरूरत है 4M, यह एक MyISAM तालिका के रूप में डिस्क के लिए पृष्ठ होगा।

यदि आप लॉगिन नहीं कर सकते हैं root@localhost, तो mysql को पुनः आरंभ करें

C:\> net stop mysql
C:\> net start mysql

यदि आप रूट @ लोकलहोस्ट के रूप में लॉग इन कर सकते हैं, तो आपको इन सेटिंग्स का उपयोग करने के लिए mysql को पुनरारंभ करने की आवश्यकता नहीं है।

बस इसे MySQL क्लाइंट में चलाएं:

SET @FourMegs = 1024 * 1024 * 4;
SET GLOBAL sort_buffer_size = @FourMegs;
SET GLOBAL join_buffer_size = @FourMegs;

सुगम # २

चूंकि आपका डेटा ड्राइव पर है D:, इसलिए आपके पास डिस्क I / O ड्राइव पर हो सकता है C:

कृपया इस क्वेरी को चलाएं:

mysql> show variables like 'tmpdir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tmpdir        | C:\Windows\TEMP |
+---------------+-----------------+
1 row in set (0.00 sec)

चूंकि मैं अपने डेस्कटॉप पर mysql को डिफॉल्ट से चलाता हूं, इसलिए मेरे अस्थायी टेबल ड्राइव पर लिखे जा रहे हैं C:। यदि ड्राइव डी ड्राइव की तुलना में बेहतर डिस्क है C:, शायद आप ड्राइव करने के लिए अस्थायी तालिकाओं मैप कर सकते हैं D:की स्थापना करके tmpdir में my.iniइस प्रकार है:

tmpdir="D:/DBs/"

आपको mysql को पुनरारंभ करना होगा क्योंकि tmpdir एक गतिशील चर नहीं है।

कोशिश तो करो !!!

अद्यतन 2013-11-29 10:09 ईएसटी

सुझाव # ३

इस तथ्य को देखते हुए कि MySQL विंडोज में चल रहा है और आप कोर पैकेज में प्रश्नों को नहीं छू सकते हैं, मेरे पास दो विचार हैं जिन्हें एक साथ किया जाना चाहिए।

IDEA # 1: डेटाबेस को लिनक्स मशीन में ले जाएं

आपको इसका सक्षम होना चाहिए

  • लिनक्स मशीन सेट करें
  • लिनक्स मशीन पर MySQL स्थापित करें
  • विंडोज में MySQL के लिए बाइनरी लॉगिंग सक्षम करें
  • mysqldump डेटाबेस को एक टेक्स्ट SQL फ़ाइल में
  • लिनक्स में चल रहे MySQL में SQL फ़ाइल लोड करें
  • MySQL / Windows से MySQL / Linux में सेटअप प्रतिकृति

आईडिया # 2: लिनक्स मशीन को इंगित करने के लिए मूड को फिर से कॉन्फ़िगर करें

Moodle को पहली जगह LAMP के लिए डिज़ाइन किया गया था। बस स्थानीयहोस्ट के बजाय लिनक्स मशीन की ओर इशारा करने के लिए विन्यास फाइल को बदलें।

यहाँ MySQL सेट करने पर एक पुराने Moodle 2.3 डॉक का लिंक दिया गया है: http://docs.moodle.org/23/en/Installing_Moodle#Create_an_empty_database

मुझे यकीन है कि नवीनतम डॉक्स भी उपलब्ध हैं।

डेटाबेस को लिनक्स में ले जाने का क्या मतलब है ???

यह कैसे अस्थायी तालिका की स्थिति में मदद करता है ???

मैं तब आपके अस्थायी तालिकाओं के लिए लक्ष्य फ़ोल्डर के रूप में एक रैम डिस्क स्थापित करने का सुझाव दूंगा

अस्थायी तालिका निर्माण अभी भी होगा, लेकिन यह डिस्क के बजाय रैम को लिखा जाएगा। डिस्क I / O को कम करना।

अद्यतन 2013-11-29 11:24 ईएसटी

उत्तर # 4

मैं एक तेज RAID-0 डिस्क (32+ जीबी) के साथ SUGGESTION # 2 को फिर से शुरू करने का सुझाव दूंगा, इसे ड्राइव टी: (टी फॉर टेम्प) के रूप में कॉन्फ़िगर किया जाएगा। ऐसी डिस्क स्थापित करने के बाद, इसे इसमें जोड़ें my.ini:

[mysqld]
tmpdir="T:\"

MySQL रिस्टार्ट की आवश्यकता होगी, का उपयोग करते हुए

net stop mysql
net start mysql

BTW I ने RAID-0 को उद्देश्य से कहा ताकि आप एक RAID-1, RAID-10 पर अच्छा लेखन प्रदर्शन प्राप्त कर सकें। एक tmp टेबल डिस्क कोई ऐसी चीज नहीं है जिसे मैं बेमानी बनाऊंगा।

@RaymondNijland पर टिप्पणियों को अनुकूलित किए बिना टिप्पणी कर रहा है, आप किसी भी तरह से अस्थायी तालिका निर्माण संख्या को कम नहीं कर सकते। SUGGESTION #3और SUGGESTION #4गति सारणी निर्माण और गति सारणी I / O को एकमात्र विकल्प के रूप में प्रस्तुत करना।


13

मैं पूर्णता के लिए यहां अपने प्रश्न का उत्तर देता हूं

मैं @RolandoMySQLDBA को पसंदीदा उत्तर के रूप में चुनूंगा क्योंकि इसने मुझे सबसे अधिक संकेत दिए थे, हालांकि यह वास्तव में मेरी समस्या का समाधान नहीं था।

नीचे मेरी जांच के परिणाम हैं

निष्कर्ष

विंडोज़ पर MySQL सिर्फ बहुत सारी अस्थायी टेबल बनाता है और कॉन्फ़िगरेशन फ़ाइलों की सामग्री को संशोधित करके MySQL को ट्यून करने से मदद नहीं मिली।

विवरण

तालिका किसी भी प्रश्न को निष्पादित करने से पहले क्रमशः my.ini में संशोधित किए गए मापदंडों का विवरण देती है। प्रत्येक परीक्षण के बीच MySQL फिर से शुरू किया गया।

मैंने मूल प्रश्न में पाए गए my.ini को एक टेम्पलेट के रूप में उपयोग किया और मैंने नीचे दिए गए तालिका के अनुसार एक-एक करके मापदंडों के मूल्य को बदल दिया।

मैंने JMeter का उपयोग 100 समवर्ती वेब अनुरोधों को उत्पन्न करने के लिए किया (जैसा कि हमारे उपयोग का प्रतिनिधित्व किया) 10 बार दोहराया। प्रत्येक Testमें कुल मिलाकर 1000 अनुरोध होते हैं। इसके परिणामस्वरूप बाद के डेटाबेस कॉल हुए। इससे पता चला कि MySQL ने बहुत सारे अस्थायी टेबल बनाए हैं, चाहे हम कितने भी कॉन्फ़िगरेशन पैरामीटर बदल लें।

+----+------------+-------+---------------+------------+
|Test|Parameter   |Value  |NumOfTempTables|Db Max Conn |
+----+------------+-------+---------------+------------+
| 1  |key_buffer_ | 25M   | 30682         | 29         |
|    |size        |       |               |            | 
+----+------------+-------+---------------+------------+
| 2  |key_buffer_ | 55M   | 30793         | 29         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 3  |key_buffer_ | 100M  | 30666         | 28         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 4  |key_buffer_ | 125M  | 30593         | 24         |
|    |size        |       |               |            | 
+----+------------+-------+---------------+------------+
| 5  |query_cache_| 100M  | 30627         | 32         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 6  |query_cache_| 250M  | 30761         | 26         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 7  |query_cache_| 500M  | 30864         | 83*        |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 8  |query_cache_| 1G    | 30706         | 75*        |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 9  |tmp_table_  | 125M  | 30724         | 31         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 10 |tmp_table_  | 250M  | 30689         | 90*        |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 11 |tmp_table_  | 500M  | 30792         | 28         |
|    |size        |       |               |            |  
+----+------------+-------+---------------+------------+
| 12 |Sort_buffer&| 256K  | 30754         | 28         |
|    |Join_buffer |       |               |            |
+----+------------+-------+---------------+------------+
| 13 |Sort_buffer&| 512K  | 30788         | 30         |
|    |Join_buffer |       |               |            | 
+----+------------+-------+---------------+------------+
| 14 |Sort_buffer&| 1M    | 30788         | 28         |
|    |Join_buffer |       |               |            | 
+----+------------+-------+---------------+------------+
| 15 |Sort_buffer&| 4M    | 30642         | 35         |
|    |Join_buffer |       |               |            |
+----+------------+-------+---------------+------------+
| 16 |innodb-     | 1G    | 30695         | 33         |
|    |buffer-     |       |               |            |
|    |pool-size   |       |               |            |
+----+------------+-------+---------------+------------+
| 17 |innodb-     | 2G    | 30791         | 28         |
|    |buffer-     |       |               |            |
|    |pool-size   |       |               |            | 
+----+------------+-------+---------------+------------+
| 18 |innodb-     | 3G    | 30719         | 34         |
|    |buffer-     |       |               |            |
|    |pool-size   |       |               |            |  
+----+------------+-------+---------------+------------+

* तीन रन का औसत

नीचे दी गई छवियां विभिन्न कॉन्फ़िगरेशन के लिए आवश्यक डेटाबेस सर्वर की मेमोरी और सीपीयू की मात्रा को दर्शाती हैं। काली रेखाएँ न्यूनतम और अधिकतम मूल्यों को दर्शाती हैं और नीली पट्टियाँ आरंभ और अंत मूल्यों को इंगित करती हैं। 4096Mप्रश्न में अधिकतम मेमोरी को इंगित किया गया था ।

स्मृति उपयोग सि पि यु का उपयोग


आप किस संग्रहण इंजन का उपयोग कर रहे हैं? यदि आप MyISAM तालिकाओं का उपयोग नहीं कर रहे हैं, तो यह key_buffer_size पर भरोसा करने के लिए सार्थक नहीं है। अगर आप innodb भंडारण इंजन का उपयोग कर रहे हैं, तो innodb_buffer_pool_size का आकार क्या है। क्या आप query_cache का उपयोग कर रहे हैं?
कासी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.