Deskripsi masalah
Saat menggunakan instance ApsaraDB RDS for MySQL atau instance ApsaraDB RDS for MariaDB, utilisasi CPU sangat tinggi dan bahkan mencapai 100%.
Penyebab
Ketika aplikasi mengirimkan permintaan kueri atau modifikasi, sistem melakukan sejumlah besar operasi baca logis, yang menunjukkan I/O logis tinggi pada banyak baris di tabel yang diminta. Akibatnya, sistem mengonsumsi banyak sumber daya CPU untuk mempertahankan konsistensi data yang dibaca dari penyimpanan ke memori. Topik ini menjelaskan penyebab dan solusi untuk permintaan per detik (QPS) tinggi dan kueri SQL lambat yang menyebabkan utilisasi CPU tinggi hingga 100%. Dalam banyak kasus, kueri SQL lambat menyebabkan biaya eksekusi kueri tinggi karena tabel yang diminta berisi banyak baris, sehingga meningkatkan utilisasi CPU.
Utilisasi CPU tinggi juga dapat disebabkan oleh sejumlah besar konflik kunci baris, tunggu kunci baris, atau tugas backend. Topik ini tidak membahas kasus-kasus tersebut.
Penyebab 1: Beban aplikasi berat, ditandai dengan QPS tinggi.
Kinerja: QPS instance tinggi, operasi kueri sederhana, dan efisiensi eksekusi kueri tinggi, meninggalkan sedikit ruang untuk optimasi.
Karakteristik: Tidak ada kueri SQL lambat atau kueri SQL lambat bukan penyebab utama beban berat. Kurva QPS dan utilisasi CPU sesuai.
Skenario umum: Sistem transaksi online yang dioptimalkan, seperti sistem pesanan, aplikasi web populer dengan tingkat pembacaan tinggi, dan alat uji stres pihak ketiga seperti sysbench.
Penyebab 2: Biaya eksekusi kueri tinggi akibat kueri SQL lambat.
Kinerja: QPS instance rendah, efisiensi eksekusi kueri rendah, dan sejumlah besar data perlu dipindai selama kueri, meninggalkan potensi optimasi yang tinggi.
Karakteristik: Kueri SQL lambat terjadi. Kurva QPS dan utilisasi CPU tidak sesuai.
Analisis: Sejumlah besar data perlu dipindai untuk mendapatkan hasil yang diharapkan karena kueri SQL tidak efisien. Hal ini mengarah pada rata-rata I/O logis yang tinggi. Akibatnya, utilisasi CPU tinggi meskipun QPS rendah, seperti dalam kasus situs web yang jarang dikunjungi.
Solusi
Pilih solusi berdasarkan kebutuhan bisnis Anda.
Solusi untuk Penyebab 1
Optimalkan arsitektur aplikasi atau tingkatkan jenis instance.
Tingkatkan jenis instance RDS untuk menambah sumber daya CPU. Untuk informasi lebih lanjut, lihat Ubah spesifikasi instance.
Tambahkan instance RDS hanya-baca untuk mengalihkan beban kueri yang tidak sensitif terhadap konsistensi data dari instance RDS utama. Contoh kueri termasuk kueri jenis komoditas dan kueri nomor kereta. Untuk informasi lebih lanjut, lihat Buat instance ApsaraDB RDS for MySQL hanya-baca.
Gunakan PolarDB-X untuk menerapkan sharding otomatis database dan tabel guna mengalihkan beban kueri dari instance RDS Anda ke beberapa instance RDS.
Gunakan ApsaraDB for Memcache atau Tair (Redis OSS-Compatible) untuk mengalihkan beban kueri dari instance RDS Anda. Dalam hal ini, data yang sering di-query dibaca dari cache.
Aktifkan cache kueri untuk aplikasi yang meng-query data statis, menjalankan kueri identik, dan menerima respons dengan set hasil kurang dari 1 MB.
CatatanUji apakah cache kueri mengalihkan beban kueri Anda. Untuk informasi lebih lanjut, lihat Bagaimana cara mengonfigurasi dan menggunakan fitur cache kueri ApsaraDB RDS for MySQL?.
Arsipkan data historis secara berkala. Gunakan sharding atau partisi untuk mengurangi jumlah data yang diakses oleh kueri. Optimalkan kueri untuk mengurangi biaya eksekusi kueri dan meningkatkan skalabilitas aplikasi.
Solusi untuk Penyebab 2
Identifikasi dan optimalkan kueri yang tidak efisien untuk meningkatkan efisiensi eksekusi dan mengurangi biaya eksekusi.
Identifikasi kueri yang tidak efisien.
Jalankan pernyataan SQL untuk meng-query kueri yang sedang berjalan.
SHOW PROCESSLIST; SHOW FULL PROCESSLIST;Berikut adalah output yang diberikan.

Sesi di mana kueri SQL lambat terjadi dan nilai parameter State adalah Sending data, Copying to tmp table, Copying to tmp table on disk, Sorting result, atau Using filesort mungkin memiliki kueri yang tidak efisien.
Jika utilisasi CPU tinggi disebabkan oleh QPS tinggi, kueri dieksekusi dengan cepat. Anda tidak dapat melihat kueri yang sedang berjalan dengan menjalankan pernyataan
SHOW PROCESSLIST;atau dari sesi. Dalam hal ini, jalankan pernyataan berikut:explain [$SQL]Catatan[$SQL] menunjukkan pernyataan SQL yang tidak efisien.
Anda dapat menjalankan pernyataan
kill [$ID];untuk menghentikan sesi yang berjalan lama. Untuk informasi lebih lanjut tentang cara menghentikan sesi, lihat Bagaimana cara menghentikan sesi pada instance ApsaraDB RDS for MySQL?. Untuk informasi lebih lanjut tentang cara mengelola sesi yang berjalan lama, lihat Bagaimana cara mengelola kueri yang berjalan lama pada instance ApsaraDB RDS for MySQL?.Catatan[$ID] menunjukkan ID sesi yang sesuai dengan pernyataan SQL.
Query kueri yang sedang berjalan di konsol Database Autonomy Service (DAS).
Masuk ke konsol DAS.
Temukan instance yang diperlukan dan pilih di kolom Tindakan.
Klik teks kueri di kolom SQL untuk melihat pengaturan kueri lengkap dan rencana eksekusi.
Setelah menentukan kueri yang perlu dioptimalkan, gunakan Diagnostik SQL untuk mendapatkan saran optimasi. Anda juga dapat mendiagnosis masalah historis utilisasi CPU tinggi yang terjadi pada instance berdasarkan hasil diagnosis.
Masuk ke instance RDS Anda di konsol Data Management (DMS). Untuk informasi lebih lanjut, lihat Masuk ke instance database.
Di bagian atas, klik SQL Console dan pilih database.
Tempelkan pernyataan SQL ke tab SQLConsole dan klik SQL Diagnostics. Saran optimasi akan ditampilkan.
Optimalkan pernyataan SQL berdasarkan saran optimasi. Misalnya, tambahkan indeks untuk secara signifikan mengurangi biaya eksekusi kueri.
Informasi tambahan
Pemecahan masalah isu kinerja
DMS menyediakan berbagai fitur untuk memecahkan masalah kinerja instance. Fitur laporan diagnostik instance optimal untuk memecahkan masalah kinerja instance RDS Anda. Jika terjadi masalah kinerja, kami merekomendasikan agar Anda pertama-tama melihat laporan diagnostik instance, terutama saran optimasi SQL, sesi, dan log kueri lambat dalam laporan. DMS menyediakan fitur-fitur berikut:
Panduan untuk menghindari utilisasi CPU 100%
Gunakan metode berikut:
Konfigurasikan peringatan utilisasi CPU untuk membantu Anda memantau utilisasi CPU dan merencanakan beban kerja berdasarkan kebutuhan bisnis Anda.
Selama desain dan pengembangan aplikasi, optimalkan kueri MySQL berdasarkan aturan dan teknik umum untuk mengurangi I/O logis kueri dan meningkatkan skalabilitas aplikasi.
Sebelum meluncurkan fitur atau modul baru, gunakan data produksi untuk melakukan uji stres di lingkungan produksi.
Sebelum meluncurkan fitur atau modul baru, gunakan data produksi untuk melakukan pengujian regresi.
Algoritma sumber daya sistem
Bagian ini menggunakan model sederhana untuk menggambarkan hubungan antara sumber daya sistem, biaya eksekusi kueri pernyataan SQL, dan QPS.
Kondisi: Konfigurasi aplikasi tidak berubah.
avg_lgc_io: Rata-rata I/O logis yang diperlukan untuk menjalankan setiap kueri.
total_lgc_io: Total I/O logis yang dapat diproses menggunakan sumber daya CPU instance per satuan waktu.
Rumus:
total_lgc_io = avg_lgc_io × QPS.Sumber daya CPU yang dikonsumsi per satuan waktu = Biaya eksekusi rata-rata untuk setiap kueri × Jumlah kueri per satuan waktu.
Referensi
Cakupan aplikasi
ApsaraDB RDS for MySQL dan ApsaraDB RDS for MariaDB