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 di Linux
Artikel ini membahas konfigurasi memori untuk SQL Server on Linux, termasuk mssql-conf batas memori, pengaturan grup kontrol (cgroup), contoh memori kontainer Docker, dan pertimbangan ruang pertukaran.
Note
Untuk rekomendasi penyimpanan, kernel, CPU, dan jaringan, lihat Praktik terbaik performa: Penyimpanan, kernel, CPU, dan jaringan untuk SQL Server on Linux.
Mengatur batas memori menggunakan mssql-conf
Untuk memastikan ada cukup memori fisik gratis untuk sistem operasi Linux, proses SQL Server hanya menggunakan 80 persen RAM fisik secara default. Untuk beberapa sistem dengan RAM fisik dalam jumlah besar, 20 persen mungkin merupakan angka yang signifikan. Misalnya, pada sistem dengan RAM 1 TB, pengaturan default meninggalkan sekitar 200 GB RAM yang tidak digunakan. Dalam situasi ini, Anda mungkin ingin mengonfigurasi batas memori ke nilai yang lebih tinggi.
Anda dapat menyesuaikan nilai ini menggunakan mssql-conf alat atau MSSQL_MEMORY_LIMIT_MB variabel lingkungan. Untuk informasi selengkapnya, lihat pengaturan memory.memorylimitmb yang mengontrol memori yang terlihat oleh SQL Server (dalam unit MB). Untuk panduan ukuran terperinci, lihat Panduan untuk mengatur batas memori di Linux dan dalam kontainer.
Dukungan untuk cgroup (control group) v2
SQL Server mendeteksi dan menghormati batasan grup kontrol (cgroup) v2, dimulai dengan SQL Server 2025 (17.x) dan SQL Server 2022 (16.x) Pembaruan Kumulatif (CU) 20. Batasan ini memberikan kontrol mendetail di kernel Linux melalui sumber daya CPU dan memori, dan meningkatkan isolasi sumber daya di lingkungan Docker, Kubernetes, dan OpenShift.
Dalam versi sebelumnya, penyebaran kontainer pada kluster Kubernetes (misalnya, Azure Kubernetes Service v1.25+) dapat mengalami kesalahan kehabisan memori (OOM) karena SQL Server tidak memberlakukan batas memori yang ditentukan dalam spesifikasi kontainer. Dukungan untuk cgroup v2 mengatasi masalah ini.
Periksa versi cgroup
stat -fc %T /sys/fs/cgroup
Hasilnya adalah sebagai berikut:
| Result | Deskripsi |
|---|---|
cgroup2fs |
Anda menggunakan cgroup v2 |
cgroup |
Anda menggunakan cgroup v1 |
Beralih ke cgroup v2
Jalur termudah adalah memilih distribusi yang mendukung cgroup v2 secara default.
Jika Anda perlu beralih secara manual, tambahkan parameter berikut ke konfigurasi GRUB Anda:
systemd.unified_cgroup_hierarchy=1
Kemudian perbarui GRUB. Misalnya, di Ubuntu, jalankan:
sudo update-grub
Di Red Hat Enterprise Linux (RHEL), jalankan:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Pelaporan batas CPU dengan cgroup v2
Saat Anda mengonfigurasi batas CPU menggunakan cgroup v2, SQL Server tidak menampilkan jumlah inti CPU yang dikonfigurasi dalam log kesalahan. Sebaliknya, ia terus melaporkan jumlah total CPU host.
Untuk menyelaraskan penjadwal tugas SQL Server dan rencana kueri (misalnya, pengambilan keputusan paralelisme) dengan jumlah CPU yang diinginkan yang ditentukan dalam cgroup v2, Anda dapat menerapkan konfigurasi berikut.
Mengonfigurasi afinitas prosesor
Atur afinitas prosesor SQL Server secara eksplisit agar sesuai dengan kuota eksekusi cgroup. Dalam contoh berikut, kuota cgroup adalah empat CPU pada host delapan inti:
ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;
Konfigurasi ini memastikan bahwa SQL Server membuat penjadwal hanya untuk jumlah CPU yang dimaksudkan. Untuk informasi selengkapnya, lihat ALTER SERVER CONFIGURATION dan Menggunakan PROCESS AFFINITY untuk Node dan/atau CPU.
Aktifkan bendera pelacakan 8002 (disarankan)
Aktifkan bendera pelacakan 8002 untuk menggunakan afinitas lunak di lapisan SQLPAL:
sudo /opt/mssql/bin/mssql-conf traceflag 8002 on
Secara default, penjadwal terikat ke CPU tertentu yang ditentukan dalam masker afinitas. Penanda jejak 8002 memungkinkan penjadwal untuk berpindah antar CPU, yang umumnya meningkatkan performa sambil tetap menghormati batasan afinitas dan cgroup. Untuk informasi selengkapnya, lihat DBCC TRACEON - Trace Flags.
Mulai ulang SQL Server setelah mengaktifkan bendera pelacakan.
Perilaku yang diharapkan
Setelah menghidupkan ulang:
SQL Server hanya membuat jumlah penjadwal yang ditentukan oleh pengaturan afinitas (misalnya, empat penjadwal).
Kernel Linux terus memberlakukan kuota eksekusi CPU cgroup v2.
Keputusan optimasi kueri dan paralelisme didasarkan pada jumlah CPU yang direncanakan, bukan total CPU host.
Note
Log kesalahan SQL Server mungkin terus menampilkan jumlah CPU host total. Perilaku pengelogan dan tampilan ini tidak memengaruhi penggunaan CPU aktual, pembuatan penjadwal, atau penegakan CPU oleh cgroup v2 atau afinitas prosesor.
Untuk informasi selengkapnya, lihat sumber daya berikut ini:
- Mulai cepat: Menyebarkan kontainer SQL Server Linux ke Kubernetes menggunakan bagan Helm
- Grup Kontrol v2 (dokumentasi Kernel Linux)
Panduan untuk mengatur batas memori di Linux dan dalam kontainer
SQL Server on Linux memiliki beberapa kontrol memori yang beroperasi pada tingkat yang berbeda. Tabel dan diagram berikut menunjukkan bagaimana setiap tingkat mempersempit memori yang tersedia, dari RAM host ke kumpulan buffer.
| Tingkat | Diatur oleh | Deskripsi |
|---|---|---|
| Host | Konfigurasi perangkat keras /VM | RAM fisik di server atau komputer virtual (VM). |
batas cgroup (docker run --memory, systemd, atau manual) |
runtime kontainer, systemd slice, atau konfigurasi manual cgroup |
Batas maksimum yang diterapkan oleh kernel (memory.max) untuk semua proses di cgroup. Opsional pada Linux bare-metal. |
proses SQL Server (memorylimitmb / MSSQL_MEMORY_LIMIT_MB) |
mssql-conf atau variabel lingkungan |
Total memori di semua komponen SQL Server. Harus kurang dari batas cgroup (jika ada) atau memori host. |
Kumpulan buffer (max_server_memory) |
sp_configure |
Cache dari halaman data 8 KB. Harus lebih rendah dari memorylimitmb. |
| Ruang kepala | Dihitung (kesenjangan antar batas) | Kesenjangan antara batas cgroup (atau memori host) dan memorylimitmb, yang dicadangkan untuk overhead OS dan proses pendukung. |
Saat mengatur batas memori untuk SQL Server di Linux, pertimbangkan panduan berikut:
Dalam penyebaran kontainer, gunakan
cgroupuntuk membatasi memori keseluruhan yang tersedia untuk kontainer. Pengaturan ini menetapkan batas atas untuk semua proses di dalam kontainer.Batas memori (baik diatur oleh
memorylimitmbatauMSSQL_MEMORY_LIMIT_MBvariabel lingkungan) mengontrol total memori yang dapat dialokasikan SQL Server di Linux di semua komponennya, seperti kumpulan buffer, SQLPAL, SQL Server Agent, LibOS, PolyBase, Full-Text Search, dan proses lain yang dimuat di SQL Server di Linux.Variabel
MSSQL_MEMORY_LIMIT_MBlingkungan lebih diutamakan daripadamemorylimitmbyang ditentukan dalammssql.conf.memorylimitmbtidak dapat melebihi memori fisik aktual dari sistem host.Atur
memorylimitmblebih rendah dari memori sistem host dancgroupbatas (jika ada), untuk memastikan ada cukup memori fisik gratis untuk sistem operasi Linux. Jika Anda tidak secara eksplisit mengaturmemorylimitmb, SQL Server menggunakan 80 persen dari nilai yang lebih rendah antara total memori sistem dancgroupbatas (jika ada).Opsi konfigurasi server max_server_memory hanya membatasi ukuran kumpulan buffer SQL Server, dan tidak mengatur penggunaan memori keseluruhan untuk SQL Server di Linux. Selalu atur nilai ini lebih rendah daripada
memorylimitmbuntuk memastikan memori yang memadai tetap untuk komponen lain yang dijelaskan dalam poin sebelumnya.
Selisih antara batas memori SQL Server dan batas memori kontainer
Saat Anda menjalankan SQL Server di dalam kontainer dengan batas memori yang dikonfigurasi (misalnya, setelan cgroupmemory.max), sisakan ruang cadangan memori antara memory.memorylimitmb dan batas memori kontainer. Ruang kepala ini menyediakan sistem operasi overhead dan proses tambahan di dalam kontainer.
Untuk sebagian besar deployment, cadangkan antara 10% dan 20% memori kontainer untuk sistem operasi dan proses non-SQL Server, lalu atur
memory.memorylimitmbke nilai yang lebih rendah dari sisa kapasitas yang tersedia.Untuk konfigurasi memori besar, buffer berbasis persentase dapat mencadangkan lebih banyak memori daripada yang diperlukan. Misalnya, 10 persen dari kontainer 256 GB adalah sekitar 25 GB, yang wajar untuk overhead sistem operasi. Namun, 10 persen dari kontainer 512 GB sekitar 51 GB, yang kemungkinan lebih dari yang dibutuhkan sistem operasi. Dalam kasus ini, gunakan buffer tetap sebagai gantinya, berukuran tepat untuk beban kerja dan overhead sistem operasi Anda, dan alokasikan sisanya untuk SQL Server.
Sesuaikan buffer berdasarkan karakteristik beban kerja, layanan lain yang berjalan dalam kontainer, dan konfigurasi host.
Note
Tidak ada satu nilai ruang kepala yang direkomendasikan yang berlaku untuk semua lingkungan. Validasi pengaturan memori melalui pengujian untuk memastikan stabilitas sistem di bawah beban puncak.
Hindari mengonfigurasi batas memori yang lebih tinggi dari memori yang tersedia
Jangan mengonfigurasi memory.memorylimitmb lebih tinggi dari memori fisik yang tersedia pada host atau lebih tinggi dari batas memori yang diberlakukan kontainer. Jika Anda melakukannya, SQL Server mungkin secara agresif mengonsumsi memori, meninggalkan kapasitas yang tidak mencukupi untuk sistem operasi dan proses pendukung. Konfigurasi ini dapat mengakibatkan:
- Peningkatan tekanan memori.
- Mengurangi stabilitas sistem dan gangguan layanan yang tidak terduga.
- Sistem operasi menghentikan proses
sqlservrkarena kondisi kehabisan memori (OOM).
Konfigurasikan batas memori SQL Server di bawah memori efektif yang tersedia untuk host atau kontainer, dan biarkan ruang buffer yang memadai untuk sistem operasi dan layanan runtime.
Contoh konfigurasi memori Docker
Opsi docker run --memory mengatur cgroup batas memori untuk kontainer. Batas ini adalah batas maksimum mutlak yang ditegakkan oleh kernel untuk semua proses dalam kontainer.
MSSQL_MEMORY_LIMIT_MB(atau memory.memorylimitmb) mengontrol berapa banyak memori yang dapat digunakan SQL Server. Seperti yang dijelaskan dalam pedoman sebelumnya, selalu tetapkan MSSQL_MEMORY_LIMIT_MB lebih rendah daripada batas memori kontainer agar tersedia ruang cadangan untuk sistem operasi dan proses tambahan.
Contoh berikut menggunakan host dengan RAM 16 GB. Sesuaikan nilai untuk lingkungan Anda.
Tidak disarankan: tidak ada batas memori kontainer
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-e "MSSQL_MEMORY_LIMIT_MB=14336" \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
Tanpa --memory, kontainer tidak memiliki cgroup batas atas.
MSSQL_MEMORY_LIMIT_MBmembatasi SQL Server, tetapi proses lain di dalam kontainer masih dapat mengonsumsi memori host yang tidak terbatas.
Tidak disarankan: batas memori sama dengan batas memori SQL Server
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-e "MSSQL_MEMORY_LIMIT_MB=12288" \
--memory 12g \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
Kedua batas diatur ke 12 GB (--memory 12g = 12.288 MB). Tidak ada cadangan kapasitas yang tersisa untuk overhead sistem operasi atau proses pendukung, yang dapat menyebabkan penghentian paksa akibat OOM.
Tidak disarankan: batas memori SQL Server melebihi batas kontainer
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-e "MSSQL_MEMORY_LIMIT_MB=14336" \
--memory 12g \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
MSSQL_MEMORY_LIMIT_MB (14 GB) melebihi batas kontainer (12 GB). Skenario ini mengarah pada kondisi OOM yang dijelaskan dalam Hindari mengonfigurasi batas memori lebih tinggi dari memori yang tersedia.
Disarankan: batas kontainer dengan ruang cadangan untuk sistem operasi
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-e "MSSQL_MEMORY_LIMIT_MB=10240" \
--memory 12g \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
Kontainer dibatasi hingga 12 GB (--memory 12g), dan SQL Server dikonfigurasi untuk menggunakan hingga 10 GB (MSSQL_MEMORY_LIMIT_MB=10240). Sisanya 2 GB (sekitar 17 persen) menyediakan headroom untuk sistem operasi dan proses lainnya.
Pertimbangan ruang pertukaran
Saat Anda menjalankan SQL Server dalam kontainer, aktifkan ruang pertukaran di tingkat host untuk membantu melindungi sistem operasi dan proses non-SQL Server. Namun, konfigurasikan SQL Server untuk beroperasi dalam batas memori yang dikonfigurasi, dan jangan mengandalkan pertukaran selama operasi normal.
Ikuti panduan batas memori untuk memastikan SQL Server beroperasi dalam memori fisik atau batas memori yang berlaku
cgroup.Jika swap diaktifkan, perlakukan hal itu sebagai pengaman untuk tekanan sementara pada memori host, bukan sebagai kapasitas bagi beban kerja SQL Server dalam kondisi stabil.
Important
Kinerja SQL Server dapat menurun secara signifikan jika tekanan memori menyebabkan swap. Ukuran memori yang tepat adalah mekanisme utama untuk mencegah kegagalan terkait memori.