Mengapa utas MySQL sering menunjukkan status "membebaskan item" ketika cache kueri dinonaktifkan?

16

Ketika saya menjalankan SHOW PROCESSLIST, sering ada sejumlah besar utas INSERT / UPDATE dalam keadaan "membebaskan item".

Manual MySQL menyarankan bahwa setidaknya sebagian alasan utas berada dalam status ini melibatkan cache kueri - mungkin ini akan membatalkan permintaan cached karena data yang diubah.

Namun, saya query_cache_sizediatur ke 0 yang harus menonaktifkan cache permintaan sama sekali.

Apa alasan lain mengapa ada begitu banyak utas di negara ini?

Tabel yang relevan menggunakan mesin penyimpanan InnoDB.

Dan Grossman
sumber

Jawaban:

7

Periksa nilai innodb_thread_concurrency.

Untuk sistem saya meningkatkan nilai dari 8 menjadi 32, menurut pedoman dalam dokumentasi MySql , menyebabkan penurunan jumlah utas yang secara bersamaan melaporkan kondisi "item yang dibebaskan". Juga, waktu permintaan rata-rata yang dihabiskan turun dengan urutan besarnya.

Meskipun ini membuat perbedaan besar dalam kinerja server secara keseluruhan, itu bukan peluru perak "membebaskan item". Ekosistem perangkat keras saya membuat saya berhipotesis bahwa keadaan ini sebagian besar terlihat pada sistem dengan disk "lambat" (serangan disk 2x10k 1), dan kurang lazim pada sistem dengan penyimpanan yang lebih cepat (disk drive 12x15k disk serangan 10). Jadi, pemeriksaan kinerja disk juga dapat dilakukan.

Semoga berhasil!

Juga:

Perlu dicatat bahwa nilai default dari innodb_thread_concurrency sangat berbeda tergantung pada rilis 5.0 poin apa yang sedang digunakan.

Nilai default telah berubah beberapa kali: 8 sebelum MySQL 5.0.8, 20 (tak terbatas) dari 5.0.8 hingga 5.0.18, 0 (tak terbatas) dari 5.0.19 hingga 5.0.20, dan 8 (terbatas) dari 5.0.21 di. - sumber

Ini berarti bahwa peningkatan yang tampaknya tidak berbahaya dari 5.0.20 ke 5.0.21 mengubah standar dari tak terbatas ke 8, dan membawa serta konsekuensi kinerja.

jphofmann
sumber
Punya masalah serupa seperti ini, dan itu langsung terkait dengan kecepatan hard disk yang lambat. Melakukan analisis kecepatan disk menunjukkan bahwa menulis dan membaca ke hard disk sangat lambat. Ini memiliki dampak pada MySQL, dan itulah sebabnya status "Membebaskan item" (dengan pertanyaan yang sama) muncul untuk waktu yang lama di daftar proses. Membunuh proses lain yang memperlambat kecepatan hard disk memperbaiki masalah.
Navigatron
5

Membebaskan item adalah tahap pelaksanaan kueri di mana struktur sementara, buffer, dll dideallocated. Beberapa pekerjaan cache query dilakukan pada tahap ini, tetapi itu bukan satu-satunya hal yang terjadi di sana. Saya akan menyarankan menggunakan PROFIL TAMPILKAN untuk melihat berapa lama tahap ini relatif dibandingkan dengan tahap lainnya, dan jika waktu yang dihabiskan berakhir menjadi masalah, pemecahan masalah dengan alat seperti profiler dan oprofile orang miskin.

Baron Schwartz
sumber
Terima kasih telah memusatkan perhatian pada 'item pembebasan' itu. Apakah ada dokumen spesifik yang merincinya, atau ini hanya latihan Google untuk saya?
RolandoMySQLDBA
Atau telusuri latihan kode sumber! :)
Derek Downey
3

Ada laporan bug tentang masalah ini tentang "membebaskan item" dan cache kueri . Meskipun bug sudah ditutup, tidak disebutkan tentang innodb_thread_concurrency .

Secara kebetulan, saya berbicara dengan Ronald Bradford di Percona Live NYC pada bulan Mei. Saya mengatakan kepadanya tentang situasi di mana saya tweeked innodb_thread_concurrency karena beberapa InnoDB Buffer Pool MySQL 5,5 menghasilkan banyak penguncian utas dan saya menduga bahwa data cache yang saya butuhkan kemungkinan besar telah menyebar di antara beberapa buffer pool.

Dia dengan jelas mengatakan kepada saya bahwa saya tidak boleh menetapkan nilai terhadap innodb_thread_concurrency. Biarkan selalu menjadi nilai default, yang sekarang nol (0). Dengan melakukannya, Anda membiarkan penyimpanan InnoDB memutuskan berapa banyak innodb_concurrency_tickets untuk dihasilkan sendiri. Inilah yang dilakukan konkurensi tak terbatas.

'Membebaskan item' kemungkinan besar terjadi lebih sering ketika kita memberlakukan batasan pada innodb_thread_concurrency. Itu harus selalu nol (0). Saya akan mengambil risiko dan meningkatkan innodb_concurrency_tickets dan melihat apakah itu membantu atau tidak.

RolandoMySQLDBA
sumber
2

Kami memiliki masalah dengan gejala yang persis sama. Ternyata disk dengan file log InnoDB telah terisi. Layak diperiksa.

RedBlueThing
sumber
Anda membutuhkan file log yang jauh lebih besar. Bahkan, file log terbesar yang diizinkan dengan bawaan innodb_log_files_in_group (yaitu 2) adalah 2047M. Anda harus mematikan mysql, rm -f / var / lib / ib_logfile [01], membuat innodb_log_file_size = 2047M di /etc/my.cnf dan mulai mysql. Tentu saja, dapatkan disk yang lebih besar !!!
RolandoMySQLDBA
1

Petunjuk lain: Mungkin innodb fsync (). Coba pengaturan

innodb_flush_log_at_trx_commit = 2

Di my.cnf

Logfile innodb kemudian dibilas ke disk setiap 1-2 detik, alih-alih ob pada setiap commit. Hukuman yang sedikit terhadap integritas data, keuntungan besar dalam kecepatan.

sto
sumber