কিউচাচি_ফ্রি_ মেমরি পূর্ণ নয় এখনও আমি কিউসিএইচ_মুখে_পুনগুলি পেয়েছি


11

আমি সবেমাত্র আমাদের সিএমএসের জন্য ক্যোয়ারী ক্যাশে নিয়ে ছোঁড়া শুরু করেছি।

যে কেউ আমাকে বলতে পারেন (বা কমপক্ষে একটি ভাল অনুমান দিন) যখন অর্ধেকেরও বেশি নিখরচায় থাকি তখন কেন আমি অনেক কিছু পাই ?Qcache_lowmem_prunesQcache_free_memory

query_cache_size=512M
query_cache_limit=1M

প্রায় 12 ঘন্টা এটির মতো দেখায়

show status like '%qcach%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 10338     | 
| Qcache_free_memory      | 297348320 | 
| Qcache_hits             | 10254104  | 
| Qcache_inserts          | 6072945   | 
| Qcache_lowmem_prunes    | 725279    | 
| Qcache_not_cached       | 2237603   | 
| Qcache_queries_in_cache | 48119     | 
| Qcache_total_blocks     | 111346    | 
+-------------------------+-----------+

এইভাবে এটি দেখাশোনা করা হয়েছে flush query cache;

show status like '%qcach%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         | 
| Qcache_free_memory      | 443559256 | 
| Qcache_hits             | 10307015  | 
| Qcache_inserts          | 6115890   | 
| Qcache_lowmem_prunes    | 725279    | 
| Qcache_not_cached       | 2249405   | 
| Qcache_queries_in_cache | 26455     | 
| Qcache_total_blocks     | 54490     | 
+-------------------------+-----------+

উত্তর:


21

ক্যোয়ারী ক্যাশে খুব সুন্দর বৈশিষ্ট্য, তবে এটির দিকে খুব বেশি মনোযোগ দেওয়ার জন্য প্রলোভিত হবেন না এবং এটি খুব বড় করে তোলার জন্য প্রলোভিত হন না। এর অভ্যন্তরীণ কিছু বোঝা সম্ভবত সে ক্ষেত্রে সহায়তা করবে।

ক্যোয়ারী ক্যাশে উপলব্ধ মেমরির এক বৃহত্তর সংলগ্ন অংশ হিসাবে শুরু হয়। তারপরে এই "বড়" ব্লকটি "ব্লকগুলি" তৈরি হয়েছে:

  • প্রতিটি ক্যাশেড ক্যোয়ারী একটি ব্লক নেয়
  • এর সহযোগী রেজাল্টটি একটি ব্লক নেয়
  • প্রতিটি টেবিলের কোনও ক্যাশেড ক্যোয়ারী দ্বারা রেফারেন্স (যে টেবিলটি ক্যাশে রয়েছে তা উল্লেখ করে কতগুলি প্রশ্নই নেই) এছাড়াও প্রতি টেবিলের মধ্যে একটি ব্লক নেয়।

ব্লকের আকার গতিশীল, তবে সার্ভারটি query_cache_min_res_unit4096 বাইটের ডিফল্ট ডিফল্ট সহ প্রতি ব্লকের সর্বনিম্ন বাইটগুলি বরাদ্দ করে ।

যে কোনও সময় অনুসন্ধান, তার সাথে আসা ফলাফল এবং সারণী উল্লেখগুলি ক্যাশে থেকে সরিয়ে ফেলা হয়, অন্তর্নিহিত টেবিলগুলি অকার্যকর করে নতুন প্রশ্নগুলির জন্য জায়গা তৈরি করার দ্বারা, এটি নতুন গর্তগুলি ছেড়ে দেয় তবে সেই ব্লকগুলির আকার বড়, এবং "ফ্রি ব্লক" এর সংখ্যা সাধারণত বৃদ্ধি পায় ... যদিও দুই বা ততোধিক স্বতন্ত্র ব্লকগুলি মুক্ত করা হয় তবে "ফ্রি ব্লক" এর সংখ্যা কেবল 1 দ্বারা বৃদ্ধি পায়, এবং "ফ্রি ব্লক" মোটেও বাড়বে না যদি নতুন- মুক্ত ব্লকগুলি ইতিমধ্যে নিখরচায় ব্লকের সাথে সামঞ্জস্যপূর্ণ - সেই ফ্রি ব্লকের আকারটি আরও বড় হয়ে যায়। ক্যোয়ারী ক্যাশে নিখরচায় মেমরির যে কোনও উন্মুক্ত ব্লক 1 টি বিনামূল্যে ব্লক হিসাবে গণ্য করা হয়।

অবশ্যই, এর চেয়ে ছোট একটি মুক্ত ব্লক query_cache_min_res_unitমোটেও ব্যবহৃত হবে না।

সুতরাং, ক্যোয়ারী ক্যাশে টুকরো টুকরো। যদি সার্ভারটি একটি নতুন ক্যোয়ারী ক্যাশে করতে চায় এবং পর্যাপ্ত আকারের কোনও নিখরচায় ব্লকগুলি ব্যবস্থা করা যায় না (সেই বিবরণটি ছদ্মবেশী সহজ, কারণ অন্তর্নিহিত অ্যালগরিদম জটিল) তবে অন্য কিছু ছাঁটাই করতে হবে ... এটি আপনার Qcache_lowmem_prunes। একটি "স্বল্প-সাম্প্রতিক-ব্যবহৃত" (এলআরইউ) অ্যালগরিদম রয়েছে যা সিদ্ধান্ত নেয় যে ছাঁটাই হবে।

এটি জিজ্ঞাসা করা বুদ্ধিমানের কাজ হবে কেন সার্ভার মেমরিটিকে ডিফ্র্যাম্ট করে না ... তবে তা বোঝা যাবে না। ক্যোয়ারী ক্যাশে সাহায্য করতে পারে যখন এটি করতে পারে তবে এটি কোনও কৌশলগত নয়। অপ্রয়োজনীয় রক্ষণাবেক্ষণের কার্যক্রমে আপনি প্রক্রিয়াকরণের সময় (বিশেষত বিশ্বব্যাপী লক এ ব্যয় করা সময়) বিনিয়োগ করতে চান না।

ক্যোয়ারী ক্যাশে মেমরিটিকে পুনরায় সাজানো - ডিফ্র্যাগমেন্টিং - ব্যয় করা সার্ভারের পক্ষে প্রতি-উত্পাদনশীল হবে, যেহেতু ক্যাশেড ফলাফলগুলি প্রতিনিয়ত পরিবর্তিত হয় এবং ক্যাশেটির পুরো বিন্দুটি কর্মক্ষমতা উন্নত করে।

আপনি অতিরিক্ত পরিমাণে ক্যোয়ারী ক্যাশে ব্যবহার করতে চান না সে কারণেই বিশ্বব্যাপী লকটি হ'ল একটি খুব ভাল কারণ ... সার্ভারগুলি সেখানে খুব বেশি সময় ব্যয় করবে কারণ ক্যোয়ারীগুলি ক্যাশে হচ্ছে কিনা তা দেখার জন্য ক্যারিরা তাদের পালা অপেক্ষা করে এবং আপনার কার্য সম্পাদন ক্ষতিগ্রস্থ হবে there ।

তবে qcache_free_blocksমূলত হ'ল ফাঁকা স্থান বিভাজনের একটি সূচক। এটি এখন ক্যোয়ারী ক্যাশে উপলব্ধ মেমরির অনেকগুলি অবিসংবাদিত ব্লক বিদ্যমান। একটি নতুন ক্যোয়ারী ক্যাশে toোকানোর জন্য, ক্যোয়ারী, এর ফলাফলগুলি এবং (কখনও কখনও) এর সারণি উল্লেখগুলি অন্তর্ভুক্ত করার জন্য এআরএ যথেষ্ট পরিমাণ খালি স্থান থাকতে হবে। যদি সেখানে না থাকে, তবে অন্য কিছু যেতে হবে ... যা আপনি দেখছেন। আবার নোট করুন, যে উপলভ্য স্থানটি সর্বদা অবিচ্ছিন্নভাবে হয় না (উত্স কোডটি পড়ে আমি যা বলতে পারি তা থেকে) তবে খণ্ড খণ্ডিত হলে প্রতিটি গর্ত পূরণ হবে না।

তবে বিভাজনটি সময়ের সাথে সাথে একটি নির্দিষ্ট কাজের চাপের বাইরে চলে যায়, যেহেতু আপনি যতক্ষণ আশা করতে পারেন কিছুই সাধারণত ক্যোয়ারী ক্যাশে থাকে না।

এটি কারণ, কিছু উপায়ে ক্যোয়ারী ক্যাশে তার সরলতায় উজ্জ্বল।

কোনও ক্যাশেড ক্যোয়ারী দ্বারা রেফারেন্সিত কোনও সারণীতে থাকা ডেটা যে কোনও সময় পরিবর্তিত হয়, সেই টেবিলের সাথে জড়িত সমস্ত প্রশ্নের সমস্ত ক্যাশে থেকে সরানো হয় - এমনকি যদি পরিবর্তনটি ক্যাশেড ফলাফলগুলিকে প্রভাবিত করে না। এটি এমনকি সত্য যদি কোনও টেবিল পরিবর্তন হয় তবে পরিবর্তন হয় না, যেমন কোনও InnoDB লেনদেনের ক্ষেত্রে ফিরে আসে। এই টেবিলটি উল্লেখ করে ক্যোয়ারী ক্যাশে এন্ট্রি ইতিমধ্যে মুছে ফেলা হয়েছে।

এছাড়াও, সার্ভারটি আসলে ক্যোরিটিকে পার্স করার আগে প্রতিটি আগত ক্যোয়ারির জন্য ক্যোয়ারী ক্যাশে পরীক্ষা করা হয় । একমাত্র জিনিসটি যা মিলবে তা হ'ল আরেকটি ক্যোয়ারী যা অবিকল ছিল একই, বাইট-বাই-বাইট। SELECT * FROM my_tableএবং select * from my_tableবাইট-বাই বাইট অভিন্ন নয়, সুতরাং ক্যোয়ারী ক্যাশে বুঝতে পারে না যে তারা একই কোয়েরি।

FLUSH QUERY CACHEক্যোয়ারী ক্যাশে খালি করে না। এটি ক্যোয়ারী ক্যাশেটিকে ডিফ্র্যাগমেন্ট করে, যে কারণে Qcache_free_blocks"১" হয় why সমস্ত মুক্ত স্থান একীভূত।

RESET QUERY CACHE আসলে ক্যোয়ারী ক্যাশে ফ্লাশ হয় (এর সমস্ত বিষয়বস্তু পরিষ্কার করে)।

FLUSH STATUSকাউন্টারগুলি সাফ করে, তবে এটি আপনি নিয়মিত করতে চান এমন কিছু নয় কারণ এই স্থিতিটির বেশিরভাগ ভেরিয়েবলগুলি জিরো করে SHOW STATUS

এখানে কিছু দ্রুত বিক্ষোভ রয়েছে।

বেসলাইন:

mysql> show status like '%qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 67091120 |
| Qcache_hits             | 0        |
| Qcache_inserts          | 0        |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 1        |
| Qcache_queries_in_cache | 0        |
| Qcache_total_blocks     | 1        |
+-------------------------+----------+

একটি কোয়েরি চালান ...

mysql> select * from junk where id = 2;

মোট ব্লকগুলি বৃদ্ধি পেয়েছে 3, সন্নিবেশ 1 এবং ক্যাশে কোয়েরি 1।

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 67089584 |
| Qcache_inserts          | 1        |
| Qcache_queries_in_cache | 1        |
| Qcache_total_blocks     | 4        |
+-------------------------+----------+

একই ক্যোয়ারী চালান, তবে বিভিন্ন মূলধন দিয়ে ...

mysql> SELECT * FROM junk where id = 2;

এই ক্যোয়ারীটি আলাদাভাবে ক্যাশে করা হয়েছিল। মোট ব্লকগুলি কেবলমাত্র 2 টি বৃদ্ধি পেয়েছে কারণ আমাদের কাছে ইতিমধ্যে টেবিলের জন্য একটি ব্লক বরাদ্দ ছিল।

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 67088560 |
| Qcache_inserts          | 2        |
| Qcache_queries_in_cache | 2        |
| Qcache_total_blocks     | 6        |
+-------------------------+----------+

এখন, আমরা টেবিলের একটি পৃথক সারি পরিবর্তন করি ।

mysql> update junk set things = 'items' where id = 1;

উভয় জিজ্ঞাসা এবং সারণী রেফারেন্স ক্যাশে থেকে অবৈধ হয়, আমাদের 1 টি স্বতন্ত্র ফ্রি ব্লক, সমস্ত ক্যাশে মেমরি মুক্ত করে এবং সমস্ত ব্লক একত্রিত করে সমস্ত ফাঁকা স্থান রেখে দেয়।

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 67091120 |
| Qcache_queries_in_cache | 0        |
| Qcache_total_blocks     | 1        |
+-------------------------+----------+

মাইএসকিউএল ক্যাশে এমন কোনও ক্যোয়ারী সংরক্ষণ করবে না যা নির্জনবাদী নয় - যেমন SELECT NOW();বা এমন কোনও কোয়েরি যা আপনি এটি বিশেষভাবে ক্যাশে না বলুন। SELECT SQL_NO_CACHE ...ক্যাশে ফলাফল সংরক্ষণ না করার জন্য সার্ভারকে বলা নির্দেশ is ক্যাশে আপনাকে পরবর্তী মৃত্যুদন্ড কার্যকর করার ক্ষেত্রে একটি ছদ্মবেশী দ্রুত প্রতিক্রিয়া দিচ্ছিল যখন কোনও প্রশ্নের সত্যিকারের মৃত্যুদণ্ডের সময়কে বেঞ্চমার্ক করার জন্য এটি দরকারী।


আপনার উদাহরণগুলিতে, এটি কি ক্যোয়ারী_কাছে_মিনি_রেস_উনিট = 512 সঠিক? নিখরচায় মেমরিটি 1 থেকে 4 টি ব্যবহৃত ব্লকের মধ্যে 512 * 3 এবং 4 থেকে 6 ব্যবহৃত ব্লকের মধ্যে 512 * 2 দ্বারা নেমে যায়।
অ্যাল্যান্ড

1
@ এল্যান্ড এটি একটি খুব ভাল পয়েন্ট। না, আমার 4096 এর ডিফল্ট মানটি ব্যবহার করা উচিত ছিল It মনে হয় যেন ক্যোয়ারী ক্যাশে ব্লকটি পূরণ করার পরে এটির দুটি ক্ষুদ্রতম ক্ষমতার চেয়ে কম ক্ষুদ্রতম ক্ষমতায় ফেলে দেয়, শেষে ফাঁকা স্থান ছেড়ে যায়, যাতে 7/8 তম মূলত বরাদ্দকৃত 4096 বাইট পুরো আটকা পড়ে না। আমাকে আরও গভীরভাবে এটি খনন করতে হবে।
মাইকেল - sqlbot
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.