Saya memiliki database sibuk dengan tabel InnoDB semata-mata yang berukuran sekitar 5GB. Basis data berjalan pada server Debian menggunakan disk SSD dan saya telah mengatur koneksi maks = 800 yang kadang-kadang menjenuhkan dan menggiling server untuk berhenti. Permintaan rata-rata per detik adalah sekitar 2,5 ribu. Jadi saya perlu mengoptimalkan penggunaan memori untuk memberikan ruang bagi koneksi maksimum yang mungkin.
Saya telah melihat saran bahwa innodb_buffer_pool_size seharusnya hingga% 80 dari total memori. Di sisi lain saya mendapatkan peringatan ini dari skrip tuning-primer:
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
Berikut adalah variabel innodb saya saat ini:
| 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 |
Catatan tambahan yang mungkin relevan: Saya melihat bahwa ketika saya mencoba memasukkan posting besar (katakanlah lebih dari 10KB) dari Drupal (yang duduk di server web terpisah) ke basis data, ia akan bertahan selamanya dan halaman tidak kembali dengan benar.
Mengenai ini, saya bertanya-tanya apa yang seharusnya menjadi innodb_buffer_pool_size saya untuk kinerja yang optimal. Saya menghargai saran Anda untuk mengatur ini dan parameter lain secara optimal untuk skenario ini.
SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...
menghasilkan kesalahan berikut pada MySQL 5.7: " Fitur 'INFORMATION_SCHEMA.GLOBAL_STATUS' dinonaktifkan; lihat dokumentasi untuk 'show_compatibility_56' ". Apakah Anda memiliki versi yang diperbarui?Sesuatu seperti ini? Menggunakan
SHOW VARIABLES
danSHOW GLOBAL STATUS
:Ekspresi:
innodb_buffer_pool_size / _ram
Artinya: % dari RAM yang digunakan untuk InnoDB buffer_pool
Kisaran yang disarankan: 60 ~ 80%
Ekspresi:
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Arti: Baca permintaan yang harus mencapai disk
Kisaran yang disarankan: 0-2%
Apa yang harus dilakukan jika di luar jangkauan: Tingkatkan innodb_buffer_pool_size jika Anda memiliki cukup RAM
Ekspresi:
Innodb_pages_read / Innodb_buffer_pool_read_requests
Artinya: Baca permintaan yang harus mencapai disk
Kisaran yang disarankan: 0-2%
Apa yang harus dilakukan jika di luar kisaran: Tingkatkan innodb_buffer_pool_size jika Anda memiliki RAM yang cukup.
Ekspresi:
Innodb_pages_written / Innodb_buffer_pool_write_requests
Artinya: Menulis permintaan yang harus mencapai disk
Kisaran yang disarankan: 0-15%
Apa yang harus dilakukan jika di luar kisaran: Periksa innodb_buffer_pool_size
Ekspresi:
Innodb_buffer_pool_reads / Uptime
Artinya: Baca
Rentang yang disarankan: 0-100 / dtk.
Apa yang harus dilakukan jika di luar jangkauan: Tambah innodb_buffer_pool_size?
Ekspresi:
(Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
Artinya: InnoDB I / O
Kisaran yang disarankan: 0-100 / dtk.
Apa yang harus dilakukan jika di luar jangkauan: Tambah innodb_buffer_pool_size?
Ekspresi:
Innodb_buffer_pool_pages_flushed / Uptime
Artinya: Menulis (flushes)
Kisaran yang disarankan: 0-100 / dtk.
Apa yang harus dilakukan jika di luar jangkauan: Tambah innodb_buffer_pool_size?
Ekspresi:
Innodb_buffer_pool_wait_free / Uptime
Artinya: Counter untuk ketika tidak ada halaman gratis di buffer_pool. Artinya, semua halaman itu kotor.
Kisaran yang disarankan: 0-1 / dtk.
Apa yang harus dilakukan jika di luar jangkauan: Pertama-tama pastikan innodb_buffer_pool_size disetel secara wajar; jika masih bermasalah, kurangi innodb_max_dirty_pages_pct
sumber
innodb_buffer_pool_size
Nilai apa yang ditentukan? Ukuran aktual atau yang dikonfigurasi?innodb_buffer_pool_size
menunjukkan ukuran maksimal. Dalam server tipikal, "kolam penyangga" mulai kecil, tetapi dengan cepat tumbuh dengan ukuran maksimal dan tetap di sana. Catatan: Jika itu lebih besar dari RAM (atau bahkan dekat), maka itu mengarah ke swapping, yang mengerikan untuk kinerja.Judul Anda menanyakan tentang innodb_buffer_pool_size, tapi saya kira itu bukan masalah sebenarnya. (Rolando mengomentari mengapa Anda menetapkannya cukup besar, bahkan terlalu besar.)
Itu tidak jelas. 800 pengguna dalam mode "Tidur" hampir tidak memiliki dampak pada sistem. 800 utas aktif akan menjadi bencana. Berapa banyak utas yang "berjalan"?
Apakah utas saling menghalangi? Lihat SHOW ENGINE INNODB STATUS untuk beberapa petunjuk tentang deadlock, dll.
Apakah ada pertanyaan yang muncul di slowlog? Mari kita optimalkan.
Versi apa yang Anda gunakan? XtraDB (pengganti drop-in untuk InnoDB) melakukan pekerjaan yang lebih baik dalam menggunakan beberapa core. 5.6.7 melakukan pekerjaan yang lebih baik.
innodb_buffer_pool_instances - ubah ini menjadi 8 (dengan asumsi 20G buffer_pool); itu akan mengurangi sedikit pada pertikaian Mutex.
Apakah Anda I / O terikat atau apakah Anda terikat CPU? Solusinya sangat berbeda, tergantung pada jawaban Anda.
SSD - Mungkin lebih baik jika semua file log berada di drive non-SSD.
sumber
Lebih banyak memori selalu lebih baik, tetapi dalam pengalaman saya sebagian besar ukuran buffer pool seharusnya tidak sesuai dengan ukuran data Anda. Banyak tabel tidak aktif sebagian besar waktu, seperti tabel cadangan tergeletak di sekitar, jadi ukuran kolam penyangga innodb lebih cocok untuk Anda ukuran data acive.
Kerangka waktu yang Anda tentukan untuk halaman aktif memengaruhi kinerja, tetapi ada titik optimal, di mana Anda tidak akan mendapatkan lebih banyak kinerja untuk ukuran buffer yang lebih besar. Anda dapat memperkirakan / menghitung / mengukurnya dengan
show engine innodb status
sumber