हम एक साइट (Moodle) चला रहे हैं, जो वर्तमान में उपयोगकर्ताओं को धीमी गति से मिल रही है। मुझे लगता है कि मैंने डिस्क पर अस्थायी टेबल बनाने के लिए MySQL के लिए समस्या को ट्रैक किया है। मैं created_tmp_disk_tables
मैसूरल वर्कबेंच सर्वर प्रशासन में चर देखता हूं और संख्या लगभग 50 टेबल / एस के साथ बढ़ जाती है। एक दिन के उपयोग के बाद, created_tmp_disk_tables
> 100k है। इसके अलावा, स्मृति जारी नहीं लगती है। जब तक सिस्टम बहुत अधिक अनुपयोगी नहीं हो जाता, तब तक उपयोग बढ़ता रहता है और हमें MySQL को फिर से शुरू करना पड़ता है। मुझे लगभग हर दिन इसे फिर से शुरू करने की आवश्यकता है और यह उपलब्ध मेमोरी के लगभग 30-35% का उपयोग करने और दिन को 80% के साथ समाप्त करने के साथ शुरू होता है।
मेरे पास डेटाबेस में कोई ब्लूब नहीं है और प्रश्नों पर कोई नियंत्रण नहीं है, इसलिए मैं उन्हें अनुकूलित करने का प्रयास नहीं कर सकता। मैंने एक कॉन्फ़िगरेशन फ़ाइल जनरेट करने के लिए Percona Confirguration Wizard का भी उपयोग किया है, लेकिन my.ini ने मेरी समस्या का समाधान नहीं किया है।
प्रशन
MySQL को डिस्क पर अस्थायी टेबल बनाने से रोकने के लिए मुझे क्या बदलना चाहिए? क्या ऐसी सेटिंग्स हैं जिन्हें मुझे बदलने की आवश्यकता है? क्या मुझे इसमें अधिक मेमोरी फेंकनी चाहिए?
मैं अपनी मेमोरी खाने से 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 में वृद्धि से संकेत मिल सकता है कि टेबल मेमोरी में फिट नहीं हो सकते हैं। यह हल नहीं किया।
संपादित करें 2
यदि आप sort_merge_passes
SHOW 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