Anda dapat menerapkan beberapa praktik terbaik untuk mengoptimalkan instance Compute Engine yang menjalankan Microsoft SQL Server. Untuk mempelajari cara menyiapkan instance Server SQL berperforma tinggi, baca Membuat instance SQL Server berperforma tinggi.
Mengonfigurasi Windows
Bagian ini membahas topik konfigurasi tentang cara mengoptimalkan sistem operasi Microsoft Windows untuk performa SQL Server saat berjalan di Compute Engine.
Menyiapkan firewall Windows
Praktik terbaik: Gunakan Windows Server Advanced Firewall, dan tentukan alamat IP komputer klien Anda.
Windows Advanced Firewall adalah komponen keamanan penting di Windows Server. Saat Anda menyiapkan lingkungan SQL Server agar dapat terhubung ke database dari mesin klien lainnya, konfigurasikan firewall untuk mengizinkan traffic masuk:
netsh advfirewall firewall add rule name="SQL Access" ^ dir=in action=allow ^ program="%programfiles%\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\sqlservr.exe" ^ remoteip=LOCAL_SUBNET
Saat menggunakan aturan firewall ini, sebaiknya tentukan alamat IP komputer klien Anda. Tentukan daftar alamat IP yang dipisahkan koma tanpa
spasi kosong untuk parameter remoteip
sebagai pengganti
LOCAL_SUBNET
. Selain itu,
perhatikan bahwa jalur untuk parameter program
dapat berubah bergantung pada
versi SQL Server yang Anda gunakan.
Image aplikasi SQL Server menyertakan aturan firewall Windows SQL Server
.
Aturan ini cukup tidak dibatasi, jadi pertimbangkan untuk menonaktifkannya sebelum sistem Anda beralih ke produksi.
Menyesuaikan koneksi jaringan
Praktik terbaik: Gunakan setelan jaringan default sistem operasi.
Setelan jaringan default pada sebagian besar sistem operasi dikonfigurasi untuk koneksi pada komputer kecil yang terhubung ke jaringan yang cukup cepat. Setelan tersebut biasanya sudah cukup. Selain itu, setelan default konservatif memastikan traffic jaringan tidak membebani jaringan dan komputer yang terhubung.
Di Compute Engine, instance mesin virtual (VM) terpasang ke jaringan yang dirancang oleh Google yang menawarkan kapasitas dan performa tinggi. Server fisik yang menjalankan instance Compute Engine Anda sangat dioptimalkan untuk memanfaatkan kapasitas jaringan ini. Driver jaringan virtual dalam instance Anda juga dioptimalkan, sehingga nilai default cukup untuk sebagian besar kasus penggunaan.
Menginstal antivirus
Praktik terbaik: Ikuti panduan Microsoft untuk software antivirus.
Jika Anda menjalankan Windows, Anda harus menjalankan beberapa software antivirus. Virus malware dan software memberikan risiko yang signifikan terhadap sistem yang terhubung ke jaringan, dan software antivirus adalah langkah mitigasi sederhana yang dapat Anda gunakan untuk melindungi data Anda. Namun, jika software antivirus tidak dikonfigurasi dengan benar, software tersebut dapat berdampak negatif pada performa database Anda. Microsoft memberikan saran tentang cara memilih software antivirus.
Mengoptimalkan performa dan stabilitas
Bagian ini memberikan informasi tentang cara mengoptimalkan performa SQL Server di Compute Engine dan menjelaskan aktivitas operasional untuk membantunya tetap berjalan lancar.
Memindahkan file data dan file log ke disk baru
Praktik terbaik: Gunakan persistent disk SSD terpisah untuk file log dan data.
Secara default, image yang telah dikonfigurasi untuk SQL Server dilengkapi dengan semua yang terinstal di persistent disk booting, yang dipasang sebagai drive `C:`. Pertimbangkan untuk memasang persistent disk SSD sekunder dan memindahkan file log serta file data ke disk baru.
Menggunakan SSD Lokal untuk meningkatkan IOPS
Praktik terbaik: Buat instance SQL Server baru dengan satu atau beberapa
SSD lokal untuk menyimpan
file paging tempdb
dan Windows.
Sifat efemeral dari teknologi SSD lokal menjadikannya kandidat yang buruk untuk
digunakan dengan database penting dan file penting Anda. Namun, file paging tempdb
dan Windows merupakan file sementara, sehingga keduanya merupakan kandidat tepat untuk dipindahkan ke SSD lokal. Tindakan ini mengurangi beban operasi I/O dalam jumlah yang signifikan
dari persistent disk SSD Anda. Untuk mengetahui informasi selengkapnya tentang cara menyiapkannya, lihat Menyiapkan TempDB.
Pemrosesan kueri paralel
Praktik terbaik: Tetapkan max degree of parallelism
ke 8
.
Setelan default yang direkomendasikan untuk max degree of parallelism
adalah mencocokkannya
dengan jumlah CPU di server. Namun, ada titik saat memecah kueri menjadi 16 atau 32 bagian, mengeksekusi semuanya pada vCPU yang berbeda lalu menggabungkan semuanya kembali ke satu hasil membutuhkan waktu lebih lama dibandingkan jika hanya satu vCPU telah menjalankan kueri. Dalam praktiknya, 8 berfungsi sebagai nilai default yang baik.
Praktik terbaik: Pantau waktu tunggu CXPACKET
dan tingkatkan
cost threshold for parallelism
secara bertahap.
Setelan ini digunakan bersama dengan max degree of parallelism
. Setiap unit mewakili
kombinasi pekerjaan CPU dan I/O yang diperlukan untuk menjalankan kueri dengan rencana eksekusi
seri sebelum dipertimbangkan untuk rencana eksekusi paralel. Nilai defaultnya adalah 5.
Meskipun kami tidak memberikan rekomendasi khusus untuk mengubah nilai default, sebaiknya Anda terus memantau dan, jika perlu, meningkatkannya secara bertahap sebesar 5 selama pengujian beban. Salah satu indikator utama bahwa nilai ini mungkin perlu ditingkatkan adalah
adanya waktu tunggu CXPACKET
. Meskipun adanya tunggu CXPACKET
bukan
selalu menunjukkan bahwa setelan ini harus berubah, ini adalah awal yang baik.
Praktik terbaik: Pantau berbagai jenis tunggu, dan sesuaikan setelan pemrosesan paralel global atau tetapkan pada level database individual.
Setiap database dapat memiliki kebutuhan paralelisme yang berbeda. Anda dapat menetapkan setelan ini secara global dan menetapkan Max DOP
pada level database individual. Anda
harus mengamati workload unik Anda, memantau waktu tunggu, lalu menyesuaikan
nilainya sebagaimana mestinya.
Situs SQLSkills menawarkan panduan performa berguna yang mencakup statistik waktu tunggu di dalam database. Dengan mengikuti panduan ini, Anda dapat memahami apa yang menunggu dan cara mengurangi penundaan.
Menangani log transaksi
Praktik terbaik: Pantau pertumbuhan log transaksi di sistem Anda. Pertimbangkan untuk menonaktifkan autogrowth dan menyetel file log ke ukuran tetap, berdasarkan akumulasi log harian rata-rata Anda.
Salah satu sumber kehilangan performa dan perlambatan yang paling sering
diabaikan adalah pertumbuhan log transaksi yang tidak dikelola. Jika database dikonfigurasi untuk menggunakan model pemulihan Full
, Anda dapat melakukan pemulihan ke titik waktu mana pun, tetapi log transaksi Anda akan terisi lebih cepat. Secara default, ketika
file log transaksi penuh, SQL Server akan meningkatkan ukuran file untuk menambahkan
lebih banyak ruang kosong untuk menulis lebih banyak transaksi dan memblokir semua aktivitas di
database hingga selesai. SQL Server mengembangkan setiap file log berdasarkan
Ukuran File Maksimum dan setelan File Growth.
Jika file telah mencapai batas ukuran maksimum dan tidak dapat bertambah, sistem akan menampilkan error 9002 dan mengalihkan database ke mode hanya baca. Jika ukuran file dapat bertambah, SQL Server akan memperluas ukuran file dan mengosongkan ruang kosong. Setelan untuk File Growth ditetapkan secara default ke 10% dari ukuran file log saat ini. Setelan ini bukan setelan default yang baik untuk performa karena semakin besar ukuran file Anda, semakin lama waktu yang diperlukan untuk membuat ruang baru yang kosong.
Praktik terbaik: Jadwalkan pencadangan log transaksi secara berkala.
Terlepas dari setelan ukuran dan pertumbuhan maksimum, jadwalkan pencadangan log transaksi reguler, yang, secara default, akan memotong entri log lama dan memungkinkan sistem menggunakan kembali ruang file yang sudah ada. Tugas perawatan sederhana ini dapat membantu menghindari penurunan performa pada waktu puncak traffic Anda.
Mengoptimalkan File Log Virtual
Praktik terbaik: Pantau pertumbuhan File Log Virtual dan ambil tindakan untuk mencegah fragmentasi file log.
File log transaksi fisik disegmentasikan ke dalam File Log Virtual (VLF). VLF baru dibuat setiap kali file log transaksi fisik harus berkembang. Jika Anda tidak menonaktifkan pertumbuhan otomatis, dan pertumbuhan terlalu sering terjadi, terlalu banyak VLF yang dibuat. Aktivitas ini dapat mengakibatkan fragmentasi file log, yang mirip dengan fragmentasi disk dan dapat berdampak buruk pada performa.
SQL Server 2014 memperkenalkan algoritma yang lebih efisien untuk menentukan jumlah VLF yang dibuat selama pertumbuhan otomatis. Umumnya, jika pertumbuhannya kurang dari 1/8 ukuran file log saat ini, SQL Server akan membuat satu VLF dalam segmen baru tersebut. Sebelumnya, metode ini akan membuat 8 VLF untuk pertumbuhan antara 64 MB dan 1 GB, dan 16 VLF untuk pertumbuhan di atas 1 GB. Anda dapat menggunakan skrip TSQL di bawah ini untuk memeriksa jumlah VLF yang dimiliki database Anda saat ini. Jika memiliki ribuan file, pertimbangkan untuk menyusutkan dan mengubah ukuran file log Anda secara manual.
--Check VLFs substitute your database name below USE YOUR_DB DECLARE @vlf_count INT DBCC LOGINFO SET @vlf_count = @@ROWCOUNT SELECT VLFs = @vlf_count
Anda dapat membaca lebih lanjut tentang VLF di situs Breent Ozar.
Menghindari fragmentasi indeks
Praktik terbaik: Defragmentasi indeks secara teratur pada tabel yang paling banyak diubah.
Indeks dalam tabel Anda dapat terfragmentasi, sehingga dapat menyebabkan performa yang buruk dari setiap kueri yang menggunakan indeks ini. Jadwal pemeliharaan rutin harus mencakup pengaturan ulang indeks pada tabel Anda yang paling banyak dimodifikasi.
Anda dapat menjalankan skrip Transact-SQL berikut untuk database guna menampilkan indeks dan persentase fragmentasinya. Anda dapat melihat dalam contoh hasil bahwa
indeks PK_STOCK
95% terfragmentasi. Dalam pernyataan 'SELECT' berikut, ganti 'YOUR_DB' dengan nama database Anda:
SELECT stats.index_id as id, name, avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (DB_ID(N'YOUR_DB'), NULL, NULL, NULL, NULL) AS stats JOIN sys.indexes AS indx ON stats.object_id = indx.object_id AND stats.index_id = indx.index_id AND name IS NOT NULL; RESULTS ------------------------------- Id name avg_fragmentation_in_percent ------------------------------- 1 ORDERS_I1 0 2 ORDERS_I2 0 1 ORDER_LINE_I1 0.01 1 PK_STOCK95.5529819557039 1 PK_WAREHOUSE0.8
Jika indeks terlalu terfragmentasi, Anda dapat mengaturnya ulang menggunakan skrip ALTER
dasar. Berikut adalah contoh skrip yang mencetak pernyataan ALTER
yang dapat Anda jalankan untuk setiap indeks tabel:
SELECT 'ALTER INDEX ALL ON ' + table_name + ' REORGANIZE; GO' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'YOUR_DB'
Pilih tabel dari kumpulan hasil yang memiliki fragmentasi tertinggi, lalu jalankan pernyataan tersebut secara bertahap. Pertimbangkan untuk menjadwalkan skrip ini atau skrip serupa sebagai salah satu tugas pemeliharaan reguler Anda.
Memformat disk sekunder
Praktik terbaik: Format disk sekunder dengan unit alokasi 64 KB.
SQL Server menyimpan data dalam unit penyimpanan yang disebut extent. Ekstensi berukuran 64 KB terdiri dari delapan halaman memori berdekatan yang juga berukuran 8 KB. Memformat disk dengan unit alokasi 64 KB memungkinkan SQL Server membaca dan menulis ekstensi secara lebih efisien, sehingga meningkatkan performa I/O dari disk.
Untuk memformat disk sekunder dengan unit alokasi 64 KB, jalankan perintah PowerShell berikut, yang menelusuri semua disk baru dan yang belum diinisialisasi dalam sistem serta memformat disk dengan unit alokasi 64 KB:
Get-Disk | Where-Object {$_.PartitionStyle -eq 'RAW'} | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -AllocationUnitSize 65536 -Confirm:$FALSE
Pencadangan
Praktik terbaik: Buatlah rencana untuk pencadangan dan lakukan pencadangan secara teratur.
Situs Ola Hallengren memberikan titik awal yang baik untuk memahami cara menerapkan rencana pencadangan dan pemeliharaan yang solid.
Saat melakukan pencadangan database reguler, berhati-hatilah agar tidak menggunakan terlalu banyak IOPS persistent disk. Gunakan SSD lokal untuk mengatur cadangan Anda, lalu mengirimkannya ke bucket Cloud Storage.
Pemantauan
Praktik terbaik: Gunakan Cloud Monitoring.
Anda dapat menginstal agen Cloud Monitoring untuk Microsoft Windows untuk mengirim beberapa titik data pemantauan ke dalam sistem Cloud Monitoring.
Dengan menggunakan kemampuan pengumpulan data, Anda dapat menyesuaikan informasi yang ingin dipantau, dan mengirimkannya ke data warehouse pengelolaan bawaan. Data warehouse pengelolaan dapat berjalan di server yang sama dengan yang Anda pantau, atau data dapat di-streaming ke instance SQL Server lain yang menjalankan warehouse.
Memuat data secara massal
Praktik terbaik: Gunakan database terpisah untuk mengatur dan mengubah data massal sebelum memindahkannya ke server produksi.
Sepertinya Anda perlu memuat data dalam jumlah besar ke sistem Anda minimal satu kali, atau secara teratur. Ini adalah operasi yang memerlukan banyak resource dan Anda mungkin mencapai batas IOPS persistent disk saat melakukan pemuatan massal.
Ada cara mudah untuk mengurangi I/O disk dan konsumsi CPU dari operasi
pemuatan massal, dengan manfaat tambahan yaitu mempercepat waktu eksekusi
tugas batch Anda. Solusinya adalah membuat database yang sepenuhnya terpisah yang menggunakan model pemulihan Simple
, lalu menggunakan database tersebut untuk staging dan mengubah set data massal sebelum memasukkannya ke dalam database produksi. Anda juga dapat menempatkan database baru ini di drive SSD lokal, jika Anda
memiliki ruang penyimpanan yang cukup. Penggunaan SSD lokal untuk database pemulihan akan mengurangi
penggunaan resource untuk operasi massal dan waktu yang diperlukan untuk menyelesaikan tugas.
Manfaat terakhirnya adalah tugas pencadangan Anda untuk data produksi tidak perlu mencadangkan semua operasi massal tersebut di log transaksi. Oleh karena itu, tugas pencadangan akan menjadi lebih kecil dan berjalan lebih cepat.
Memvalidasi penyiapan Anda
Praktik terbaik: Uji konfigurasi Anda untuk memvalidasi bahwa konfigurasi berfungsi seperti yang diharapkan.
Setiap kali menyiapkan sistem baru, Anda harus merencanakan untuk memvalidasi konfigurasi dan menjalankan beberapa pengujian performa. Prosedur tersimpan ini adalah resource yang bagus untuk mengevaluasi konfigurasi SQL Server Anda. Luangkan waktu untuk membaca tentang flag konfigurasi, dan jalankan prosedurnya.
Mengoptimalkan SQL Server Enterprise Edition
SQL Server Enterprise Edition memiliki banyak kemampuan tambahan dibandingkan Edisi Standar. Jika Anda memigrasikan lisensi yang ada ke Google Cloud, ada beberapa opsi performa yang dapat Anda pertimbangkan untuk diterapkan.
Menggunakan tabel terkompresi
Praktik terbaik: Aktifkan kompresi tabel dan indeks.
Mungkin terdengar tak masuk akal bahwa mengompresi tabel dapat membuat performa sistem Anda lebih cepat, tetapi, dalam banyak kasus, itulah yang terjadi. Konsekuensinya adalah menggunakan sejumlah kecil siklus CPU untuk mengompresi data dan menghilangkan I/O disk tambahan yang diperlukan untuk membaca dan menulis blok yang lebih besar. Umumnya, semakin sedikit I/O disk yang digunakan sistem, semakin baik performanya. Petunjuk untuk memperkirakan dan mengaktifkan kompresi tabel dan indeks tersedia di situs MSDN.
Mengaktifkan ekstensi kumpulan buffer
Praktik terbaik: Gunakan ekstensi kumpulan buffer untuk mempercepat akses data.
Kumpulan buffer adalah tempat sistem menyimpan halaman bersih. Secara sederhana, Cloud Storage menyimpan salinan data Anda, yang mencerminkan tampilannya di disk. Saat data berubah dalam memori, ini disebut halaman kotor. Halaman kotor harus dikosongkan ke disk untuk menyimpan perubahan. Jika database Anda lebih besar daripada memori yang tersedia, hal tersebut akan memberikan tekanan pada kumpulan buffer, dan halaman bersih mungkin akan dihapus. Jika halaman bersih dihapus, sistem harus membaca dari disk saat berikutnya sistem mengakses data yang hilang.
Fitur ekstensi kumpulan buffer memungkinkan Anda mengirim halaman bersih ke SSD lokal, bukan menjatuhkannya. Fungsinya sama dengan memori virtual, yaitu, denganmenukar, dan memberi Anda akses ke halaman bersih di SSD lokal, yang lebih cepat daripada membuka disk biasa untuk mengambil data.
Teknik ini tidak secepat memiliki memori yang cukup, tetapi dapat memberi Anda sedikit peningkatan throughput jika memori yang tersedia rendah. Anda dapat membaca lebih lanjut tentang ekstensi kumpulan buffer dan meninjau beberapa hasil benchmark di situs Brent Ozar.
Mengoptimalkan Pemberian Lisensi SQL Server
Multithreading Simultan (SMT)
Praktik terbaik: Menetapkan jumlah thread per core ke 1 untuk sebagian besar workload SQL Server
Multithreading simultan (SMT), yang umumnya dikenal sebagai Hyper-Threading Technology (HTT) pada prosesor Intel, adalah fitur yang memungkinkan satu inti CPU dibagikan secara logis sebagai dua thread. Di Compute Engine, SMT diaktifkan pada sebagian besar VM secara default. Artinya, setiap vCPU di VM berjalan pada satu thread dan setiap inti CPU fisik digunakan bersama oleh dua vCPU.
Di Compute Engine, Anda dapat mengonfigurasi jumlah thread per core, yang secara efektif menonaktifkan SMT. Jika jumlah thread per core ditetapkan ke 1, vCPU tidak akan berbagi core CPU fisik. Konfigurasi ini berdampak signifikan pada biaya lisensi untuk Windows Server dan SQL Server. Jika jumlah thread per inti ditetapkan menjadi 1, jumlah vCPU dalam VM akan dibagi dua, yang juga mengurangi jumlah lisensi Windows Server dan SQL Server yang diperlukan. Hal ini dapat mengurangi total biaya workload secara signifikan.
Namun, mengonfigurasi jumlah thread per core juga memengaruhi performa workload. Aplikasi yang ditulis menjadi multi-thread dapat memanfaatkan fitur ini dengan memecah pekerjaan komputasi menjadi bagian-bagian kecil yang dapat diparalelkan dan dijadwalkan di beberapa core logis. Paralelisasi pekerjaan ini sering kali meningkatkan throughput sistem secara keseluruhan dengan memanfaatkan resource inti yang tersedia dengan lebih baik. Misalnya, saat satu thread terhenti, thread lainnya dapat menggunakan inti.
Dampak performa yang tepat dari SMT pada SQL Server bergantung pada karakteristik workload dan platform hardware yang digunakan karena implementasi SMT berbeda antar-generasi hardware. Workload dengan volume transaksi kecil yang tinggi, misalnya workload OLTP, sering kali dapat memanfaatkan SMT, dan mendapatkan manfaat dari peningkatan performa yang lebih besar. Sebaliknya, workload yang kurang dapat diparalelkan, misalnya workload OLAP, akan lebih sedikit menerima manfaat dari SMT. Meskipun pola ini telah diketahui secara umum, pertimbangkan untuk mengevaluasi dampak performa SMT berdasarkan workload untuk menentukan dampak penetapan jumlah thread per inti ke 1.
Konfigurasi yang paling hemat biaya untuk sebagian besar workload SQL Server melibatkan penetapan jumlah thread per inti ke 1. Setiap penurunan performa dapat diimbangi dengan memanfaatkan VM yang lebih besar. Dalam sebagian besar kasus, penurunan 50% pada biaya lisensi lebih besar daripada kenaikan biaya VM yang lebih besar.
Contoh: Pertimbangkan SQL Server yang di-deploy dalam konfigurasi n2-standard-16
Secara default, jumlah core yang terlihat dalam sistem operasi adalah 16, yang berarti diperlukan 16 vCPU Windows Server dan 16 vCPU lisensi SQL Server untuk menjalankan server.
PS C:\> Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}} NumberOfCores Thread(s) per core ------------- ------------------ 8 2
Setelah mengikuti langkah-langkah untuk menonaktifkan SMT di SQL Server, konfigurasi barunya adalah:
PS C:\> Get-WmiObject -Class Win32_processor | Select-Object NumberOfCores, @{Name="Thread(s) per core";Expression={$_.NumberOfLogicalProcessors/$_.NumberOfCores}} NumberOfCores Thread(s) per core ------------- ------------------ 8 1
Karena sekarang hanya 8 core yang terlihat dalam sistem operasi, server hanya memerlukan 8 vCPU untuk menjalankan Windows Server dan SQL Server.