Secara default, MySQL membuat satu thread khusus per sesi. Dalam kondisi konkurensi tinggi, hal ini menyebabkan overhead penjadwalan thread yang berlebihan dan invalidasi cache yang sering terjadi, sehingga menurunkan performa. Fitur Thread Pool memisahkan thread dari sesi sehingga beberapa sesi dapat berbagi kolam thread yang lebih kecil, menjaga overhead penjadwalan tetap rendah dan tingkat hit cache tetap tinggi. Fitur ini bekerja paling optimal untuk beban kerja OLTP dengan query singkat yang dibatasi oleh CPU serta jumlah koneksi bersamaan yang tinggi.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Sebuah instans RDS yang menjalankan MySQL 5.6, 5.7, atau 8.0
Cara kerja
Kolam thread mengatasi bottleneck satu-thread-per-sesi melalui dua mekanisme:
Penjadwalan berbasis prioritas: Pernyataan SQL untuk manajemen data (penyiapan koneksi, pemantauan, perintah administratif) mendapatkan prioritas tinggi dan dijalankan sebelum query dengan prioritas lebih rendah. Query kompleks—yang mencakup subquery, fungsi agregat, atau klausa GROUP BY dan LIMIT—mendapatkan prioritas rendah sehingga tidak menghambat beban kerja lainnya.
Kontrol konkurensi: Thread dibagi ke dalam kelompok. Setiap kelompok membatasi jumlah thread aktif secara simultan, sehingga menjaga overhead penjadwalan dalam batas yang dapat dikelola dan mempertahankan efektivitas cache.
Kedua mekanisme ini secara bersama menjaga stabilitas database saat terjadi lonjakan koneksi bersamaan.
Konfigurasi thread pool
Konfigurasikan parameter thread pool di Konsol ApsaraDB for RDS. Untuk detail selengkapnya, lihat Modify the parameters of an ApsaraDB RDS for MySQL instance.
| Parameter | Default | Description |
|---|---|---|
thread_pool_enabled | ON | Mengaktifkan atau menonaktifkan thread pool. Nilai yang valid: ON, OFF. Parameter thread_handling yang sudah tidak digunakan lagi tidak memiliki efek apa pun. Mengaktifkan atau menonaktifkan parameter ini tidak memerlukan restart instans. |
thread_pool_size | 4 | Jumlah grup thread. Thread dalam kolam thread dibagi rata ke dalam grup dan dikelola berdasarkan grup tersebut. |
thread_pool_oversubscribe | 32 | Jumlah maksimum thread aktif per grup. Sebuah thread dianggap aktif selama mengeksekusi pernyataan SQL. Thread yang sedang menunggu I/O disk atau commit transaksi dianggap tidak aktif dan tidak dihitung terhadap batas ini. |
Pantau aktivitas thread pool
Jalankan perintah berikut untuk memeriksa status saat ini dari thread pool:
SHOW STATUS LIKE 'thread_pool%';Contoh output:
mysql> SHOW STATUS LIKE 'thread_pool%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| thread_pool_active_threads | 1 |
| thread_pool_big_threads | 0 |
| thread_pool_dml_threads | 0 |
| thread_pool_idle_threads | 19 |
| thread_pool_qry_threads | 0 |
| thread_pool_total_threads | 20 |
| thread_pool_trx_threads | 0 |
| thread_pool_wait_threads | 0 |
+----------------------------+-------+
8 rows in set (0.00 sec)| Variabel status | Description |
|---|---|
thread_pool_active_threads | Thread yang sedang mengeksekusi pernyataan SQL. |
thread_pool_big_threads | Thread yang mengeksekusi pernyataan SQL kompleks (yang mencakup subquery, fungsi agregat, atau klausa GROUP BY dan LIMIT). |
thread_pool_dml_threads | Thread yang mengeksekusi pernyataan bahasa manipulasi data (DML). |
thread_pool_idle_threads | Thread yang tidak memiliki tugas yang ditugaskan. |
thread_pool_qry_threads | Thread yang mengeksekusi pernyataan SQL sederhana. |
thread_pool_total_threads | Total thread dalam kolam. |
thread_pool_trx_threads | Thread yang mengeksekusi transaksi. |
thread_pool_wait_threads | Thread yang menunggu I/O disk atau menunggu transaksi untuk di-commit. |
Benchmark performa
Hasil pengujian SysBench berikut menunjukkan throughput dengan thread pool diaktifkan dibandingkan dinonaktifkan pada berbagai skenario sesi bersamaan. Thread pool secara konsisten memberikan throughput yang lebih tinggi seiring meningkatnya jumlah sesi bersamaan.




