Memahami statistik kolam buffer INNODB

20

Setelah membaca halaman ini di dokumentasi mysql , saya mencoba memahami penggunaan InnoDB kami saat ini. Saat ini, kami mengalokasikan 6GB RAM untuk buffer pool. Ukuran basis data kami hampir sama. Inilah output dari show engine innodb status\G(kami menjalankan v5.5)

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

Saya ingin tahu seberapa baik kami menggunakan cache buffer. Setelah awalnya melirik output, tampaknya kita memang menggunakannya, berdasarkan dari Pages made youngdan not youngmemiliki angka di dalamnya dan Buffer pool hit rate is 1000 / 10000(yang saya lihat di tempat lain di web bahwa ini berarti sedang digunakan cukup banyak. Benar?)

Apa yang melempar saya melalui loop adalah mengapa young-making ratedan notkeduanya pada 0/1000 dan young/sdan non-young/sakses keduanya pada 0. Itu semua akan menunjukkan bahwa itu tidak digunakan sama sekali, kan?

Adakah yang bisa membantu memahami ini?

Safado
sumber

Jawaban:

18
 Buffer pool hit rate is 1000 / 1000

Ini adalah satu - satunya nilai yang sangat berarti dalam situasi yang Anda alami ... dan situasi itu adalah Anda cukup beruntung memiliki buffer pool dengan hit rate 100% sempurna. Jangan terlalu banyak menganalisis sisanya, karena tidak ada yang perlu Anda ubah, kecuali server OS kehabisan memori, menyebabkan pertukaran.

Nilai young / not young tidak menarik dalam kasus di mana tidak ada tekanan pada pool buffer. InnoDB sedang menggunakannya, tidak bisa apa-apa tanpanya. Jika kolam terlalu kecil, halaman digusur dan halaman baru dibaca dan statistik lain membantu Anda memahami itu ... tapi itu masalah yang tampaknya tidak Anda miliki.

Ruang "tidak terpakai" gratis di kolam renang tidak akan pernah diabaikan atau dibiarkan menganggur oleh InnoDB jika diperlukan untuk alasan apa pun, jadi fakta bahwa itu gratis berarti hanya Anda memiliki ruang bernapas untuk diperluas sesuai dengan ukuran pekerjaan Anda dataset tumbuh.

Itu semua artinya, kecuali, tentu saja, Anda baru saja me-restart server, dalam hal ini, itu tidak lengkap .. Server perlu dijalankan melalui periode penuh penggunaan "normal" (termasuk backup penuh) sebelum statistik menceritakan seluruh cerita ... apakah itu satu jam, sehari, minggu, bulan, atau tahun, tergantung pada aplikasi Anda.

Michael - sqlbot
sumber
28

The Buffer pool size 393215 Ini di halaman bukan byte.

Untuk melihat ukuran Buffer Pool di GB jalankan ini:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 Ini adalah jumlah halaman dengan data di dalam Buffer Pool

Untuk melihat jumlah data dalam ukuran Buffer Pool di GB jalankan ini:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages 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;

Untuk melihat persentase Buffer Pool yang digunakan, jalankan ini:

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300Ini adalah jumlah halaman dalam Buffer Pool yang harus ditulis kembali ke database. Mereka juga disebut sebagai halaman kotor.

Untuk melihat Space Diambil oleh Dirty Pages, jalankan ini:

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Untuk melihat Persentase Halaman Kotor, jalankan ini:

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Adapun hal-hal lain di layar, jalankan ini:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

Anda akan melihat semua variabel status untuk Kelompok Penyangga. Anda dapat menerapkan pertanyaan yang sama terhadap apa pun yang perlu Anda periksa.

RolandoMySQLDBA
sumber
Terima kasih! Jadi dari sini, saya mengetahui bahwa cache buffer kita memang sedang digunakan, tetapi yang ingin saya ketahui adalah apakah kita secara EFEKTIF menggunakannya. Jika saya memahami konsep halaman muda dan lama, dugaan saya adalah indikator yang baik bahwa cache buffer digunakan secara maksimal adalah jumlah halaman yang dibuat muda dan diakses ke halaman muda, benar? Kami menggunakan mysqldump untuk melakukan pencadangan setiap 3 jam, yang akan menjelaskan mengapa itu penuh. Tetapi dengan young-making rate 0 / 1000dan 0.00 youngs/s, itu memberitahu kita bahwa kita tidak benar-benar memanfaatkannya. Apakah saya membaca ini?
Safado
2
Tingkat pembuatan muda dari 0/1000 memberi tahu Anda bahwa dari halaman data untuk kueri yang Anda jalankan tidak hanya cocok dengan cache, mereka masuk ke dalam ukuran yang lebih kecil (3/8) dari cache muda. Artinya, kueri tidak menggunakan data yang cukup untuk menua beberapa halaman ke dalam cache tidak muda yang besar.
Thomas Jones-Low
Penjelasan singkat tentang variabel status innodb_buffer_pool yang tersisa akan sangat berguna. Bisakah Anda menambahkannya ke jawaban Anda
vidyadhar
5

Saya tidak akan setuju dengan penilaian bahwa "Anda cukup beruntung memiliki buffer pool dengan hit rate 100% sempurna"

Di bagian atas output (yang dipotong), adalah garis seperti:

Per second averages calculated from the last 16 seconds

Ini mengatakan kepada saya bahwa tidak ada pembacaan yang terjadi dalam 16 detik terakhir, dengan demikian (secara artifisial) memberi Anda skor '1000/1000' yang sempurna.

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

Sementara itu ada beberapa yang menulis. Ini mungkin merupakan penulisan yang ditangguhkan untuk membersihkan halaman 'kotor' atau membersihkan indeks dari 'ubah buffer'.

Mungkin tidak ada aktivitas di area muda / panas dalam 16 detik terakhir.

Rick James
sumber
Yah, kami rata-rata antara 6k-10k SELECT per detik dan pada saat yang sama saya dapat melihat hampir 0 aktivitas membaca disk di server, jadi saya tidak berpikir ini masalahnya
Safado
Apakah "Query cache" memuaskan sebagian besar permintaan? SHOW VARIABLES LIKE 'query%';dan SHOW GLOBAL STATUS LIKE 'Qc%';dan SHOW GLOBAL VARIABLES LIKE 'Com_SELECT';.
Rick James
0

Kumpulan buffer dibagi menjadi dua bagian, daftar muda dan daftar tidak-muda. Laju pembuatan menunjukkan berapa banyak halaman dalam kumpulan buffer yang dikocok antara dua daftar.

Halaman yang dibuat muda bukanlah halaman yang dibuat muda (yaitu dibaca dari cache. Halaman yang dibuat tidak muda adalah halaman yang dipindahkan dari daftar muda karena terlalu tua, atau karena daftar muda penuh.

Tingkat halaman dipindahkan antara keduanya tergantung pada seberapa banyak kolam buffer saat ini digunakan vs ukuran kolam muda. Setel pada nol berarti set aktif Anda (halaman yang Anda gunakan) lebih kecil dari kumpulan muda.

Thomas Jones-Low
sumber