Topik ini menjelaskan penyebab dan solusi untuk masalah utilisasi CPU tinggi, bahkan hingga mencapai 100%, pada instance ApsaraDB RDS for SQL Server.
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.
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
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;CatatanJika 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.
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
Eksekusi pernyataan SQL berikut untuk melihat nilai parameter maksimum derajat paralelisme dari instance RDS:
SELECT * FROM SYS.CONFIGURATIONS WHERE NAME LIKE '%MAX%';
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;CatatanJika 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.

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.