Permasalahan
Utilisasi CPU pada instans ApsaraDB RDS for MySQL/MariaDB tinggi, kadang mencapai 100%.
Penyebab
Topik ini menjelaskan dua penyebab umum utilisasi CPU 100% beserta solusinya: beban aplikasi tinggi (QPS tinggi) dan biaya kueri tinggi akibat kueri SQL lambat. Saat aplikasi mengirimkan operasi kueri atau modifikasi data, sistem melakukan sejumlah besar operasi baca logis. Logical I/O mengacu pada jumlah baris data yang harus diakses dalam tabel untuk mengeksekusi suatu kueri. Akibatnya, sistem mengonsumsi sumber daya CPU yang signifikan untuk menjaga konsistensi data yang dibaca dari penyimpanan ke memori. Di MySQL, utilisasi CPU tinggi sering disebabkan oleh kueri SQL lambat yang mahal dan mengakses banyak baris tabel.
Topik ini tidak mencakup kasus-kasus di mana utilisasi CPU tinggi disebabkan oleh banyak konflik row lock, penantian lock, atau tugas latar belakang, karena skenario tersebut jarang terjadi.
-
Beban aplikasi tinggi (QPS tinggi):
-
Karakteristik: Instans mengalami QPS tinggi dengan kueri yang sederhana dan efisien sehingga hampir tidak ada ruang untuk optimasi.
-
Gejala: Tidak ditemukan kueri SQL lambat, atau jika ada, bukan penyebab utama. Tren QPS dan utilisasi CPU konsisten.
-
Skema umum: Masalah ini umum terjadi pada sistem OLTP (online transaction processing) yang telah dioptimalkan, seperti sistem pesanan, aplikasi web populer dengan tingkat baca tinggi, serta uji stres pihak ketiga seperti Sysbench.
-
-
Biaya kueri tinggi akibat kueri SQL lambat (mengakses banyak baris):
-
Karakteristik: QPS instans tidak tinggi, tetapi eksekusi kueri tidak efisien dan memerlukan pemindaian sejumlah besar data tabel. Potensi optimasi sangat besar.
-
Gejala: Terdapat kueri SQL lambat. Tren QPS dan utilisasi CPU tidak sesuai.
-
Analisis penyebab: Efisiensi kueri yang rendah memaksa sistem mengakses volume data besar untuk mengembalikan hasil, sehingga menyebabkan logical I/O rata-rata tinggi. Oleh karena itu, meskipun QPS tidak tinggi (misalnya pada website dengan trafik rendah), utilisasi CPU instans tetap bisa tinggi.
-
Solusi
Pilih solusi berdasarkan situasi spesifik Anda.
Beban aplikasi tinggi (QPS tinggi)
Jika utilisasi CPU tinggi disebabkan oleh beban aplikasi tinggi, biasanya tidak banyak ruang untuk optimasi SQL. Atasi masalah ini dengan menyesuaikan arsitektur aplikasi atau konfigurasi instans:
-
Lakukan upgrade tipe instans untuk menambah sumber daya CPU. Untuk informasi selengkapnya, lihat Change configuration.
-
Tambahkan read-only instance dan arahkan kueri yang tidak sensitif terhadap konsistensi data—seperti pencarian kategori produk atau jadwal kereta—ke read-only instance tersebut. Hal ini mengurangi beban pada primary instance. Untuk informasi selengkapnya, lihat Create a MySQL read-only instance.
-
Gunakan PolarDB-X, sebuah database terdistribusi cloud-native, untuk melakukan sharding data secara otomatis dan mendistribusikan beban kueri ke beberapa instans RDS.
-
Gunakan ApsaraDB for Memcache atau Tair untuk menyajikan hasil kueri yang sering diakses dari cache, sehingga mengurangi beban pada instans RDS.
-
Untuk aplikasi dengan data yang relatif statis, repetisi kueri tinggi, dan set hasil lebih kecil dari 1 MB, pertimbangkan untuk mengaktifkan query cache.
CatatanAnda harus menguji apakah pengaktifan query cache memberikan manfaat bagi aplikasi Anda. Untuk informasi lebih lanjut tentang pengaturannya, lihat Set and use the query cache for ApsaraDB RDS for MySQL.
-
Arsipkan data historis secara berkala. Gunakan sharding atau partisi untuk mengurangi jumlah data yang diakses oleh kueri. Optimalkan kueri Anda untuk mengurangi biaya eksekusi dan meningkatkan skalabilitas aplikasi.
Biaya kueri tinggi akibat kueri SQL lambat
Untuk mengatasi masalah ini, identifikasi kueri yang tidak efisien, tingkatkan efisiensi eksekusinya, dan kurangi biaya eksekusinya.
-
Identifikasi kueri yang tidak efisien dengan salah satu metode berikut:
-
Jalankan pernyataan SQL berikut untuk melihat kueri yang sedang berjalan.
show processlist; show full processlist;Sistem mengembalikan output yang mirip dengan berikut:
mysql> show processlist; +----------+-------+-------------------+---------+---------+-------+--------------+----------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----------+-------+-------------------+---------+---------+-------+--------------+----------------------------------------------+ |101031643 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |117731567 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |134298793 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |134384670 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 0 | Init | show processlist | |234891284 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |235125098 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |235200576 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |235633985 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |235887773 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |251990394 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | |252662718 | jacky | xxx.xxx.xxx.xx:xx | my_test | Query | 10760 | Sending data | select b.* from perf_test_no_idx_01 a, ... | +----------+-------+-------------------+---------+---------+-------+--------------+----------------------------------------------+ 11 rows in set (0.00 sec)Sesi kueri yang telah berjalan lama dan berada dalam status seperti Sending data, Copying to tmp table, Copying to tmp table on disk, Sorting result, atau Using filesort kemungkinan memiliki masalah performa.
-
Dalam skenario di mana QPS tinggi menyebabkan utilisasi CPU tinggi, kueri biasanya dieksekusi dengan cepat. Mungkin sulit menangkap kueri yang sedang berjalan menggunakan perintah
show processlist;atau dengan melihat sesi instans. Namun, Anda dapat menjalankan pernyataan SQL berikut untuk menganalisis suatu kueri.explain [$SQL]Catatan[$SQL] merepresentasikan kueri SQL yang mengalami masalah performa.
-
Anda dapat menjalankan perintah seperti
kill [$ID];untuk menghentikan sesi yang berjalan lama. Untuk informasi selengkapnya, lihat Terminate a session on an ApsaraDB RDS for MySQL instance.Catatan[$ID] merepresentasikan ID sesi yang sesuai dengan kueri tersebut.
-
-
Gunakan Database Autonomy Service (DAS) untuk melihat kueri yang sedang berjalan:
Masuk ke DAS console.
Di panel navigasi kiri, klik .
Temukan instans target dan klik ID instans untuk membuka halaman detail instans.
-
Klik teks kueri di kolom SQL untuk menampilkan kueri lengkap dan rencana eksekusinya.
-
Terus pantau performa eksekusi SQL menggunakan SQL Insight and Auditing. Di panel navigasi kiri halaman detail instans, pilih Autonomy Service > SQL Insight and Auditing. Anda dapat melihat informasi detail seperti waktu eksekusi SQL dan jumlah baris yang dipindai untuk mengidentifikasi pernyataan SQL yang intensif CPU.
-
-
Setelah mengidentifikasi kueri yang perlu dioptimalkan, gunakan SQL Diagnostics di Konsol Data Management Service (DMS) untuk mendapatkan saran optimasi. Untuk troubleshooting masalah historis, laporan diagnostik juga sangat berharga:
-
Masuk ke database menggunakan konsol DMS.
-
Di bagian atas halaman, klik SQL Window, lalu pilih database yang diinginkan.
-
Tempel pernyataan kueri ke jendela SQL dan klik SQL Diagnostics untuk mendapatkan saran optimasi. Hasil diagnosis mencakup pernyataan SQL, rencana eksekusi (yang menunjukkan jenis kueri, tabel yang terlibat, dan jumlah baris yang dipindai), serta saran diagnosis indeks yang menyediakan pernyataan DDL yang dapat Anda jalankan langsung.
-
-
Terapkan optimasi yang direkomendasikan. Misalnya, setelah menambahkan indeks yang disarankan, verifikasi bahwa biaya eksekusi kueri menjadi jauh lebih rendah.
Langkah mitigasi jangka pendek
Jika utilisasi CPU tetap tinggi dan Anda tidak dapat segera mengoptimalkan kueri SQL lambat, gunakan langkah-langkah berikut untuk mengurangi tekanan CPU.
Kendalikan konkurensi kueri SQL lambat menggunakan SQL throttling
-
Masuk ke konsol ApsaraDB RDS. Di daftar Instances, klik instans target.
-
Di panel navigasi kiri, pilih Autonomy Service > One-Click Diagnosis.
-
Klik tab Session Management.
-
Klik tombol SQL Throttling.
-
Klik Create Throttling Rule, lalu konfigurasikan mode pembatasan, aturan, database, konkurensi maksimum, dan durasi pembatasan.
Lakukan upgrade sementara tipe instans
Jika menghentikan sesi dan SQL throttling gagal mengurangi tekanan CPU, Anda dapat sementara melakukan upgrade tipe instans untuk menambah sumber daya CPU. Di halaman Informasi Dasar instans, pada bagian Informasi Konfigurasi, klik Change configuration untuk melakukan upgrade instans. Untuk informasi selengkapnya, lihat Change configuration.
Informasi tambahan
Fitur untuk troubleshooting masalah performa
Data Management Service (DMS) menyediakan beberapa fitur untuk membantu Anda troubleshooting dan menyelesaikan masalah performa instans. Laporan diagnostik adalah alat paling efektif untuk troubleshooting masalah performa pada instans ApsaraDB RDS for MySQL dan ApsaraDB RDS for MariaDB. Apa pun penyebab masalah performa, selalu mulai dengan meninjau laporan diagnostik, terutama bagian optimasi SQL, daftar sesi, dan ringkasan kueri SQL lambat.
Mencegah utilisasi CPU mencapai 100%
Panduan berikut dapat membantu Anda mencegah utilisasi CPU mencapai 100%:
-
Atur alarm utilisasi CPU untuk memastikan Anda memiliki ruang headroom CPU yang cukup pada instans Anda.
-
Saat merancang dan mengembangkan aplikasi, pertimbangkan optimasi kueri. Ikuti prinsip optimasi MySQL umum untuk mengurangi logical I/O kueri dan meningkatkan skalabilitas aplikasi.
-
Sebelum meluncurkan fitur atau modul baru, lakukan uji stres dengan data produksi.
-
Sebelum meluncurkan fitur atau modul baru, jalankan uji regresi dengan data produksi.
Algoritma sumber daya sistem
Model sederhana berikut menggambarkan hubungan antara sumber daya sistem, biaya eksekusi pernyataan SQL, dan queries per second (QPS):
-
Kondisi: Model aplikasi konstan, artinya kode aplikasi tidak diubah.
-
avg_lgc_io: Logical I/O rata-rata yang diperlukan untuk mengeksekusi setiap kueri.
-
total_lgc_io: Total logical I/O yang dapat ditangani oleh sumber daya CPU instans per satuan waktu.
-
Rumus:
total_lgc_io = avg_lgc_io × QPS, yang berartiTotal sumber daya CPU per satuan waktu = Logical I/O rata-rata per kueri × Jumlah kueri per satuan waktu.
Dokumen terkait
Use Database Autonomy Service to resolve high CPU utilization on ApsaraDB RDS for MySQL instances
Versi yang berlaku
-
ApsaraDB RDS for MySQL
-
ApsaraDB RDS for MariaDB