Untuk mengoptimalkan kinerja PolarDB for MySQL, PolarDB menyediakan fitur kolam thread. Fitur ini memisahkan thread dari sesi dan menggunakan sekumpulan thread untuk mengeksekusi tugas-tugas di seluruh sesi aktif, alih-alih menetapkan satu thread per sesi.
Manfaat
Secara default, MySQL menggunakan mode eksklusif sesi untuk thread, di mana setiap sesi membuat thread eksklusif. Ketika banyak sesi aktif, terjadi persaingan sumber daya yang signifikan sehingga menurunkan kinerja. Volume tinggi penjadwalan thread dan invalidasi cache juga menyebabkan penurunan tajam dalam kinerja.
Kolam thread PolarDB menerapkan mekanisme prioritas dan kontrol konkurensi untuk berbagai jenis operasi SQL serta menjaga jumlah koneksi mendekati jumlah optimal. Hal ini memungkinkan database PolarDB mempertahankan kinerja tinggi dalam kondisi koneksi dan konkurensi tinggi. Manfaat kolam thread adalah sebagai berikut:
Ketika banyak thread berjalan secara konkuren, kolam thread secara otomatis menyesuaikan jumlah thread konkuren ke rentang optimal, sehingga menghindari penjadwalan thread yang berlebihan dan invalidasi cache yang sering terjadi.
Ketika banyak transaksi berjalan secara konkuren, kolam thread memberikan prioritas berbeda pada pernyataan dan transaksi, serta mengontrol secara terpisah konkurensi pernyataan dan transaksi untuk mengurangi persaingan sumber daya.
Kolam thread memberikan prioritas lebih tinggi pada pernyataan SQL terkait administrasi agar dieksekusi terlebih dahulu, sehingga memastikan operasi seperti pembuatan koneksi baru, manajemen, dan pemantauan tetap stabil meskipun beban sistem tinggi.
Kolam thread memberikan prioritas relatif lebih rendah pada pernyataan SQL yang kompleks dan membatasi konkurensi maksimumnya, sehingga mencegah terlalu banyak pernyataan SQL kompleks menghabiskan sumber daya sistem dan membuat seluruh layanan database tidak tersedia.
Menggunakan kolam thread
Fitur kolam thread melibatkan parameter-parameter berikut. Anda dapat mengubahnya di konsol sesuai kebutuhan. Untuk informasi lebih lanjut, lihat Setel parameter kluster dan node.
Parameter kluster di PolarDB console menggunakan awalan loose_ untuk memastikan kompatibilitas dengan file konfigurasi MySQL. Untuk mengubah parameter ini di PolarDB console, pilih parameter dengan awalan loose_.
Parameter | Deskripsi |
loose_thread_pool_enabled | Menentukan apakah fitur kolam thread diaktifkan. Nilai yang valid:
Catatan
|
loose_thread_pool_size | Jumlah grup thread dalam kolam thread. Rentang nilai terkait dengan jumlah core CPU dari node primer dalam kluster. Rentang nilai: DBNodeClassCPU hingga DBNodeClassCPU × 10. Nilai default: DBNodeClassCPU × 2. Catatan
Contoh:
|
loose_thread_pool_high_prio_mode | Mode untuk antrian prioritas tinggi kolam thread. Nilai yang valid:
Catatan Lingkup:
|
loose_thread_pool_high_prio_tickets | Jumlah tiket untuk antrian prioritas tinggi. Rentang nilai: 0 hingga 4294967295. Nilai default: 4294967295. Catatan Lingkup:
|
loose_thread_pool_idle_timeout | Ambang batas waktu untuk melepas thread idle dalam kolam thread. Thread idle yang tidak melayani permintaan apa pun akan dilepas setelah waktu ini. Rentang nilai: 0 hingga 31536000. Nilai default: 60. Satuan: detik. Catatan Berlaku untuk:
|
loose_thread_pool_oversubscribe | Jumlah thread aktif yang diizinkan dalam setiap grup thread. Thread aktif adalah thread yang sedang mengeksekusi pernyataan SQL, tetapi tidak termasuk thread dalam dua situasi berikut:
Rentang nilai: 1 hingga 1000. Nilai default: 20. |
loose_thread_pool_stall_limit | Ambang batas waktu untuk menentukan bahwa kolam thread mengalami stall. Ketika kolam thread mengalami stall, sistem membuat thread baru untuk melayani pernyataan SQL. Rentang nilai: 1 hingga 18446744073709551615. Nilai default: 10. Satuan: milidetik. Catatan Untuk MySQL 5.6, nilai default adalah 30 milidetik. |
loose_bypass_thread_pool_ips | Menentukan alamat IP klien yang tidak dibatasi oleh kolam thread. Bahkan ketika kolam thread penuh, klien dengan alamat IP ini dapat mengeksekusi pernyataan SQL untuk operasi manajemen. Contoh: Catatan Versi yang berlaku: MySQL 8.0.1 dengan versi revisi 8.0.1.1.19 atau lebih baru. |
loose_bypass_thread_pool_check_ignore_proxy | Menentukan apakah alamat IP klien yang terhubung melalui proxy diabaikan saat memeriksa parameter
Catatan Versi yang berlaku: MySQL 8.0.1 dengan versi revisi 8.0.1.1.19 atau lebih baru. |
loose_thread_pool_high_priority_users | Menentukan akun database prioritas tinggi. Setelah dikonfigurasi, permintaan dari akun-akun ini ditempatkan di antrian prioritas tinggi kolam thread dan diproses terlebih dahulu. Contoh: Catatan
|
loose_thread_pool_mark_ddl_thread_timeout_sec | Menentukan ambang batas waktu habis untuk thread DDL dalam kolam thread. Setelah waktu ini, thread DDL ditandai sebagai timeout, dan sistem membuat thread baru untuk memproses permintaan. Rentang nilai: 0 hingga 864000. Nilai default: 600. Satuan: detik. Catatan Versi yang berlaku: MySQL 8.0.1 dengan versi revisi 8.0.1.1.19 atau lebih baru. |
loose_thread_pool_mark_ddl_thread_timeout_immediately | Menentukan apakah thread DDL segera ditandai sebagai timeout ketika kolam thread berada di bawah beban tinggi dan antrian prioritas rendah menumpuk. Jika thread DDL ditandai sebagai timeout, sistem membuat thread baru untuk memproses permintaan. Parameter ini cocok untuk skenario bisnis yang memerlukan operasi DDL batch secara sering. Nilai yang valid:
Catatan Versi yang berlaku: MySQL 8.0.1 dengan versi revisi 8.0.1.1.19 atau lebih baru. |
Memeriksa status kolam thread
Anda dapat menjalankan perintah berikut untuk memeriksa status kolam thread:
select * from information_schema.THREAD_POOL_STATUS;Output contoh berikut dikembalikan.
mysql> select * from information_schema.THREAD_POOL_STATUS;
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
| ID | THREAD_COUNT | ACTIVE_THREAD_COUNT | WAITING_THREAD_COUNT | DUMP_THREAD_COUNT | SLOW_THREAD_TIMEOUT_COUNT | CONNECTION_COUNT | LOW_QUEUE_COUNT | HIGH_QUEUE_COUNT |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
| 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 6 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 9 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 10 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 11 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 12 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 13 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 14 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 15 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 16 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 17 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 18 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 19 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 20 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 21 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 22 | 2 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 23 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 24 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 25 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 26 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 27 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 28 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 29 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 30 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 31 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 32 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 33 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 34 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 35 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 36 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 37 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 38 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 39 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 40 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 41 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 42 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 43 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 44 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 45 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 46 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 47 | 3 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 48 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 49 | 3 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 51 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 52 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 53 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 54 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 55 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 56 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 57 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 58 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 59 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 60 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 61 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 62 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 63 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
64 rows in set (0.00 sec)Parameter-parameter tersebut dijelaskan sebagai berikut.
Parameter | Deskripsi |
ID | ID grup thread. |
THREAD_COUNT | Jumlah thread dalam grup thread. |
ACTIVE_THREAD_COUNT | Jumlah thread aktif dalam grup thread. |
WAITING_THREAD_COUNT | Jumlah thread dalam grup thread yang sedang menunggu I/O disk atau komitmen transaksi. |
DUMP_THREAD_COUNT | Jumlah koneksi persisten kelas DUMP dalam grup thread. |
SLOW_THREAD_TIMEOUT_COUNT | Jumlah thread dalam grup thread yang ditandai sebagai timeout. |
CONNECTION_COUNT | Jumlah koneksi pengguna yang dibuat dalam grup thread. |
LOW_QUEUE_COUNT | Jumlah permintaan yang menunggu dalam antrian prioritas rendah grup thread. |
HIGH_QUEUE_COUNT | Jumlah permintaan yang menunggu dalam antrian prioritas tinggi grup thread. |
Pengujian Sysbench
Bagian ini membandingkan kinerja database dengan fitur kolam thread diaktifkan dan dinonaktifkan. Hasil pengujian menunjukkan bahwa database memberikan kinerja jauh lebih tinggi dalam kondisi konkurensi tinggi ketika fitur kolam thread diaktifkan.
Gambar 1. Pengujian pembaruan OLTP (Online Transactional Processing) pada tabel tanpa indeks
Gambar 2. Pengujian OLTP write-only
Gambar 3. Pengujian OLTP read-only
Gambar 4. Pengujian OLTP read/write