Untuk mencapai performa optimal pada PolarDB for MySQL, PolarDB menyediakan fitur thread pool. Fitur ini memisahkan thread dari sesi sehingga sejumlah kecil thread dapat menangani tugas dari banyak sesi aktif.
Manfaat
Secara default, MySQL menggunakan mode eksklusif sesi, di mana setiap sesi membuat thread khusus. Ketika terdapat banyak sesi, terjadi persaingan sumber daya yang signifikan dan menurunkan performa. Penjadwalan thread berlebihan serta cache miss yang sering juga secara drastis mengurangi performa.
Thread pool pada PolarDB menerapkan mekanisme prioritas dan kontrol konkurensi untuk berbagai jenis operasi SQL. Fitur ini menjaga jumlah koneksi mendekati tingkat optimal, memastikan database PolarDB memberikan performa tinggi dalam kondisi koneksi dan konkurensi tinggi. Manfaat thread pool meliputi hal-hal berikut:
Ketika banyak thread berjalan secara konkuren, thread pool secara otomatis menyesuaikan jumlah thread konkuren ke rentang yang wajar, sehingga menghindari penjadwalan thread berlebihan dan cache miss yang sering.
Ketika banyak transaksi berjalan secara konkuren, thread pool memberikan tingkat prioritas berbeda pada pernyataan dan transaksi, serta mengontrol konkurensinya secara terpisah untuk mengurangi persaingan sumber daya.
Thread pool memberikan prioritas lebih tinggi pada pernyataan SQL terkait administrasi agar dieksekusi terlebih dahulu, sehingga operasi seperti pembuatan koneksi baru, administrasi, dan pemantauan tetap stabil meskipun sistem sedang mengalami beban tinggi.
Thread pool memberikan prioritas lebih rendah pada pernyataan SQL yang kompleks dan membatasi jumlah maksimum eksekusi konkurennya, sehingga mencegah pernyataan tersebut menghabiskan sumber daya sistem dan menyebabkan seluruh layanan database menjadi tidak tersedia.
Menggunakan thread pool
Thread pool melibatkan parameter-parameter berikut. Anda dapat mengubahnya di Konsol. Untuk informasi lebih lanjut, lihat Setel parameter kluster dan node.
Semua parameter kluster di PolarDB console diberi awalan loose_ untuk kompatibilitas dengan file konfigurasi MySQL. Untuk mengubah parameter di PolarDB console, pilih parameter yang memiliki awalan loose_.
Nama Parameter | Deskripsi |
loose_thread_pool_enabled | Menentukan apakah fitur thread pool diaktifkan. Nilai yang valid:
Catatan
|
loose_thread_pool_size | Jumlah grup thread dalam thread pool. Rentang nilai yang valid bergantung pada jumlah core CPU pada node primary di kluster. Rentang valid: DBNodeClassCPU hingga DBNodeClassCPU × 10. Nilai default: DBNodeClassCPU × 2. Catatan
Contoh:
|
loose_thread_pool_high_prio_mode | Mode untuk antrian prioritas tinggi dalam thread pool. Nilai yang valid:
Catatan Cakupan penerapan:
|
loose_thread_pool_high_prio_tickets | Jumlah tiket untuk satu entri ke antrian prioritas tinggi. Rentang valid: 0 hingga 4294967295. Nilai default: 4294967295. Catatan Cakupan penerapan:
|
loose_thread_pool_idle_timeout | Periode timeout untuk melepaskan thread idle dalam thread pool. Thread idle yang tidak melayani permintaan apa pun dalam periode ini akan dilepaskan. Rentang valid: 0 hingga 31536000. Nilai default: 60. Satuan: detik. Catatan Cakupan penerapan:
|
loose_thread_pool_oversubscribe | Jumlah thread aktif yang diizinkan dalam setiap grup thread. Thread aktif adalah thread yang sedang mengeksekusi pernyataan SQL. Rentang valid: 1 hingga 1000. Nilai default: 20. |
loose_thread_pool_stall_limit | Ambang batas waktu untuk menentukan apakah thread pool berada dalam kondisi stall. Ketika thread pool memasuki kondisi stall, sistem membuat thread baru untuk melayani pernyataan SQL. Rentang valid: 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 client yang tidak dibatasi oleh thread pool. Hal ini memungkinkan Anda mengeksekusi pernyataan SQL untuk operasi administratif bahkan ketika thread pool penuh. Contoh konfigurasi: Catatan Cakupan penerapan: 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 client yang terhubung melalui proxy diabaikan saat memeriksa terhadap
Catatan Cakupan penerapan: MySQL 8.0.1 dengan versi revisi 8.0.1.1.19 atau lebih baru. |
loose_thread_pool_high_priority_users | Menentukan akun database berprioritas tinggi. Setelah dikonfigurasi, permintaan dari akun-akun ini ditempatkan di antrian prioritas tinggi thread pool untuk diproses secara prioritas. Contoh konfigurasi: Catatan
|
loose_thread_pool_mark_ddl_thread_timeout_sec | Menentukan ambang batas timeout untuk thread DDL dalam thread pool. Setelah waktu ini berlalu, thread DDL ditandai sebagai timeout, dan sistem membuat thread baru untuk memproses permintaan. Rentang valid: 0 hingga 864000. Nilai default: 600. Satuan: detik. Catatan Cakupan penerapan: 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 langsung ditandai sebagai timeout ketika thread pool mengalami beban tinggi dan antrian prioritas rendah menumpuk. Ketika hal ini terjadi, sistem membuat thread baru untuk memproses permintaan. Parameter ini cocok untuk skenario bisnis yang memerlukan operasi DDL batch secara sering. Nilai yang valid:
Catatan Cakupan penerapan: MySQL 8.0.1 dengan versi revisi 8.0.1.1.19 atau lebih baru. |
Memeriksa status thread pool
Anda dapat menjalankan perintah berikut untuk memeriksa status thread pool:
select * from information_schema.THREAD_POOL_STATUS;Contoh berikut menunjukkan hasil yang 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)Deskripsi metrik sebagai berikut.
Parameter | Deskripsi |
ID | ID thread pool. |
THREAD_COUNT | Jumlah thread dalam thread pool. |
ACTIVE_THREAD_COUNT | Jumlah thread aktif dalam thread pool. |
WAITING_THREAD_COUNT | Jumlah thread dalam thread pool yang sedang menunggu I/O disk atau commit transaksi. |
DUMP_THREAD_COUNT | Jumlah koneksi persisten kelas DUMP dalam thread pool. |
SLOW_THREAD_TIMEOUT_COUNT | Jumlah thread dalam thread pool yang ditandai sebagai timeout. |
CONNECTION_COUNT | Jumlah koneksi pengguna yang telah terbentuk dalam thread pool. |
LOW_QUEUE_COUNT | Jumlah permintaan yang menunggu dalam antrian prioritas rendah thread pool. |
HIGH_QUEUE_COUNT | Jumlah permintaan yang menunggu dalam antrian prioritas tinggi thread pool. |
Pengujian Sysbench
Gambar berikut membandingkan performa dengan dan tanpa thread pool diaktifkan. Hasil pengujian menunjukkan bahwa thread pool memberikan keunggulan performa signifikan dalam skenario konkurensi tinggi.
Gambar 1. Pengujian OLTP untuk update tanpa indeks
Gambar 2. Pengujian OLTP write-only
Gambar 3. Pengujian OLTP read-only
Gambar 4. Pengujian OLTP read/write