Jumlah Optimal dari Contoh MySQL InnoDB Buffer Pool

13

Karakteristik Server

  • Total sistem RAM: 8GB (menjalankan MySQL + hal lain selain MySQL di atasnya yaitu tidak didedikasikan untuk MySQL)
  • Jumlah Core CPU: 6
  • Saya memiliki data dalam db sebesar sekitar 2GB
  • Saya memiliki Ukuran Penyangga InnoDB yang diatur ke 4GB

Mana yang lebih baik:

  • Contoh Innodb Buffer Pool diatur ke 1?
  • Contoh Innodb Buffer Pool diatur ke 2 (masing-masing 2GB)?
  • Contoh Innodb Buffer Pool diatur ke 4 (masing-masing 1GB)?
  • Contoh Innodb Buffer Pool diatur ke 8 (pengaturan default)

Jadi saya tidak yakin bagaimana alasannya ketika datang ke Buffer Pool Instances dan juga keseluruhan "menggunakan instance atau menderita OS Swap ketika memiliki Ukuran Pool Buffer InnoDB yang besar".

Adergaard
sumber
Di mana Anda mendapatkan "gunakan instance atau menderita OS Swap ketika memiliki Ukuran Pool Buffer InnoDB yang besar"?
Rick James
70% RAM untuk buffer_pool total setelah mengurangi ruang untuk "hal-hal lain selain MySQL" harus baik-baik saja, terlepas dari jumlah instance.
Rick James
Saya tidak dapat menetapkan jawaban apa pun yang diterima sejauh saya menganggap semua itu "ditembak dari pinggul". Jika ada yang bertanya-tanya, saya menggunakan ukuran buffer pool 4G dan 2 instance dan ini bekerja sangat baik pada Debian 8.1 dengan 8G total memori yang menjalankan php-fpm + nginx pada mesin yang sama dengan kira-kira mysql berjalan pada rata-rata 60 pertanyaan / detik.
Adergaard

Jawaban:

7

Ketika saya kembali ke MySQL 5.5, saya akan memikirkan hal yang sama.

Apa yang saya pelajari selama bertahun-tahun adalah sebagai berikut: Jika Buffer Pool lebih besar dari setengah RAM yang terpasang dan innodb_buffer_pool_instances adalah 1 (default untuk 5.5), ancaman bertukar selalu dekat.

Saya membahas ini sebelumnya: Apakah ada aturan praktis mengenai ukuran dan jumlah instance buffer pool? . Dalam posting itu, saya menyebutkan contoh klien yang memiliki RAM 192GB di server dengan Penyangga Pool 162GB. Ketika innodb_buffer_pool_inances berumur 1, bertukar terjadi. Ketika saya mengatur innodb_buffer_pool_inances ke 2, segalanya menjadi jauh lebih baik.

Dalam kasus Anda, karena Kelompok Penyangga tepat setengah, nilai 1 mungkin OK. Saya tidak akan kebetulan. Saya akan mengaturnya menjadi 2.

Karena MySQL 5.6 memiliki default 8, Anda tidak perlu memikirkannya lagi.

Saya akan mengatakan ini: jawaban akuzminsky memiliki prinsip tertinggi . Jawaban saya hanya menembak dari pinggul berdasarkan pengalaman masa lalu (baik dan buruk).

RolandoMySQLDBA
sumber
Tidak mungkin! Swapping tergantung pada jumlah memori yang dialokasikan, bukan pada instance pool.
Rick James
Baik untuk mengetahui default adalah 8 ... Tapi apa bedanya jika dipotong menjadi 4 atau meningkat menjadi 16? Apakah ada memori / penalti penyimpanan atau manfaat? Satu-satunya alasan saya di sini benar-benar, mysqltuner merekomendasikan innodb_buffer_pool_instances (= 1) tetapi saya tidak selalu mempercayai rekomendasinya. Memang, saya tidak punya masalah, hanya ingin tahu.
PJ Brunet
@ PJBrunet jika buffer pool InnoDB kurang dari setengah RAM, maka instance buffer pool InnoDB dapat dibiarkan pada 1.
RolandoMySQLDBA
6

Jumlah instance buffer pool harus ditingkatkan untuk menghindari pertikaian mutex pool buffer.

Dengan ukuran buffer pool 8GB saya ragu Anda akan melihat pertentangan mutex pool buffer.

PEMBARUAN 0 :

Saya menyebutkan buffer pool 8Gb dalam jawaban sementara dalam pertanyaan awal total memori adalah 8GB. Tentu, buffer pool harus kurang dari 8GB. 4GB terdengar seperti awal yang baik tetapi pastikan tidak terjadi pertukaran.

PEMBARUAN 1 :

// dari slide Yasufumi (dalam versi MySQL terbaru, output mungkin sedikit berbeda)

Untuk menentukan apakah ada pertikaian pada pool kumpulan mutex, kumpulkan selusin SHOW ENGINE INNODB STATUSsampel selama waktu puncak.

Kemudian agregat menggunakan snippet shell:

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

yang memberikan output seperti ini:

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

Jika Anda melihat jumlah tinggi mutex pool penyangga menunggu, maka inilah saatnya untuk mempertimbangkan beberapa instance pool penyangga. Perselisihan tidak mungkin terjadi pada buffer pool yang lebih kecil dari ~ 48G.

akuzminsky
sumber
1
Tetapi tidak memiliki buffer_pool 8G hanya dalam 8GB RAM!
Rick James
Pada apa dbsize yaitu ukuran kolam buffer innodb akan Anda mulai berpikir tentang contoh itu? Saya menafsirkan jawaban Anda bahwa pada tingkat yang relatif kecil ini , tidak ada alasan untuk memiliki lebih dari satu. Benar? Anda punya sumber tentang ini? Dokumentasi MySQL mengatakan "multi gigabyte" yang - bagi saya - adalah cara yang sangat kabur untuk mengekspresikan sesuatu. Sebenarnya, 2 GB adalah multi tetapi saya pikir mereka merujuk pada dataset yang lebih besar dari itu ...
Adergaard
2

Set "swappiness" ke 1 jika OS Anda memiliki itu. Masalahnya mungkin OOM terlalu agresif.

Rick James
sumber
0

Saya akan menyarankan pengaturan ini agar sesuai dengan jumlah maksimum utas MySQL yang ingin Anda jalankan secara bersamaan. Saya menggunakan jumlah core.

Saya juga mengatur innodb_read_io_threadsdan innodb_write_io_threadsmencocokkan nomor ini.

Jika innodb_buffer_pool_instancesterlalu rendah, utas Anda kemungkinan akan terjebak dalam menunggu semafor. Ini membuat CPU dan I / O tampak idle, meskipun sistem harus sibuk - dan latensi aplikasi Anda akan meningkat.

Menandai
sumber