All Products
Search
Document Center

ApsaraDB RDS:Apa yang harus saya lakukan jika utilisasi CPU pada instance ApsaraDB RDS for SQL Server tinggi?

Last Updated:Jun 25, 2025

Topik ini menjelaskan penyebab dan solusi untuk masalah utilisasi CPU tinggi, bahkan hingga mencapai 100%, pada instance ApsaraDB RDS for SQL Server.

Catatan

Perhatikan hal-hal berikut:

  • Sebelum melakukan operasi berisiko tinggi seperti memodifikasi konfigurasi atau data dari instance Alibaba Cloud, pastikan Anda memeriksa kemampuan pemulihan bencana dan toleransi kesalahan untuk menjamin keamanan data.

  • Sebelum memodifikasi konfigurasi atau data suatu instance, seperti Elastic Compute Service (ECS) atau instance RDS, buat snapshot atau aktifkan cadangan. Sebagai contoh, aktifkan fitur pencadangan log untuk instance RDS.

  • Jika Anda memberikan izin pada informasi sensitif atau mengirimkan informasi sensitif di Konsol Manajemen Alibaba Cloud, segera modifikasi informasi tersebut. Informasi sensitif meliputi nama pengguna dan kata sandi.

DOP Tidak Tepat untuk Instance RDS

Pemecahan Masalah

Ketika beberapa thread digunakan untuk memproses tugas secara paralel, jumlah data yang diproses oleh setiap thread berbeda, sehingga tunggu CXPACKET mungkin terjadi. Sejumlah besar tunggu CXPACKET dapat menyebabkan utilisasi CPU tinggi. Anda dapat menggunakan Activity Monitor di SQL Server Management Studio (SSMS) atau mengeksekusi pernyataan SQL berikut beberapa kali untuk memeriksa apakah ada banyak tunggu CXPACKET.

Catatan

Di SQL Server, tunggu CXPACKET terjadi dalam skenario pemrosesan paralel. Tunggu CXPACKET menunjukkan bahwa thread tertentu telah selesai memproses dan menunggu thread lainnya selesai untuk mengintegrasikan hasil pemrosesan. Jika waktu tunggu CXPACKET terakumulasi terlalu tinggi, kinerja CPU dari instance RDS akan terpengaruh.

WITH [Waits] AS (
SELECT [wait_type],
       [wait_time_ms] / 1000.0 AS [WaitS],
       ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
       [signal_wait_time_ms] / 1000.0 AS [SignalS],
       [waiting_tasks_count] AS [WaitCount],
       100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
                                    ROW_NUMBER() OVER(
                                                      ORDER BY [wait_time_ms] DESC) AS [RowNum]
FROM sys.dm_os_wait_stats
WHERE [wait_type] NOT IN ( N'BROKER_EVENTHANDLER',
                            N'BROKER_RECEIVE_WAITFOR',
                             N'BROKER_TASK_STOP',
                              N'BROKER_TO_FLUSH',
                               N'BROKER_TRANSMITTER',
                                N'CHECKPOINT_QUEUE',
                                 N'CHKPT',
                                  N'CLR_AUTO_EVENT',
                                   N'CLR_MANUAL_EVENT',
                                    N'CLR_SEMAPHORE', -- Maybe uncomment these four if you have mirroring issues N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE', N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD', N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', N'EXECSYNC', N'FSAGENT', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', -- Maybe uncomment these six if you have AG issues N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE', N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', N'MEMORY_ALLOCATION_EXT', N'ONDEMAND_TASK_QUEUE', N'PREEMPTIVE_XE_GETTARGETSTATE', N'PWAIT_ALL_COMPONENTS_INITIALIZED', N'PWAIT_DIRECTLOGCONSUMER_GETNEXT', N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_ASYNC_QUEUE', N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', N'QDS_SHUTDOWN_QUEUE', N'REDO_THREAD_PENDING_WORK', N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE', N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH', N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP', N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY', N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP', N'SLEEP_SYSTEMTASK', N'SLEEP_TASK', N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT', N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS', N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', N'WAIT_XTP_RECOVERY', N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN', N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT') AND [waiting_tasks_count] > 0 )

  SELECT MAX ([W1].[wait_type]) AS [WaitType],
             CAST (MAX ([W1].[WaitS]) AS DECIMAL (16, 2)) AS [Wait_S],
                  CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16, 2)) AS [Resource_S],
                       CAST (MAX ([W1].[SignalS]) AS DECIMAL (16, 2)) AS [Signal_S],
                            MAX ([W1].[WaitCount]) AS [WaitCount],
                                CAST (MAX ([W1].[Percentage]) AS DECIMAL (5, 2)) AS [Percentage],
                                     CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16, 4)) AS [AvgWait_S],
                                          CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16, 4)) AS [AvgRes_S],
                                               CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16, 4)) AS [AvgSig_S]
  FROM [Waits] AS [W1]
  INNER JOIN [Waits] AS [W2] ON [W2].[RowNum] <= [W1].[RowNum]
GROUP BY [W1].[RowNum]
HAVING SUM ([W2].[Percentage]) - MAX([W1].[Percentage]) < 95;

Solusi

DOP Spesifik Pernyataan SQL

  1. Eksekusi pernyataan SQL berikut untuk mengidentifikasi pernyataan SQL yang mengonsumsi sumber daya CPU dari instance RDS:

    SELECT TOP 50 [Avg. MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000 / qs.execution_count,
                  [Total MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000,
                  [Avg. Elapsed Time(sec)] = qs.total_elapsed_time / 1000000 / qs.execution_count,
                  [Total Elapsed Time(sec)] = qs.total_elapsed_time / 1000000,
                  qs.execution_count,
                  [Avg. I/O] = (total_logical_reads + total_logical_writes) / qs.execution_count,
                  [Total I/O] = total_logical_reads + total_logical_writes,
                  Query = SUBSTRING(qt.[text], (qs.statement_start_offset / 2) + 1, ((CASE qs.statement_end_offset
                                                                                          WHEN -1 THEN DATALENGTH(qt.[text])
                                                                                          ELSE qs.statement_end_offset
                                                                                      END - qs.statement_start_offset) / 2) + 1),
                  Batch = qt.[text],
                  [DB] = DB_NAME(qt.[dbid]),
                  qs.last_execution_time,
                  qp.query_plan
    FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
    where qs.execution_count > 5 --lebih dari 5 kejadian ORDER BY [Total MultiCore/CPU time(sec)] DESC;
    Catatan

    Jika instance RDS menjalankan SQL Server 2008 R2, Anda dapat melihat pernyataan SQL yang mengonsumsi sumber daya CPU di log query lambat dari instance RDS di Konsol ApsaraDB RDS.

    Untuk melihat log query lambat, ikuti langkah-langkah berikut: Buka halaman detail instance. Di panel navigasi sebelah kiri, klik Logs. Pada tab Slow Log Summary, lihat log.

  2. Setelah mengidentifikasi pernyataan SQL dengan derajat paralelisme (DOP) tinggi, lihat rencana eksekusinya dan tambahkan petunjuk seperti OPTION (MAXDOP 1) di akhir pernyataan SQL untuk membatasi DOP dan meningkatkan manajemen sumber daya. Contoh:

    SELECT column1,column2 
    FROM table1 o INNER JOIN table2 d ON (o.d_id = d.d_id) 
    OPTION (maxdop 1);

DOP Spesifik Instance RDS

  1. Eksekusi pernyataan SQL berikut untuk melihat nilai parameter maksimum derajat paralelisme dari instance RDS:

    SELECT * FROM SYS.CONFIGURATIONS
    WHERE NAME LIKE '%MAX%';

    image

  2. Eksekusi pernyataan SQL berikut untuk mengonfigurasi parameter. Konfigurasi ini berlaku untuk semua query yang dieksekusi pada instance RDS.

    sp_rds_configure 'max degree of parallelism',1;
    Catatan

    Jika instance RDS menjalankan SQL Server 2008 R2, Anda dapat memodifikasi parameter di Konsol ApsaraDB RDS. Untuk informasi lebih lanjut, lihat Konfigurasi ulang parameter instance ApsaraDB RDS for SQL Server menggunakan Konsol ApsaraDB RDS.

Beban aplikasi berat

Gejala

Beban pada instance RDS berat. Namun, tidak ada query lambat yang menjadi penyebab utama beban berat. Kurva permintaan per detik (QPS) dan utilisasi CPU sesuai. Masalah ini umum terjadi pada sistem transaksi online yang dioptimalkan, seperti sistem pesanan, dan aplikasi web populer dengan tingkat pembacaan tinggi.

Karakteristik

QPS tinggi. Operasi query sederhana. Efisiensi query tinggi. Query sulit dioptimalkan.

Solusi

Optimalkan arsitektur aplikasi atau tingkatkan jenis instance.

  • Tingkatkan jenis instance RDS Anda untuk menambah sumber daya CPU. Untuk informasi lebih lanjut, lihat Ubah spesifikasi instance ApsaraDB RDS for SQL Server.

  • Optimalkan query untuk mengurangi biaya eksekusi dan meningkatkan skalabilitas aplikasi. Anda dapat mengoptimalkan operasi I/O logis dan meminimalkan jumlah baris yang perlu dibaca oleh query dalam tabel.

Jumlah besar operasi baca dan tulis

Gejala

Query SQL lambat terjadi. Kurva QPS dan utilisasi CPU tidak sesuai. Beberapa pernyataan SQL yang mengonsumsi banyak sumber daya CPU melibatkan sejumlah besar operasi I/O.

Karakteristik

QPS rendah. Efisiensi query rendah. Sejumlah besar data perlu dipindai selama query. Query dapat dioptimalkan.

Solusi

  • Periksa apakah indeks telah dibuat untuk tabel besar yang terlibat dalam query. Periksa rencana eksekusi query dan optimalkan pemindaian tabel penuh. Anda dapat melihat saran untuk indeks yang hilang di rencana eksekusi.

    image

  • Gunakan CloudDBA untuk memeriksa masalah kinerja. Untuk informasi lebih lanjut, lihat Lihat informasi penyimpanan instance ApsaraDB RDS for SQL Server.

Saran tambahan

Anda dapat melakukan operasi berikut untuk mencegah utilisasi CPU mencapai 100%:

  • Konfigurasikan aturan peringatan untuk utilisasi CPU untuk membantu Anda memantau utilisasi CPU dan merencanakan beban kerja.

  • Selama desain dan pengembangan aplikasi, optimalkan pernyataan SQL berdasarkan aturan umum untuk mengurangi I/O logis query dan meningkatkan skalabilitas aplikasi.

  • Sebelum fitur atau modul baru dirilis, gunakan data produksi untuk melakukan uji stres di lingkungan produksi.

  • Gunakan CloudDBA untuk memeriksa kinerja instance RDS untuk mengidentifikasi masalah sesegera mungkin.

Referensi

Optimasi dan diagnosis kinerja