Nilai thread_cache_size apa yang harus saya gunakan?

25

Saya menggunakan Asp.Net bersama dengan MySQL. Dalam string koneksi .Net, saya telah menetapkan Max Pool Size ke 150.

Jika saya menjalankan yang berikut ini, saya mendapatkan nilai-nilai ini:

SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474

Yang memberi Threads_created / Connections = 0,1392.

Maka dari itu sepertinya saya perlu meningkatkan thread_cache_size.

Tetapi jika saya menjalankan SHOW PROCESSLISTsaya selalu melihat bahwa saya memiliki banyak koneksi terbuka (kebanyakan dari mereka tidur) karena kolam dibuat oleh .Net. Apakah saya masih perlu mengatur thread_cache_sizekarena saya masih akan menggunakan kembali koneksi dari kumpulan koneksi? Jika Ukuran Kolam adalah 150, apakah menurut Anda nilai yang baik adalah thread_cache_size150+? Apakah ini mempengaruhi CPU dan memori banyak?

Martin
sumber

Jawaban:

43

Berdasarkan info di Dokumentasi MySQL, Anda harus melakukan yang berikut: Cari tahu berapa jumlah koneksi simultan mysqld yang pernah menggunakan Koneksi , Threads_created , dan Max_used_connections ,

  • SHOW GLOBAL STATUS LIKE 'Connections';
  • SHOW GLOBAL STATUS LIKE 'Threads_created';
  • SHOW GLOBAL STATUS LIKE 'Max_used_connections';

Coba hitung yang berikut ini

Threads_created / Connections: Jika ini lebih dari 0,01, maka naikkan thread_cache_size. Paling tidak, thread_cache_sizeharus lebih besar dari Max_used_connections.

RolandoMySQLDBA
sumber
Terima kasih atas komentar Anda! Saya sedikit memperbarui pertanyaan saya.
Martin
Saya pikir Anda bermaksud mysql> SHOW STATUS GLOBAL SEPERTI 'koneksi'; (Anda telah menulis max_used_connections dua kali)
Alekc
1
Saya hanya ingin menambahkan itu dengan merujuk pada dev.mysql.com/doc/refman/5.7/en/… ini, Anda harus menambahkan 8 ke Max_used_connections untuk nilai thread_cache_size (tanpa melebihi 100)
CME64
1
Sebenarnya, manual menyarankan default (1% dari mac_used_connections) + 8 .... atau 100 ... mana yang kurang.
Christopher McGowan
Bagi saya # adalah 264/103134 yang bekerja dengan 0,0026 yang jauh lebih kecil dari 0,01 Tapi MaxUsedConnections saya adalah 72, jadi kalimat terakhir sangat saling bertentangan
boatcoder
11

Menurut dokumen MySQL, Anda harus mengatur thread_cache_sizeagar sebagian besar koneksi baru menggunakan utas dari cache daripada utas yang baru dibuat. Ini menghemat beberapa overhead pembuatan thread, meskipun biasanya tidak membuat peningkatan kinerja yang signifikan:

Permintaan utas dipenuhi dengan menggunakan kembali utas yang diambil dari cache jika memungkinkan, dan hanya ketika cache kosong adalah utas baru dibuat. Variabel ini dapat ditingkatkan untuk meningkatkan kinerja jika Anda memiliki banyak koneksi baru. Biasanya, ini tidak memberikan peningkatan kinerja yang menonjol jika Anda memiliki implementasi utas yang baik. Namun, jika server Anda melihat ratusan koneksi per detik, Anda biasanya harus menetapkan thread_cache_size cukup tinggi sehingga sebagian besar koneksi baru menggunakan utas cache . (sumber)

Ini berarti bahwa Anda harus mengatur thread_cache_sizesehingga Threads_created / Connections(% koneksi yang mengarah ke pembuatan utas baru) agak rendah. Jika Anda menggunakan dokumen MySQL secara literal ("sebagian besar"), nilainya harus <50%. Jawaban RolandoMySQLDBA mengatakan <1%. Saya tidak tahu siapa yang lebih dekat dengan kebenaran.

Anda tidak boleh mengatur thread_cache_sizelebih tinggi dari Max_used_connections. Kalimat terakhir dalam jawaban RolandoMySQLDBA ("Paling tidak, thread_cache_size harus lebih besar daripada Max_used_connections") tampaknya tidak masuk akal karena dikatakan bahwa Anda harus menyimpan lebih banyak utas di dalam cache daripada yang pernah digunakan oleh server Anda . MySQL tidak akan pernah memasukkan begitu banyak utas ke dalam cache - ia tidak secara pre-emptif memasukkan utas dalam cache - itu hanya menempatkannya di sana setelah klien membuat utas dan terputus. Jika Anda tidak pernah memiliki klien X yang terhubung pada saat yang sama, Anda tidak akan pernah memiliki utas X dalam cache:

Ketika klien terputus, utas klien dimasukkan ke dalam cache jika ada lebih sedikit dari utas thread_cache_size di sana. (sumber)

Lihat juga jawaban ini oleh Michael:

Mengatur thread_cache_size ke nilai yang lebih besar dari max_connections sepertinya saran yang sangat tidak membantu ... cache tidak mungkin tumbuh lebih besar dari max_connections dan bahkan cache di mana saja dekat dengan ukuran itu hanya bisa masuk akal jika Anda memiliki jumlah churn yang luar biasa pada utas Anda ... yang, dalam aplikasi yang berperilaku baik, tidak akan menjadi masalah.

/dba//a/28701

Tomasz P. Szynalski
sumber
aku pikir begitu! setelah saya menguji konfigurasi ini, "thread_cache_size harus lebih besar daripada Max_used_connections" tidak membantu.
CK.Nguyen
-2

Pada hari kerja umum, apakah 'karyawan baru' mungkin membutuhkan koneksi? Kebanyakan penyihir tidak akan tahu berapa banyak orang yang bisa dipekerjakan dalam beberapa hari ke depan. V 8 dari MySQL menyarankan CAP thread_cache_size pada 100 untuk mencegah kelebihan beban terlepas dari max_used_connections. Bagi saya, 100 adalah CAP yang baik.

Silakan lihat tautan ini.

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size
Wilson Hauck
sumber