Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Penjadwalan tugas sistem operasi
Utas adalah unit pemrosesan terkecil yang dijalankan oleh sistem operasi, dan memungkinkan logika aplikasi dipisahkan menjadi beberapa jalur eksekusi bersamaan. Utas berguna ketika aplikasi kompleks memiliki banyak tugas yang dapat dilakukan secara bersamaan.
Ketika sistem operasi menjalankan instans aplikasi, sistem operasi membuat unit yang disebut proses untuk mengelola instans. Proses ini memiliki sebuah utas eksekusi. Ini adalah rangkaian instruksi pemrograman yang dilakukan oleh kode aplikasi. Misalnya, jika aplikasi sederhana memiliki satu set instruksi yang dapat dilakukan secara serial, set instruksi tersebut ditangani sebagai satu tugas, dan hanya ada satu jalur eksekusi (atau utas) melalui aplikasi. Aplikasi yang lebih kompleks mungkin memiliki beberapa tugas yang dapat dilakukan secara bersamaan alih-alih secara serial. Aplikasi dapat melakukan ini dengan memulai proses terpisah untuk setiap tugas, yang merupakan operasi intensif sumber daya, atau memulai utas terpisah, yang lebih hemat sumber daya. Selain itu, setiap utas dapat dijadwalkan untuk eksekusi secara independen dari utas lain yang terkait dengan proses.
Thread memungkinkan aplikasi yang kompleks dalam memanfaatkan prosesor (CPU) lebih efektif, bahkan pada komputer yang memiliki satu CPU. Dengan satu CPU, hanya satu utas yang dapat dieksekusi pada suatu waktu. Jika satu utas menjalankan operasi jangka panjang yang tidak menggunakan CPU, seperti disk baca atau tulis, salah satu utas lain dapat dijalankan hingga operasi pertama selesai. Dengan dapat menjalankan utas sementara utas lain menunggu operasi selesai, aplikasi dapat memaksimalkan penggunaan CPU. Ini sangat benar untuk aplikasi multi-pengguna yang intensif terhadap I/O disk, seperti server database. Komputer yang memiliki beberapa CPU dapat menjalankan satu utas per CPU secara bersamaan. Misalnya, jika komputer memiliki delapan CPU, komputer dapat menjalankan delapan utas secara bersamaan.
Penjadwalan tugas SQL Server
Dalam cakupan SQL Server, permintaan adalah representasi logis dari kueri atau batch. Permintaan juga mewakili operasi yang diperlukan oleh utas sistem, seperti titik pemeriksaan atau penulis log. Permintaan ada di berbagai status sepanjang siklus hidupnya dan dapat mengakumulasi waktu tunggu ketika sumber daya yang diperlukan untuk menjalankan permintaan tidak tersedia, seperti kunci atau kait. Untuk informasi selengkapnya tentang status permintaan, lihat sys.dm_exec_requests.
Tugas
Tugas mewakili unit kerja yang perlu diselesaikan untuk memenuhi permintaan. Satu atau beberapa tugas dapat ditetapkan ke satu permohonan.
- Permintaan paralel memiliki beberapa tugas aktif yang dijalankan secara bersamaan alih-alih secara serial, dengan satu tugas induk (atau tugas koordinasi) dan beberapa tugas turunan. Rencana pelaksanaan untuk permintaan paralel mungkin memiliki cabang berurutan - bagian dari rencana dengan operator yang tidak dijalankan secara paralel. Tugas induk juga bertanggung jawab untuk eksekusi operator-operator serial tersebut.
- Permintaan serial hanya memiliki satu tugas aktif pada titik waktu tertentu selama eksekusi. Tugas ada di berbagai status sepanjang siklus hidupnya. Untuk informasi selengkapnya tentang status tugas, lihat sys.dm_os_tasks. Tugas dalam status SUSPENDED menunggu agar sumber daya yang diperlukan untuk menjalankan tugas tersedia. Untuk informasi selengkapnya tentang tugas tunggu, lihat sys.dm_os_waiting_tasks.
Pekerja
Utas pekerja SQL Server, juga dikenal sebagai utas pekerja atau utas, adalah representasi logis dari utas sistem operasi. Saat menjalankan permintaan serial, Mesin Database SQL Server menelurkan pekerja untuk menjalankan tugas aktif (1:1). Saat menjalankan permintaan paralel dalam mode deret, Mesin Database SQL Server menetapkan pekerja untuk mengoordinasikan pekerja anak yang bertanggung jawab untuk menyelesaikan tugas yang ditugaskan kepada mereka (juga 1:1), yang disebut parent thread (atau utas koordinasi). Utas induk memiliki tugas induk yang terkait dengannya. Utas induk adalah titik masuk permintaan dan ada bahkan sebelum mesin mengurai kueri. Tanggung jawab utama utas induk adalah:
- Koordinasikan pemindaian paralel.
- Mulai pekerja anak paralel.
- Kumpulkan baris data dari utas paralel dan kirimkan ke klien.
- Lakukan agregasi lokal dan global.
Catatan
Jika rencana kueri memiliki cabang serial dan paralel, salah satu tugas paralel akan bertanggung jawab untuk menjalankan cabang serial.
Jumlah utas pekerja yang ditelurkan untuk setiap tugas tergantung pada:
Apakah permintaan memenuhi syarat untuk paralelisme seperti yang ditentukan oleh Pengoptimal Kueri.
Apa tingkat paralelisme (DOP) yang tersedia aktual dalam sistem, berdasarkan beban saat ini. Ini mungkin berbeda dari perkiraan DOP, yang didasarkan pada konfigurasi server untuk tingkat paralelisme maks (MAXDOP). Misalnya, konfigurasi server untuk MAXDOP mungkin 8 tetapi DOP yang tersedia saat runtime hanya bisa 2, yang memengaruhi performa kueri. Tekanan memori dan kurangnya pekerja adalah dua kondisi yang mengurangi DOP yang tersedia saat runtime.
Catatan
Batas tingkat paralelisme maksimum (MAXDOP) diatur per tugas, bukan per permintaan. Ini berarti bahwa selama eksekusi kueri paralel, satu permintaan dapat menghasilkan beberapa tugas hingga batas MAXDOP, dan setiap tugas akan menggunakan satu pekerja. Untuk informasi selengkapnya tentang MAXDOP, lihat Mengonfigurasi Opsi Konfigurasi Server Tingkat Paralelisme Maksimum.
Penjadwal
Penjadwal, juga dikenal sebagai penjadwal SOS, mengelola thread pekerja yang memerlukan pemrosesan untuk melakukan pekerjaan atas nama tugas. Setiap penjadwal dipetakan ke prosesor individual (CPU). Waktu pekerja dapat tetap aktif di penjadwal disebut kuantum OS, dengan maksimum 4 ms. Setelah waktu kuantum berakhir, pekerja menyerahkan waktunya kepada pekerja lain yang perlu mengakses sumber daya CPU, dan mengubah statusnya. Kerja sama antara thread pekerja untuk memaksimalkan akses ke sumber daya CPU ini disebut penjadwalan kooperatif, juga dikenal sebagai penjadwalan non-preemptif. Pada gilirannya, perubahan status pekerja disebarkan ke tugas yang terkait dengan pekerja tersebut, dan ke permintaan yang terkait dengan tugas. Untuk informasi selengkapnya tentang status pekerja, lihat sys.dm_os_workers. Untuk informasi selengkapnya tentang penjadwal, lihat sys.dm_os_schedulers.
Singkatnya, permintaan dapat menelurkan satu atau beberapa tugas untuk melakukan unit kerja. Setiap tugas ditetapkan ke benang pekerja yang bertanggung jawab untuk menyelesaikan tugas tersebut. Utas pekerja harus dijadwalkan (ditempatkan pada penjadwal) untuk eksekusi aktif tugas.
Pertimbangkan skenario berikut:
- Pekerja 1 melakukan tugas yang berjalan lama, seperti kueri baca yang menggunakan pembacaan awal pada tabel berbasis disk. Pekerja 1 menemukan halaman data yang diperlukan sudah ada di Buffer Pool, sehingga tidak perlu menghasilkan untuk menunggu operasi I/O, dan dapat menggunakan kuantum penuhnya sebelum menghasilkan.
- Pekerja 2 melakukan tugas sub-milidetik yang lebih pendek dan oleh karena itu diharuskan untuk menyerah sebelum jatah waktu penuhnya habis.
Dalam skenario ini dan hingga SQL Server 2014 (12.x), Pekerja 1 pada dasarnya diizinkan untuk memonopoli penjadwal dengan memiliki lebih banyak waktu kuantum secara keseluruhan.
Dimulai dengan SQL Server 2016 (13.x), penjadwalan kolaboratif mencakup penjadwalan Large Deficit First (LDF). Dengan penjadwalan LDF, pola penggunaan quantum computing dipantau dan satu thread pekerja tidak memonopoli penjadwal. Dalam skenario yang sama, Pekerja 2 diizinkan untuk mengonsumsi kuantum berulang sebelum Pekerja 1 diizinkan lebih banyak kuantum, oleh karena itu mencegah Pekerja 1 memonopoli penjadwal dalam pola yang tidak bersahabat.
Jadwal tugas paralel
Bayangkan SQL Server yang dikonfigurasi dengan MaxDOP 8, dan Afinitas CPU dikonfigurasi untuk 24 CPU (penjadwal) di seluruh node NUMA 0 dan 1. Penjadwal 0 hingga 11 milik simpul NUMA 0, penjadwal 12 hingga 23 milik simpul NUMA 1. Aplikasi mengirimkan kueri berikut (permintaan) ke Mesin Database:
SELECT h.SalesOrderID,
h.OrderDate,
h.DueDate,
h.ShipDate
FROM Sales.SalesOrderHeaderBulk AS h
INNER JOIN Sales.SalesOrderDetailBulk AS d
ON h.SalesOrderID = d.SalesOrderID
WHERE (h.OrderDate >= '2014-3-28 00:00:00');
Kiat
Contoh kueri dapat dijalankan menggunakan database sampel AdventureWorks2016_EXT. Tabel Sales.SalesOrderHeader
dan Sales.SalesOrderDetail
diperbesar 50 kali dan diubah namanya menjadi Sales.SalesOrderHeaderBulk
dan Sales.SalesOrderDetailBulk
.
Rencana eksekusi menunjukkan Gabungan Hash antara dua tabel, dan masing-masing operator dijalankan secara paralel, seperti yang ditunjukkan oleh lingkaran kuning dengan dua panah. Setiap operator Paralelisme adalah cabang yang berbeda dalam rencana. Oleh karena itu, ada tiga cabang dalam rencana eksekusi berikut.
Catatan
Jika Anda menganggap rencana eksekusi sebagai pohon, cabang adalah area rencana yang mengelompokkan satu atau beberapa operator antara operator Paralelisme, juga disebut Exchange Iterators. Untuk informasi selengkapnya tentang operator perencanaan, lihat Referensi Operator Logis dan Fisik Showplan.
Meskipun ada tiga cabang dalam rencana eksekusi, pada titik mana pun selama eksekusi hanya dua cabang yang dapat dijalankan secara bersamaan dalam rencana eksekusi ini:
- Cabang tempat Pemindaian Indeks Berkluster digunakan pada
Sales.SalesOrderHeaderBulk
(input build gabungan) dieksekusi secara terpisah. - Kemudian, cabang tempat Pemindaian Indeks Berkluster digunakan pada
Sales.SalesOrderDetailBulk
(input probe dari penggabungan) dijalankan bersamaan dengan cabang tempat Bitmap dibuat dan saat ini Hash Match sedang dieksekusi.
XML Showplan menunjukkan bahwa 16 utas pekerja dicadangkan dan digunakan pada simpul NUMA 0:
<ThreadStat Branches="2" UsedThreads="16">
<ThreadReservation NodeId="0" ReservedThreads="16" />
</ThreadStat>
Reservasi utas memastikan Mesin Database memiliki utas pekerja yang cukup untuk melakukan semua tugas yang diperlukan untuk permintaan tersebut. Utas dapat dicadangkan di beberapa simpul NUMA, atau dicadangkan hanya pada satu simpul NUMA. Reservasi utas dilakukan pada runtime sebelum eksekusi dimulai, dan bergantung pada beban penjadwal. Jumlah utas pekerja yang dipesan ditentukan secara umum dari rumus concurrent branches * runtime DOP
dan tidak termasuk utas pekerja utama. Setiap cabang terbatas pada jumlah utas pekerja yang sama dengan MaxDOP. Dalam contoh ini ada dua cabang bersamaan dan MaxDOP diatur ke 8, oleh karena itu 2 * 8 = 16
.
Sebagai referensi, amati rencana eksekusi langsung dari Statistik Kueri Langsung, di mana satu cabang telah selesai dan dua cabang sedang dijalankan secara bersamaan.
Mesin Database SQL Server menetapkan utas pekerja untuk menjalankan tugas aktif (1:1), yang dapat diamati selama eksekusi kueri dengan mengkueri sys.dm_os_tasks DMV, seperti yang terlihat dalam contoh berikut:
SELECT parent_task_address, task_address,
task_state, scheduler_id, worker_address
FROM sys.dm_os_tasks
WHERE session_id = <insert_session_id>
ORDER BY parent_task_address, scheduler_id;
Kiat
Kolom parent_task_address
selalu NULL untuk tugas induk.
Kiat
Dalam Mesin Database SQL Server yang sangat sibuk, dimungkinkan untuk melihat sejumlah tugas aktif yang melebihi batas yang telah ditentukan oleh thread yang telah dialokasikan. Tugas-tugas ini bisa menjadi bagian dari cabang yang tidak digunakan lagi dan dalam keadaan transisi, menunggu pembersihan.
Berikut kumpulan hasilnya. Perhatikan ada 17 tugas aktif untuk cabang yang saat ini sedang dieksekusi: 16 tugas turunan yang sesuai dengan utas yang dipesan, ditambah tugas induk, atau tugas pengoordinasi.
alamat_tugas_induk | alamat_tugas | task_state | scheduler_id | alamat_pekerja |
---|---|---|---|---|
NULL | 0x000001EF4758ACA8 |
DITANGGUHKAN | 3 | 0x000001EFE6CB6160 |
0x000001EF4758ACA8 | 0x000001EFE43F3468 | DITANGGUHKAN | 0 | 0x000001EF6DB70160 |
0x000001EF4758ACA8 | 0x000001EEB243A4E8 | DITANGGUHKAN | 0 | 0x000001EF6DB7A160 |
0x000001EF4758ACA8 | 0x000001EC86251468 | DITANGGUHKAN | 5 | 0x000001EEC05E8160 |
0x000001EF4758ACA8 | 0x000001EFE3023468 | DITANGGUHKAN | 5 | 0x000001EF6B46A160 |
0x000001EF4758ACA8 | 0x000001EFE3AF1468 | DITANGGUHKAN | 6 | 0x000001EF6BD38160 |
0x000001EF4758ACA8 | 0x000001EFE4AFCCA8 | DITANGGUHKAN | 6 | 0x000001EF6ACB4160 |
0x000001EF4758ACA8 | 0x000001EFDE043848 | DITANGGUHKAN | 7 | 0x000001EEA18C2160 |
0x000001EF4758ACA8 | 0x000001EF69038108 | DITANGGUHKAN | 7 | 0x000001EF6AEBA160 |
0x000001EF4758ACA8 | 0x000001EFCFDD8CA8 | DITANGGUHKAN | 8 | 0x000001EFCB6F0160 |
0x000001EF4758ACA8 | 0x000001EFCFDD88C8 | DITANGGUHKAN | 8 | 0x000001EF6DC46160 |
0x000001EF4758ACA8 | 0x000001EFBCC54108 | DITANGGUHKAN | 9 | 0x000001EFCB886160 |
0x000001EF4758ACA8 | 0x000001EC86279468 | DITANGGUHKAN | 9 | 0x000001EF6DE08160 |
0x000001EF4758ACA8 | 0x000001EFDE901848 | DITANGGUHKAN | 10 | 0x000001EFF56E0160 |
0x000001EF4758ACA8 | 0x000001EF6DB32108 | DITANGGUHKAN | 10 | 0x000001EFCC3D0160 |
0x000001EF4758ACA8 | 0x000001EC8628D468 | DITANGGUHKAN | 11 | 0x000001EFBFA4A160 |
0x000001EF4758ACA8 | 0x000001EFBD3A1C28 | DITANGGUHKAN | 11 | 0x000001EF6BD72160 |
Amati bahwa masing-masing dari 16 tugas anak memiliki utas pekerja yang berbeda yang ditetapkan (terlihat dalam kolom worker_address
), tetapi semua pekerja ditetapkan ke kumpulan yang sama dari delapan penjadwal (0,5,6,7,8,9,10,11), dan bahwa tugas induk ditetapkan ke penjadwal luar kumpulan ini (3).
Penting
Setelah serangkaian tugas paralel pertama pada cabang tertentu dijadwalkan, Mesin Database akan menggunakan kumpulan penjadwal yang sama untuk tugas tambahan apa pun di cabang lain. Ini berarti set penjadwal yang sama akan digunakan untuk semua tugas paralel dalam seluruh rencana eksekusi, hanya dibatasi oleh MaxDOP.
Mesin Database SQL Server akan selalu mencoba menetapkan penjadwal dari simpul NUMA yang sama untuk eksekusi tugas, dan menetapkannya secara berurutan (dengan cara round-robin) jika penjadwal tersedia. Namun, utas pekerja yang ditetapkan untuk tugas induk mungkin ditempatkan di node NUMA yang berbeda dari tugas-tugas lainnya.
Thread pekerja hanya dapat tetap aktif dalam penjadwal selama kuantumnya (4 ms) dan harus menyerahkan penjadwalnya setelah kuantum tersebut berlalu, agar thread pekerja yang ditugaskan ke tugas lain dapat menjadi aktif. Ketika kuantum pekerja habis dan tidak lagi aktif, tugas masing-masing ditempatkan dalam antrean FIFO dalam status RUNNABLE, sampai berpindah ke status RUNNING lagi, dengan syarat tugas tersebut tidak memerlukan akses ke sumber daya yang saat ini tidak tersedia, seperti pengait atau kunci, dalam hal ini tugas akan ditempatkan dalam status SUSPENDED alih-alih RUNNABLE, hingga sumber daya tersebut tersedia.
Kiat
Untuk output DMV yang ditampilkan di atas, semua tugas aktif berstatus SUSPENDED. Detail selengkapnya tentang tugas tunggu tersedia dengan mengkueri sys.dm_os_waiting_tasks DMV.
Singkatnya, permintaan paralel menghasilkan beberapa tugas. Setiap tugas harus diberikan kepada satu utas pekerja. Setiap utas pekerja harus ditugaskan kepada satu penjadwal saja. Oleh karena itu, jumlah penjadwal yang digunakan tidak boleh melebihi jumlah tugas paralel per cabang, yang diatur oleh konfigurasi MaxDOP atau petunjuk kueri. Alur koordinasi tidak berkontribusi pada batas MaxDOP.
Alokasi utas ke CPU
Secara default, setiap instans SQL Server memulai setiap utas, dan sistem operasi mendistribusikan utas dari instans SQL Server di antara prosesor (CPU) di komputer, berdasarkan beban. Jika afinitas proses telah diaktifkan di tingkat sistem operasi, maka sistem operasi menetapkan setiap utas ke CPU tertentu. Sebaliknya, SQL Server Database Engine menetapkan worker threads SQL Server ke schedulers yang mendistribusikan utas secara merata di antara CPU, dengan cara round-robin.
Untuk menangani multitasking, misalnya ketika beberapa aplikasi mengakses set CPU yang sama, sistem operasi terkadang memindahkan thread pekerja antar CPU yang berbeda. Meskipun efisien dari sudut pandang sistem operasi, aktivitas ini dapat mengurangi performa SQL Server di bawah beban sistem berat, karena setiap cache prosesor berulang kali dimuat ulang dengan data. Menetapkan CPU ke utas tertentu dapat meningkatkan performa dalam kondisi ini dengan menghilangkan beban ulang prosesor dan mengurangi migrasi utas di seluruh CPU (sehingga mengurangi pengalihan konteks); hubungan seperti itu antara utas dan prosesor disebut afinitas prosesor. Jika afinitas telah diaktifkan, sistem operasi menetapkan setiap utas ke CPU tertentu.
Opsi masker afinitas diatur dengan menggunakan ALTER SERVER CONFIGURATION. Ketika mask afinitas tidak diatur, instance SQL Server mengalokasikan utas pekerja secara merata di antara penjadwal yang belum ditutupi masker afinitas.
Perhatian
Jangan mengonfigurasi afinitas CPU dalam sistem operasi dan juga mengonfigurasi masker afinitas di SQL Server. Pengaturan ini mencoba mencapai hasil yang sama, dan jika konfigurasi tidak konsisten, Anda mungkin memiliki hasil yang tidak dapat diprediksi. Untuk informasi selengkapnya, lihat opsi masker afinitas.
Pemrosesan utas membantu mengoptimalkan kinerja ketika banyak klien terhubung ke server. Biasanya, utas sistem operasi terpisah dibuat untuk setiap permintaan pencarian. Namun, dengan ratusan koneksi ke server, menggunakan satu utas untuk setiap permintaan kueri dapat menggunakan sumber daya sistem dalam jumlah yang besar. Opsi max worker threads memungkinkan SQL Server membuat kumpulan utas pekerja untuk melayani permintaan kueri dalam jumlah besar, yang meningkatkan kinerja.
Penggunaan opsi pengumpulan ringan
Beban tambahan yang terlibat dalam mengalihkan konteks utas mungkin tidak terlalu besar. Sebagian besar instans SQL Server tidak melihat perbedaan performa antara pengaturan opsi pengumpulan ringan ke 0 atau 1. Satu-satunya instans SQL Server yang mungkin mendapat manfaat dari pengumpulan ringan adalah instans yang berjalan di komputer yang memiliki karakteristik berikut:
- Server multi-CPU besar
- Semua CPU berjalan mendekati kapasitas maksimum
- Ada tingkat pengalihan konteks yang tinggi
Sistem ini mungkin melihat peningkatan kecil dalam performa jika nilai pengumpulan ringan diatur ke 1.
Penting
Jangan gunakan penjadwalan fiber mode untuk operasi rutin. Ini dapat mengurangi performa dengan menghambat keuntungan umum dari peralihan konteks, dan karena beberapa komponen SQL Server tidak dapat berfungsi dengan benar dalam mode fiber. Untuk informasi selengkapnya, lihat lightweight pooling.
Eksekusi utas dan serat
Microsoft Windows menggunakan sistem prioritas numerik yang berkisar antara 1 hingga 31 untuk menjadwalkan utas untuk eksekusi. Nol disediakan untuk keperluan sistem operasi. Ketika beberapa utas menunggu untuk dijalankan, Windows mengirimkan utas dengan prioritas tertinggi.
Secara default, setiap instans SQL Server adalah prioritas 7, yang disebut sebagai prioritas normal. Default ini memberikan alur SQL Server prioritas yang cukup tinggi untuk mendapatkan sumber daya CPU yang memadai tanpa memengaruhi aplikasi lain.
Penting
Fitur ini akan dihapus dalam versi SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.
Priority boost opsi konfigurasi dapat digunakan untuk meningkatkan prioritas utas dari instans SQL Server menjadi 13. Ini disebut sebagai prioritas tinggi. Pengaturan ini memberi alur SQL Server prioritas yang lebih tinggi daripada sebagian besar aplikasi lainnya. Dengan demikian, utas SQL Server umumnya akan dikirim setiap kali mereka siap untuk dijalankan dan tidak didahului oleh utas dari aplikasi lain. Ini dapat meningkatkan performa ketika server hanya menjalankan instans SQL Server dan tidak ada aplikasi lain. Namun, jika operasi intensif memori terjadi di SQL Server, aplikasi lain tidak mungkin memiliki prioritas yang cukup tinggi untuk mengganggu utas SQL Server.
Jika Anda menjalankan beberapa instans SQL Server di komputer, dan mengaktifkan peningkatan prioritas hanya untuk beberapa instans, performa instans apa pun yang berjalan pada prioritas normal dapat terpengaruh secara merugikan. Selain itu, performa aplikasi dan komponen lain di server dapat menurun jika peningkatan prioritas diaktifkan. Oleh karena itu, itu hanya boleh digunakan dalam kondisi yang dikontrol dengan ketat.
Penambahan CPU secara langsung
Hot add CPU adalah kemampuan untuk menambahkan CPU secara dinamis ke sistem yang sedang berjalan. Menambahkan CPU dapat terjadi secara fisik dengan menambahkan perangkat keras baru, secara logis dengan partisi perangkat keras online, atau hampir melalui lapisan virtualisasi. SQL Server mendukung penambahan CPU tanpa mematikan sistem (hot add CPU).
Persyaratan untuk CPU hot-add:
- Memerlukan perangkat keras yang mendukung penambahan CPU secara dinamis.
- Memerlukan versi Windows Server Datacenter atau edisi Enterprise yang didukung. Dimulai dengan Windows Server 2012, hot add didukung pada edisi Standar.
- Membutuhkan SQL Server edisi Enterprise.
- SQL Server tidak dapat dikonfigurasi untuk menggunakan NUMA lunak. Untuk informasi selengkapnya tentang NUMA lunak, lihat Soft-NUMA (SQL Server).
SQL Server tidak secara otomatis menggunakan CPU setelah ditambahkan. Ini mencegah SQL Server menggunakan CPU yang mungkin ditambahkan untuk tujuan lain. Setelah menambahkan CPU, jalankan pernyataan KONFIGURASI ULANG, sehingga SQL Server akan mengenali CPU baru sebagai sumber daya yang tersedia.
Catatan
Apabila masker afinitas64 dikonfigurasi, maka masker afinitas64 harus dimodifikasi agar dapat menggunakan CPU baru.
Praktik terbaik untuk menjalankan SQL Server di komputer yang memiliki lebih dari 64 CPU
Penugasan utas perangkat keras ke CPU
Jangan gunakan opsi konfigurasi server masker afinitas dan masker afinitas64 untuk mengaitkan prosesor dengan utas tertentu. Opsi ini dibatasi hingga 64 CPU. Gunakan opsi SET PROCESS AFFINITY
sebagai gantinya.
Manajemen ukuran file log transaksi
Jangan mengandalkan autogrow untuk meningkatkan ukuran file log transaksi. Meningkatkan log transaksi harus merupakan proses serial. Memperluas log dapat mencegah operasi penulisan transaksi dilanjutkan hingga ekstensi log selesai. Sebagai gantinya, pra-alokasikan ruang untuk file log dengan mengatur ukuran file ke nilai yang cukup besar untuk mendukung beban kerja umum di lingkungan.
Mengatur tingkat paralelisme maksimum untuk operasi indeks
Performa operasi indeks seperti membuat atau membangun ulang indeks dapat ditingkatkan pada komputer yang memiliki banyak CPU dengan mengatur model pemulihan database untuk sementara ke model pemulihan yang dicatat secara massal atau sederhana. Operasi indeks ini dapat menghasilkan aktivitas log yang signifikan dan ketidakcocokan log dapat memengaruhi tingkat paralelisme terbaik (DOP) pilihan yang dibuat oleh SQL Server.
Selain menyesuaikan tingkat maksimum derajat paralelisme (MAXDOP) pada opsi konfigurasi server, pertimbangkan untuk menyesuaikan paralelisme untuk operasi indeks menggunakan opsi MAXDOP. Untuk informasi selengkapnya, lihat Mengonfigurasi Operasi Indeks Paralel. Untuk informasi dan panduan selengkapnya tentang menyesuaikan tingkat maksimum opsi konfigurasi server paralelisme, lihat Mengonfigurasi tingkat maksimum opsi konfigurasi server paralelisme.
Opsi jumlah maksimum utas pekerja
SQL Server secara dinamis mengonfigurasi opsi konfigurasi server jumlah utas pekerja maksimum saat awal mula. SQL Server menggunakan jumlah CPU yang tersedia dan arsitektur sistem untuk menentukan konfigurasi server ini selama startup, menggunakan rumus yang didokumentasikan.
Opsi ini adalah opsi lanjutan dan harus diubah hanya oleh administrator database berpengalaman atau profesional SQL Server bersertifikat. Jika Anda menduga ada masalah performa, kemungkinan besar bukan karena ketersediaan thread pekerja. Penyebabnya kemungkinan besar adalah sesuatu seperti I/O yang menyebabkan thread pekerja menunggu. Sebaiknya menemukan akar penyebab masalah performa sebelum Anda mengubah pengaturan utas pekerja maksimum. Namun, jika Anda perlu mengatur jumlah maksimum utas pekerja secara manual, nilai konfigurasi ini harus selalu diatur ke nilai setidaknya tujuh kali jumlah CPU yang ada di sistem. Untuk informasi selengkapnya, lihat Mengonfigurasi utas pekerja maksimum.
Hindari penggunaan SQL Trace dan SQL Server Profiler
Kami menyarankan agar Anda tidak menggunakan SQL Trace dan SQL Profiler di lingkungan produksi. Overhead untuk menjalankan alat-alat ini juga meningkat saat jumlah CPU meningkat. Jika Anda harus menggunakan SQL Trace di lingkungan produksi, batasi jumlah peristiwa pelacakan minimal. Profilkan dan uji setiap peristiwa pelacakan dengan hati-hati di bawah beban, dan hindari menggunakan kombinasi peristiwa yang secara signifikan memengaruhi performa.
Penting
SQL Trace dan SQL Server Profiler dihentikan. Namespace Microsoft.SqlServer.Management.Trace yang berisi objek SQL Server Trace dan Replay juga tidak digunakan lagi.
Fitur ini akan dihapus dalam versi SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.
Gunakan Extended Events sebagai gantinya. Untuk informasi selengkapnya tentang Peristiwa yang Diperluas, lihat Mulai Cepat: Peristiwa yang diperluas di SQL Server dan SSMS XEvent Profiler.
Catatan
SQL Server Profiler untuk beban kerja Analysis Services TIDAK dihentikan, dan akan terus didukung.
Atur jumlah file data tempdb
Jumlah file tergantung pada jumlah prosesor (logis) pada komputer. Sebagai aturan umum, jika jumlah prosesor logis kurang dari atau sama dengan delapan, gunakan jumlah file data yang sama dengan prosesor logis. Jika jumlah prosesor logis lebih besar dari delapan, gunakan delapan file data dan kemudian jika pertikaian berlanjut, tingkatkan jumlah file data dengan kelipatan 4 hingga ketidakcocokan dikurangi ke tingkat yang dapat diterima atau buat perubahan pada beban kerja/kode. Perlu diingat juga rekomendasi lain untuk tempdb
, tersedia dalam Mengoptimalkan performa tempdb di SQL Server.
Namun, dengan hati-hati mempertimbangkan kebutuhan konkurensi tempdb
, Anda dapat mengurangi overhead manajemen database. Misalnya, jika sistem memiliki 64 CPU dan biasanya hanya 32 kueri yang menggunakan tempdb
, meningkatkan jumlah tempdb
file menjadi 64 tidak akan meningkatkan performa.
Komponen SQL Server yang dapat menggunakan lebih dari 64 CPU
Tabel berikut mencantumkan komponen SQL Server dan menunjukkan apakah mereka dapat menggunakan lebih dari 64 CPU tersebut.
Nama proses | Program yang dapat dieksekusi | Gunakan lebih dari 64 CPU |
---|---|---|
Mesin Utama Database SQL Server | Sqlserver.exe | Ya |
Layanan Pelaporan | Rs.exe | Tidak |
Layanan Analisis (Analysis Services) | As.exe | Tidak |
Layanan Integrasi | Is.exe | Tidak |
Broker Layanan | Sb.exe | Tidak |
Pencarian teks-lengkap | Fts.exe | Tidak |
SQL Server Agent (Agen dari SQL Server) | Sqlagent.exe | Tidak |
SQL Server Management Studio | Ssms.exe | Tidak |
Penyiapan SQL Server | Setup.exe | Tidak |