Pengaturan cache MySQL terbaik untuk 8 GB RAM yang didedikasikan server MySQL hanya menggunakan InnoDB (basis data 5gb)

20

Saya noob yang cukup besar dalam hal pengaturan MySQL untuk kinerja. Dan jujur ​​saya tidak khawatir tentang fine tuning untuk memeras setiap bit terakhir kinerja dari MySQL, tapi saya tahu bahwa hal yang paling penting untuk dilakukan yang memberikan beberapa hasil terbaik adalah menyiapkan cache / buffer dengan benar.

Saya sudah mencoba untuk menjaga hal-hal sederhana dengan hanya menggunakan InnoDB sebagai mesin penyimpanan. Dan saya punya server khusus untuk MySQL. Ini memiliki 8gb RAM, bagaimana saya harus mengalokasikan itu untuk memaksimalkan kinerja? Saya ingin dapat memasukkan seluruh database saya ke dalam memori untuk kinerja terbaik. Basis datanya sekitar 5gb. Apakah ini mungkin?

Berapa banyak memori yang harus saya alokasikan ke cache kueri? Berapa banyak ke kolam penyangga InnoDB? Berapa banyak untuk sisa komputer (mis. Proses non MySQL terkait)? Dll

Karena saya tidak menggunakan MyISAM, saya tidak perlu menaruh banyak memori di cache kunci, benar?

billmalarky
sumber

Jawaban:

25

Ini sulit tanpa mengetahui banyak tentang database itu sendiri. Ada beberapa alat yang harus Anda waspadai;

Tentang menyimpan seluruh database dalam memori; Setiap kueri yang melakukan perubahan pada basis data akan tetap terbuka sampai penulisan dilakukan pada disk. Satu-satunya hal yang dapat menghindari disk menjadi hambatan, adalah disk-controller dengan cache tulis.

Saya akan mulai dengan perubahan berikut dari default:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Lalu saya akan melihat bagaimana keadaannya, dan mencoba hal-hal yang berbeda berdasarkan (antara lain) output dari alat yang disebutkan di atas. Saya juga akan memastikan untuk membuat grafik tren dengan alat pemantauan, seperti Munin atau Cacti , untuk melihat beban kerja seperti apa yang sebenarnya saya hadapi. Secara pribadi, saya memiliki pengalaman hebat dengan plugin MySQL yang disediakan dengan Munin.

Kvisle
sumber
Terima kasih saya akan mencoba ini dan melihat apakah saya dapat mempelajari sesuatu yang baru.
billmalarky
@ billmalarky Selamat datang di serverfault! :) Ingatlah untuk menghapus atau menandai pertanyaan sebagai benar, jika Anda puas dengan jawaban yang Anda dapatkan.
Kvisle
+1 untuk merekomendasikan mysqltuner.pl !!!
RolandoMySQLDBA
@Kvisle Terima kasih atas sambutannya! Saya sudah sekitar stackoverflow untuk sementara waktu (well ... beberapa bulan yang ...) tapi saya baru mengenal serverfault. Saya benar-benar host dengan voxel.net dan hosting mereka (dukungan sistem IE) sangat bagus tapi saya pikir akan lebih tepat untuk mencari tampilan luar juga jadi saya tidak terdengar seperti alat yang lengkap ketika berbicara dengan mereka tentang hal ini.
billmalarky
1
@ Kvisle Juga, saya akan menandai jawaban yang benar tetapi saya ingin ini rebusan sebentar untuk mendapatkan curah pendapat yang baik.
billmalarky
9

IMHO Anda harus dapat pergi dengan

innodb_buffer_pool_size=5G

Itu akan menjadi 62,5% RAM dengan jumlah RAM yang cukup untuk Server OS plus memori untuk Koneksi DB

@kvisle direkomendasikan menggunakan mysqltuner.pl. Skrip itu sangat bagus untuk menilai jumlah RAM yang didedikasikan untuk join_buffer_size, sort_buffer_size, read_buffer_size, dan read_rnd_buffer_size. Keempat buffer yang ditambahkan bersama-sama dikalikan dengan max_connections. Jawaban itu ditambahkan ke buffer statis (innodb_buffer_pool_size + key_buffer_size). Jumlah gabungan dilaporkan. Jika jumlah gabungan itu melebihi 80% RAM, saat itulah Anda harus menurunkan ukuran buffer tersebut. mysqltuner.pl akan sangat membantu dalam hal ini.

Karena semua data Anda adalah InnoDB, Anda dapat membuat key_buffer_size (buffer cache kunci untuk indeks MyISAM) sangat rendah (saya sarankan 64M).

Berikut adalah posting yang saya buat di DBA StackExchange untuk menghitung ukuran yang direkomendasikan dari innodb_buffer_pool_size .

UPDATE 2011-10-15 19:55 EDT

Jika Anda tahu Anda akan memiliki data 5GB, maka rekomendasi pertama saya adalah OKE. Namun, saya lupa menambahkan satu hal:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

Ukuran file log harus 25% dari Pool Buffer InnoDB

UPDATE 2011-10-16 13:36 EDT

Aturan 25% didasarkan pada penggunaan dua file log. Meskipun dimungkinkan untuk menggunakan beberapa file log innodb, dua biasanya bekerja paling baik.

Lainnya menyatakan menggunakan 25%

Namun, dalam semua kewajaran, seseorang dari perusahaan InnoBase Oy yang asli menyatakan tidak menggunakan aturan 25% karena memiliki InnoDB Buffers Pool yang lebih besar .

Secara alami, aturan 25% tidak dapat berfungsi ketika memiliki jumlah RAM yang besar. Bahkan, innodb_log_file_size terbesar yang diizinkan hanya menggunakan 2 file log adalah 2047M, karena ukuran gabungan file log harus kurang dari 4G (4096M)

CASE IN POINT: Salah satu klien majikan saya memiliki server DB dengan RAM 192GB. Tidak ada cara untuk memiliki file log 48G. Saya simlpy menggunakan ukuran file maks untuk file log innodb, 2047M. Komentar @ Kvisle pada jawaban saya hanya memberikan tautan yang menyatakan Anda tidak perlu membatasi diri pada dua file log. Jika Anda memiliki file log N, mereka tidak dapat total 4G. Aturan 25% saya hanya di dunia yang sempurna (DB Server dengan 8GB atau kurang).

RolandoMySQLDBA
sumber
Terima kasih, saya pasti akan menggunakan mysqltuner.pl. Namun, saya harus bertanya, apakah skrip itu masih akurat jika database saya kosong sekarang? Saya sudah mengatur semua tabel dan skema dengan benar, tetapi tidak ada data aktual. Saya menggunakan 5GB sebagai ukuran contoh yang akan saya gunakan pada dedicated server saya saat ini (yaitu, setelah DB mendapat lebih besar dari itu saya mungkin akan beralih ke dedicated server yang lebih baik). Saat ini database kosong (ini adalah situs baru yang belum diluncurkan) tapi saya ingin menyetel mysql untuk menangani penskalaan dengan baik sebelum peluncuran.
billmalarky
Diperbarui jawaban saya !!!
RolandoMySQLDBA
Saya ingin mengomentari "Harus 25% dari InnoDB Buffer Pool". Karena itu tidak 100% benar. Baca dev.mysql.com/doc/refman/5.0/en/… untuk jawaban yang lebih terperinci. Dari segi kinerja, sangat membantu untuk meningkatkan ukuran sedikit dari standar, tetapi Anda tidak perlu memaksimalkannya.
Kvisle
Rolando, terima kasih atas bantuannya. Saya telah menandai utas ini sebagai referensi. Juga, saya menggunakan skrip mysqltuner sekarang.
billmalarky