মাইএসকিএল ইনডোডবি_বাফার_পুল_সাইজ কত বড় হওয়া উচিত?


169

আমার সম্পূর্ণ ব্যতীত ডাটাবেস রয়েছে যা সম্পূর্ণ ইনোডিবি টেবিল যা প্রায় 5 গিগাবাইট আকারের। ডেটাবেসটি এসএসডি ডিস্ক ব্যবহার করে একটি ডেবিয়ান সার্ভারে চলে এবং আমি সর্বাধিক সংযোগগুলি = 800 সেট করেছিলাম যা কখনও কখনও পরিপূর্ণ হয় এবং সার্ভারটি বন্ধ করে দেয় ind প্রতি সেকেন্ডে গড় ক্যোয়ারী প্রায় 2.5K। সুতরাং সর্বাধিক সম্ভাব্য সংযোগের জন্য জায়গা তৈরি করতে আমার মেমরির ব্যবহারটি সর্বোত্তম করতে হবে to

আমি পরামর্শগুলি দেখেছি যে ইনোডাব_ফার_পুল_সাইজ মোট মেমরির 80% পর্যন্ত হওয়া উচিত। অন্যদিকে আমি টিউনিং-প্রাইমার স্ক্রিপ্ট থেকে এই সতর্কতাটি পেয়েছি:

Max Memory Ever Allocated : 91.97 G
Configured Max Per-thread Buffers : 72.02 G
Configured Max Global Buffers : 19.86 G
Configured Max Memory Limit : 91.88 G
Physical Memory : 94.58 G

এখানে আমার বর্তমান ইনোডাব ভেরিয়েবলগুলি রয়েছে:

| innodb_adaptive_flushing                          | ON                                                                                                                     |
| innodb_adaptive_hash_index                        | ON                                                                                                                     |
| innodb_additional_mem_pool_size                   | 20971520                                                                                                               |
| innodb_autoextend_increment                       | 8                                                                                                                      |
| innodb_autoinc_lock_mode                          | 1                                                                                                                      |
| innodb_buffer_pool_instances                      | 1                                                                                                                      |
| innodb_buffer_pool_size                           | 20971520000                                                                                                            |
| innodb_change_buffering                           | all                                                                                                                    |
| innodb_checksums                                  | ON                                                                                                                     |
| innodb_commit_concurrency                         | 0                                                                                                                      |
| innodb_concurrency_tickets                        | 500                                                                                                                    |
| innodb_data_file_path                             | ibdata1:10M:autoextend                                                                                                 |
| innodb_data_home_dir                              |                                                                                                                        |
| innodb_doublewrite                                | ON                                                                                                                     |
| innodb_fast_shutdown                              | 1                                                                                                                      |
| innodb_file_format                                | Antelope                                                                                                               |
| innodb_file_format_check                          | ON                                                                                                                     |
| innodb_file_format_max                            | Antelope                                                                                                               |
| innodb_file_per_table                             | ON                                                                                                                     |
| innodb_flush_log_at_trx_commit                    | 2                                                                                                                      |
| innodb_flush_method                               | O_DIRECT                                                                                                               |
| innodb_force_load_corrupted                       | OFF                                                                                                                    |
| innodb_force_recovery                             | 0                                                                                                                      |
| innodb_io_capacity                                | 200                                                                                                                    |
| innodb_large_prefix                               | OFF                                                                                                                    |
| innodb_lock_wait_timeout                          | 50                                                                                                                     |
| innodb_locks_unsafe_for_binlog                    | OFF                                                                                                                    |
| innodb_log_buffer_size                            | 4194304                                                                                                                |
| innodb_log_file_size                              | 524288000                                                                                                              |
| innodb_log_files_in_group                         | 2                                                                                                                      |
| innodb_log_group_home_dir                         | ./                                                                                                                     |
| innodb_max_dirty_pages_pct                        | 75                                                                                                                     |
| innodb_max_purge_lag                              | 0                                                                                                                      |
| innodb_mirrored_log_groups                        | 1                                                                                                                      |
| innodb_old_blocks_pct                             | 37                                                                                                                     |
| innodb_old_blocks_time                            | 0                                                                                                                      |
| innodb_open_files                                 | 300                                                                                                                    |
| innodb_purge_batch_size                           | 20                                                                                                                     |
| innodb_purge_threads                              | 0                                                                                                                      |
| innodb_random_read_ahead                          | OFF                                                                                                                    |
| innodb_read_ahead_threshold                       | 56                                                                                                                     |
| innodb_read_io_threads                            | 4                                                                                                                      |
| innodb_replication_delay                          | 0                                                                                                                      |
| innodb_rollback_on_timeout                        | OFF                                                                                                                    |
| innodb_rollback_segments                          | 128                                                                                                                    |
| innodb_spin_wait_delay                            | 6                                                                                                                      |
| innodb_stats_method                               | nulls_equal                                                                                                            |
| innodb_stats_on_metadata                          | ON                                                                                                                     |
| innodb_stats_sample_pages                         | 8                                                                                                                      |
| innodb_strict_mode                                | OFF                                                                                                                    |
| innodb_support_xa                                 | ON                                                                                                                     |
| innodb_sync_spin_loops                            | 30                                                                                                                     |
| innodb_table_locks                                | ON                                                                                                                     |
| innodb_thread_concurrency                         | 4                                                                                                                      |
| innodb_thread_sleep_delay                         | 10000                                                                                                                  |
| innodb_use_native_aio                             | ON                                                                                                                     |
| innodb_use_sys_malloc                             | ON                                                                                                                     |
| innodb_version                                    | 1.1.8                                                                                                                  |
| innodb_write_io_threads                           | 4                                                                                                                      |

একটি পার্শ্ব নোট যা প্রাসঙ্গিক হতে পারে: আমি দেখতে পাচ্ছি যে যখন আমি একটি বড় পোস্ট (10KB এর চেয়ে বেশি বলুন) ড্রপাল (যা একটি পৃথক ওয়েব সার্ভারে বসে) থেকে ডাটাবেসে সন্নিবেশ করানোর চেষ্টা করি তখন তা চিরকাল স্থায়ী হয় এবং পৃষ্ঠাটি সঠিকভাবে ফিরে আসে না।

এগুলি সম্পর্কে, আমি ভাবছি যে সর্বোত্তম পারফরম্যান্সের জন্য আমার ইনোডাব_বফার_পুল_সাইজটি কী হওয়া উচিত? আমি এবং আপনার এই দৃশ্যের জন্য অন্যান্য পরামিতিগুলি সর্বোত্তমভাবে সেট করতে আপনার পরামর্শগুলির প্রশংসা করি।

উত্তর:


251

আপনার ইন্নাডব_বফার_পুল_সাইজ প্রচুর। আপনি এটি সেট আছে 20971520000। এটি 19.5135 জিবি। যদি আপনি কেবল 5 জিবি ইনোডিবি ডেটা এবং সূচকগুলি করেন তবে আপনার কেবল 8 জিবি থাকা উচিত। এমনকি এটি খুব বেশি হতে পারে।

আপনার যা করা উচিত তা এখানে। প্রথমে এই কোয়েরিটি চালান

SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;

এটি আপনাকে সমস্ত no০% অতিরিক্ত ইনোএনডিবি ডেটা এবং সূচকগুলির উপর ভিত্তি করে প্রস্তাবিত ইনোডিবি বাফার পুলের আকার দেবে আরআইবিপিএস।

উদাহরণ স্বরূপ

mysql>     SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
    ->     (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    ->     FROM information_schema.tables WHERE engine='InnoDB') A;
+-------+
| RIBPS |
+-------+
|     8 |
+-------+
1 row in set (4.31 sec)

mysql>

এই আউটপুট দিয়ে আপনি /etc/my.cnf এ নিম্নলিখিতটি সেট করবেন

[mysqld]
innodb_buffer_pool_size=8G

পরবর্তী, service mysql restart

পুনঃসূচনা করার পরে, এক বা দুই সপ্তাহের জন্য মাইএসকিএল চালান। তারপরে, এই কোয়েরিটি চালান:

SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM
(SELECT variable_value PagesData
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize
FROM information_schema.global_status
WHERE variable_name='Innodb_page_size') B;

এটি আপনাকে এই মুহুর্তে InnoDB বাফার পুলে ইনোডিবি ডেটা দ্বারা ব্যবহার করা কতটা প্রকৃত জিবি মেমরি দেয়।

আমি এর আগে এই সম্পর্কে লিখেছি: ইনোডাব_বফার_পুল কী সেট করবেন এবং কেন ..?

আপনি DataGBপুনরায় কনফিগারিং, পুনরায় আরম্ভ এবং এক সপ্তাহ অপেক্ষা করার চেয়ে এই মুহূর্তে এই ক্যোয়ারীটি এখনই চালাতে পারেন ।

এই মানটি DataGBআরও ঘনিষ্ঠভাবে মেলে যে ইনোডিবি বাফার পুলটি কত বড় হওয়া উচিত + ((ইনোডাব_চেঞ্জ_বফার_ম্যাক্স_সাইজে নির্দিষ্ট শতাংশ))। আমি নিশ্চিত যে এই মুহূর্তে আপনি যে 20000 এম সংরক্ষণ করেছেন তার চেয়ে অনেক কম হবে। র‌্যামে থাকা সঞ্চয়গুলি অন্যান্য জিনিসগুলির সুরের জন্য ব্যবহার করা যেতে পারে

ক্যাভেট # 1

এটি লক্ষ করা খুব গুরুত্বপূর্ণ: সময়ে, ইনোডিবি- র জন্য ইনোডাব_বফার_পুল_সাইজের জন্য 10% অতিরিক্ত অতিরিক্ত প্রয়োজন হতে পারে । এখানে মাইএসকিউএল ডকুমেন্টেশন কী বলে:

আপনি এই মানটি যত বড় সেট করেন, সারণীতে ডেটা অ্যাক্সেস করার জন্য কম ডিস্কের I / O প্রয়োজন। ডেডিকেটেড ডেটাবেস সার্ভারে, আপনি এটি মেশিনের শারীরিক মেমরির আকারের 80% পর্যন্ত সেট করতে পারেন। এই অন্যান্য সমস্যা দেখা দিলে এই মানটি স্কেল করতে প্রস্তুত থাকুন:

শারীরিক মেমরির জন্য প্রতিযোগিতা অপারেটিং সিস্টেমে পেজিংয়ের কারণ হতে পারে।

InnoDB বাফার এবং নিয়ন্ত্রণ কাঠামোর জন্য অতিরিক্ত মেমরি সংরক্ষণ করে, যাতে মোট বরাদ্দ স্থান নির্দিষ্ট আকারের চেয়ে প্রায় 10% বেশি হয়।

ঠিকানা স্থানটি অবশ্যই সংলগ্ন হতে হবে, যা নির্দিষ্ট ঠিকানাগুলিতে লোড হওয়া ডিএলএলগুলির সাথে উইন্ডোজ সিস্টেমে একটি সমস্যা হতে পারে।

বাফার পুলটি আরম্ভ করার সময়টি এর আকারের সাথে আনুপাতিক। বৃহত ইনস্টলেশনগুলিতে, এই আরম্ভের সময়টি উল্লেখযোগ্য হতে পারে। উদাহরণস্বরূপ, একটি আধুনিক লিনাক্স x86_64 সার্ভারে, 10 গিগাবাইটের বাফার পুলটি শুরু করতে প্রায় 6 সেকেন্ড সময় লাগে। বিভাগ 8.9.1, "InnoDB বাফার পুল" দেখুন

ক্যাভেট # 2

আমি আপনার নীচের মানগুলি দেখুন my.cnf

| innodb_io_capacity                                | 200 |
| innodb_read_io_threads                            | 4   |
| innodb_thread_concurrency                         | 4   |
| innodb_write_io_threads                           | 4   |

এই সংখ্যাটি InnoDB কে একাধিক কোর অ্যাক্সেস করতে বাধা দেবে

নিম্নলিখিত সেট করুন:

[mysqld]
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64

আমি এর আগে ডিবিএ স্ট্যাকএক্সচেঞ্জ এ লিখেছিলাম

আমি আরও সংক্ষিপ্ত সূত্র ব্যবহার করে সার্ভারফল্টে এই জাতীয় একটি প্রশ্নের উত্তর দিয়েছি :

SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
    SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
    FROM
    (
        SELECT SUM(data_length+index_length)*1.1*growth RIBPS
        FROM information_schema.tables AAA,
        (SELECT 1.25 growth) BBB
        WHERE ENGINE='InnoDB'
    ) AA
) A;

1
এই মহান পোস্টের জন্য ধন্যবাদ! আপনার সূত্রটি SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...মাইএসকিউএল ৫. on- এ নিম্নলিখিত ত্রুটিটি উত্পন্ন করে: " 'ইনফর্মেশন_সেসিএইচ । আপনি কি কোনও সুযোগের দ্বারা আপডেট সংস্করণ পাবেন?
বেনিয়ামিন

আমি 307 আরআইবিপিএস এবং 264 জি পেয়েছি। এর মানে কি আমার 307 জিবি র‌্যাম লাগবে?
E_Blue

264G এর মতো আরও। তবে এর জন্য আপনার যথেষ্ট পরিমাণে র‌্যাম থাকা উচিত, অন্যথায় সিস্টেমে কী চালিত হয় তার উপর নির্ভর করে আপনার র‌্যামের উল্লিখিত ৮০% মাইএসকিএলকে দিন।
sjas

2
আমি পড়েছি সবচেয়ে বড় পোস্ট! আমার কাছে প্রায় 3 জিবি একটি database বড় ডাটাবেস রয়েছে। আপনার উত্তর / নিবন্ধটি পড়ার পরে এবং লিঙ্কগুলির গতি 2x
fat_mike

4
@ বেঞ্জামিন: মাইএসকিউএল ৫.7..6 অনুসারে তথ্য_সেমিকাকে কর্মক্ষমতা_সেমায়িত করা হয়েছে। সুতরাং এটিকে কাজ করার জন্য ক্যোয়ারিতে "তথ্য_সেমিমা" কে "পারফরম্যান্স_স্কেমা" তে পরিবর্তন করুন। সূত্র: dev.mysql.com/doc/refman/5.7/en/status-table.html
রাল্ফ বোল্টন

11

এটার মতো কিছু? ব্যবহার SHOW VARIABLESএবং SHOW GLOBAL STATUS:

এক্সপ্রেশন: innodb_buffer_pool_size / _ram
অর্থ: InnoDB বাফার_পুলের জন্য ব্যবহৃত% র‌্যাম
প্রস্তাবিত ব্যাপ্তি: 60 ~ 80%

এক্সপ্রেশন: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
অর্থ: ডিস্কের জন্য যে অনুরোধগুলি পড়তে হয়েছিল সেগুলি পড়ার
প্রস্তাবিত ব্যাপ্তি: 0-2%
সীমার বাইরে থাকলে কী করতে হবে: আপনার পর্যাপ্ত পরিমাণ রয়েছে যদি ইনডোডবি_বফার_পুল_সাইজ বাড়ান র্যাম.

এক্সপ্রেশন: Innodb_pages_read / Innodb_buffer_pool_read_requests
অর্থ: ডিস্কগুলিতে আঘাত করতে হয়েছিল এমন অনুরোধগুলি পড়ুন
প্রস্তাবিত ব্যাপ্তি: 0-2%
সীমার বাইরে থাকলে কী করতে হবে: আপনার পর্যাপ্ত র‍্যাম থাকলে ইনোডাব_বফার_পুল_সেস বাড়ান।

অভিব্যক্তি: Innodb_pages_written / Innodb_buffer_pool_write_requests
অর্থ: অনুরোধগুলি লিখুন যা ডিস্ককে আঘাত করতে হয়েছিল
প্রস্তাবিত ব্যাপ্তি: 0-15%
সীমার বাইরে থাকলে কী করতে হবে: Innodb_buffer_pool_size চেক করুন

এক্সপ্রেশন: Innodb_buffer_pool_reads / Uptime
অর্থ: রাউন্ডআপ
প্রস্তাবিত পরিসীমা: 0-100 / সেকেন্ড।
সীমার বাইরে থাকলে কী করবেন: ইনোডাব_বফার_পুল_সাইজ বাড়ান?

অভিব্যক্তি: (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
অর্থ: InnoDB I / O
প্রস্তাবিত ব্যাপ্তি: 0-100 / সেকেন্ড
সীমার বাইরে থাকলে কী করবেন: ইনোডাব_বফার_পুল_সাইজ বাড়ান?

অভিব্যক্তি: Innodb_buffer_pool_pages_flushed / Uptime
অর্থ: রাইটস (ফ্লাশ)
প্রস্তাবিত ব্যাপ্তি: 0-100 / সেকেন্ড।
সীমার বাইরে থাকলে কী করবেন: ইনোডাব_বফার_পুল_সাইজ বাড়ান?

অভিব্যক্তি: Innodb_buffer_pool_wait_free / Uptime
অর্থ: যখন বাফারপুলে কোনও বিনামূল্যে পৃষ্ঠা নেই তখন কাউন্টার are অর্থাৎ সমস্ত পৃষ্ঠা নোংরা।
প্রস্তাবিত ব্যাপ্তি: 0-1 / সেকেন্ড
সীমার বাইরে থাকলে কী করবেন: প্রথমে নিশ্চিত হন যে ইনডোডবি_বাফলার_পুল_সাইজটি যুক্তিযুক্তভাবে সেট করা আছে; এখনও যদি সমস্যা হয় তবে হ'ল ইনোডব_ম্যাক্স_ডার্টি_পেজ_প্যাক্ট


ধন্যবাদ রিক সুন্দর মন্তব্যের জন্য। কোন innodb_buffer_pool_sizeমান নির্দিষ্ট করে? আসল আকার বা কনফিগার একটি?
জোকার

1
@ জোকার - innodb_buffer_pool_sizeসর্বাধিক আকার নির্দেশ করে। একটি সাধারণ সার্ভারে, "বাফার পুল" ছোট শুরু হয় তবে দ্রুত সেই সর্বোচ্চ আকারে বেড়ে যায় এবং সেখানেই থাকে। দ্রষ্টব্য: এটি যদি র‌্যামের চেয়ে বড় (বা এমনকি নিকট) হয় তবে এটি অদলবদলের দিকে নিয়ে যায়, যা কার্য সম্পাদনের জন্য ভয়ানক।
রিক জেমস

7

আপনার শিরোনাম ইনোডাব_বাফলার_পুল_সাইজ সম্পর্কে জিজ্ঞাসা করে তবে আমার সন্দেহ হয় যে এটি আসল সমস্যা নয়। (আপনি এটিকে কেন যথেষ্ট বড়, এমনকি অনেক বড় সেট করেছেন তা নিয়ে রোল্যান্ডো মন্তব্য করেছিলেন))

আমি সর্বাধিক সংযোগগুলি স্থাপন করেছি = 800 যা কখনও কখনও পরিপূর্ণ হয় এবং থামাতে সার্ভারটি পিষে।

এটা অস্পষ্ট। "ঘুম" মোডে 800 ব্যবহারকারী সিস্টেমে কার্যত শূন্য প্রভাব ফেলে। 800 সক্রিয় থ্রেড একটি বিপর্যয় হবে be কতগুলি থ্রেড "চলমান"?

থ্রেডগুলি কি একে অপরকে অবরুদ্ধ করছে? ডেডলক ইত্যাদির জন্য কিছু সূত্র ইত্যাদির জন্য এনজিওন ইনোডব অবস্থা দেখুন See

ধীরে ধীরে কোন প্রশ্ন দেখা যাচ্ছে? আসুন তাদের অপ্টিমাইজ করা যাক।

আপনি কি সংস্করণ ব্যবহার করছেন? এক্সট্রাবিবি (ইনোডিবি-র একটি ড্রপ-ইন প্রতিস্থাপন) একাধিক কোর ব্যবহারের আরও ভাল কাজ করে। 5.6.7 একটি আরও ভাল কাজ করে।

ইনোডব_বফার_পুল_সামগ্রী - এটি 8 এ পরিবর্তন করুন (20 জি বাফার_পুল ধরে); এটি Mutex তর্ক কিছুটা পিছনে কাটা হবে।

আপনি কি আমি / হে আবদ্ধ বা আপনি সিপিইউ আবদ্ধ? সমাধানগুলি আপনার উত্তরের উপর নির্ভর করে মূলত আলাদা।

এসএসডি - সমস্ত লগ ফাইল নন-এসএসডি ড্রাইভে থাকলে এটি আরও ভাল।


6

আরও মেমরি সর্বদা ভাল, তবে আমার অভিজ্ঞতায় বেশিরভাগ সময় বাফার পুলের আকারটি আপনার ডেটার আকারের সাথে খাপ খায় না। অনেকগুলি সারণী বেশিরভাগ সময় নিষ্ক্রিয় থাকে, যেমন ব্যাকআপ টেবিলগুলি প্রায় পড়ে থাকে, সুতরাং ইনোনডাব বাফার পুলের আকারটি আপনাকে অ্যাক্টিভ ডেটার আকারের সাথে ফিট করে।

সক্রিয় পৃষ্ঠাগুলির জন্য আপনি যে সময়সীমাটি নির্দিষ্ট করেছেন তা কার্য সম্পাদনকে প্রভাবিত করে, তবে একটি অনুকূল পয়েন্ট রয়েছে, যেখানে আপনি বড় বাফার আকারের জন্য আরও বেশি পারফরম্যান্স পাবেন না। আপনি এটি দ্বারা অনুমান / গণনা / পরিমাপ করতে পারেনshow engine innodb status

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.