Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:Linux üzerinde SQL Server
Bu makale, bellek sınırları, denetim grubu (mssql-conf) ayarları, Docker kapsayıcısı bellek örnekleri ve takas alanı konuları dahil olmak üzere cgroup Linux üzerinde SQL Server için bellek yapılandırmasını kapsar.
Note
Depolama, çekirdek, CPU ve ağ önerileri için bkz. Performans için en iyi yöntemler: Linux üzerinde SQL Server için depolama, çekirdek, CPU ve ağ.
mssql-conf kullanarak bellek sınırı ayarlama
Linux işletim sistemi için yeterli boş fiziksel bellek olduğundan emin olmak için, SQL Server işlemi varsayılan olarak fiziksel RAM'in yalnızca yüzde 80'ini kullanır. Büyük miktarda fiziksel RAM'e sahip bazı sistemlerde yüzde 20 önemli bir sayı olabilir. Örneğin, 1 TB RAM'e sahip bir sistemde varsayılan ayar yaklaşık 200 GB RAM'i kullanılmamış olarak bırakır. Bu durumda, bellek sınırını daha yüksek bir değerle yapılandırmak isteyebilirsiniz.
Bu değeri mssql-conf aracı veya MSSQL_MEMORY_LIMIT_MB ortam değişkenini kullanarak ayarlayabilirsiniz. Daha fazla bilgi için, SQL Server tarafından görünen belleği denetleyen memory.memorylimitmb ayarına (MB cinsinden) bkz. Ayrıntılı boyutlandırma kılavuzu için bkz. Linux'ta ve kapsayıcılarda bellek sınırlarını ayarlama yönergeleri.
Denetim grubu (cgroup) v2 desteği
SQL Server, SQL Server 2025 (17.x) ve SQL Server 2022 (16.x) Toplu Güncelleştirme (CU) 20'den başlayarak denetim grubu (cgroup) v2 kısıtlamalarını algılar ve kabul eder. Bu kısıtlamalar Linux çekirdeğinde CPU ve bellek kaynakları üzerinde ayrıntılı denetim sağlar ve Docker, Kubernetes ve OpenShift ortamlarında kaynak yalıtımını geliştirir.
Önceki sürümlerde Kubernetes kümelerindeki kapsayıcılı dağıtımlar (örneğin, Azure Kubernetes Service v1.25+), SQL Server kapsayıcı belirtimlerinde tanımlanan bellek sınırlarını zorlamadığından bellek yetersiz (OOM) hatalarıyla karşılaşabiliyordu. Cgroup v2 desteği bu sorunu giderir.
Cgroup sürümünü denetleme
stat -fc %T /sys/fs/cgroup
Sonuçlar aşağıdaki gibidir:
| Result | Description |
|---|---|
cgroup2fs |
cgroup v2 kullanıyorsunuz |
cgroup |
cgroup v1 kullanıyorsunuz |
cgroup v2'ye geçme
En kolay yol, kutudan çıkararak cgroup v2'yi destekleyen bir dağıtım seçmektir.
El ile geçiş yapmanız gerekiyorsa GRUB yapılandırmanıza aşağıdaki parametreyi ekleyin:
systemd.unified_cgroup_hierarchy=1
Ardından GRUB'yi güncelleştirin. Örneğin Ubuntu'da şunu çalıştırın:
sudo update-grub
Red Hat Enterprise Linux'ta (RHEL) şu komutu çalıştırın:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
cgroup v2 ile CPU sınırı raporlaması
cgroup v2 kullanarak CPU sınırlarını yapılandırdığınızda, SQL Server hata günlüğünde yapılandırılmış CPU çekirdek sayısını göstermez. Bunun yerine, toplam konak CPU sayısını raporlamaya devam eder.
SQL Server zamanlayıcı ve sorgu planlarını (örneğin, paralellik kararları) cgroup v2'de tanımlanan hedefLENEN CPU sayısıyla hizalamak için aşağıdaki yapılandırmayı uygulayın.
İşlemci benzitesini yapılandırma
SQL Server işlemci benzitesini açıkça cgroup yürütme kotasıyla eşleşecek şekilde ayarlayın. Aşağıdaki örnekte, cgroup kotası sekiz çekirdekli bir konakta dört CPU'dur:
ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;
Bu yapılandırma, SQL Server yalnızca hedeflenen CPU sayısı için zamanlayıcılar oluşturmasını sağlar. Daha fazla bilgi için bkz ALTER SERVER CONFIGURATION . node ve/veya CPU'lar için İŞLEM BENTERSİmİ kullanma.
İzleme bayrağı 8002'yi etkinleştirme (önerilir)
SQLPAL katmanında yumuşak benzeşimi kullanmak için izleme bayrağı 8002'yi etkinleştirin:
sudo /opt/mssql/bin/mssql-conf traceflag 8002 on
Zamanlayıcılar varsayılan olarak benşim maskesinde tanımlanan belirli CPU'lara bağlıdır. İzleme bayrağı 8002, zamanlayıcıların bunun yerine CPU'lar arasında hareket etmesine olanak tanır ve bu da genellikle yakınlık ve cgroup kısıtlamalarına saygı gösterirken performansı artırır. Daha fazla bilgi için bkz. DBCC TRACEON - İzleme Bayrakları.
İzleme bayrağını etkinleştirdikten sonra SQL Server yeniden başlatın.
Beklenen davranış
Yeniden başlatıldıktan sonra:
SQL Server yalnızca benşim ayarı tarafından tanımlanan zamanlayıcı sayısını (örneğin, dört zamanlayıcı) oluşturur.
Linux çekirdeği cgroup v2 CPU yürütme kotasını zorlamaya devam eder.
Sorgu iyileştirme ve paralellik kararları, toplam konak CPU'lar yerine hedeflenen CPU sayısını temel alır.
Note
SQL Server hata günlüğü, toplam konak CPU sayısını görüntülemeye devam edebilir. Bu günlüğe kaydetme ve görüntüleme davranışı, cgroup v2 veya işlemci benzenşimi tarafından gerçek CPU kullanımını, zamanlayıcı oluşturmayı veya CPU zorlamasını etkilemez.
Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:
- Hızlı Başlangıç: Helm grafiklerini kullanarak Kubernetes'e SQL Server Linux kapsayıcısı dağıtma
- Denetim Grubu v2 (Linux Çekirdeği belgeleri)
Linux'ta ve kapsayıcılarda bellek sınırları ayarlama yönergeleri
Linux üzerinde SQL Server farklı düzeylerde çalışan birden çok bellek denetimi vardır. Aşağıdaki tablo ve diyagram, her düzeyin mevcut belleği ana makine RAM'inden arabellek havuzuna kadar nasıl daralttığını gösterir.
| Level | Ayarlayan | Description |
|---|---|---|
| Host | Donanım / VM yapılandırması | Sunucuda veya sanal makinede (VM) fiziksel RAM. |
cgroup sınırı (docker run --memory, systemd, veya manuel) |
Kapsayıcı çalışma zamanı, systemd slice veya manuel cgroup yapılandırma |
Çekirdek tarafından zorlanan üst sınır (memory.max), cgroup içindeki tüm işlemler için. Bare-metal Linux'ta isteğe bağlı. |
SQL Server işlemi (memorylimitmb / MSSQL_MEMORY_LIMIT_MB) |
mssql-conf veya ortam değişkeni |
Tüm SQL Server bileşenlerindeki toplam bellek. Varsa cgroup sınırından veya konak belleğinden daha düşük olmalıdır. |
Arabellek havuzu (max_server_memory) |
sp_configure |
8 KB veri sayfalarının önbelleği. değerinden memorylimitmbküçük olmalıdır. |
| Headroom | Hesaplanan (sınırlar arasındaki boşluk) | Sınır (veya konak belleği) ile cgrouparasındaki memorylimitmb boşluk, işletim sistemi ek yükü ve yardımcı işlemler için ayrılmıştır. |
Linux üzerinde SQL Server için bellek sınırları ayarlarken aşağıdaki yönergeleri göz önünde bulundurun:
Kapsayıcı dağıtımlarında, kapsayıcının kullanabileceği genel belleği sınırlamak için kullanın
cgroup. Bu ayar, kapsayıcı içindeki tüm işlemler için üst sınır oluşturur.Bellek sınırı,
memorylimitmbveyaMSSQL_MEMORY_LIMIT_MBortam değişkeni tarafından ayarlanmış olsun, Linux üzerinde SQL Server'ın arabellek havuzu, SQLPAL, SQL Server Aracısı, LibOS, PolyBase, Full-Text Arama ve Linux üzerinde SQL Server'a yüklenen diğer işlemler de dahil olmak üzere tüm bileşenlerine tahsis edebileceği toplam belleği denetler.Ortam değişkeni
MSSQL_MEMORY_LIMIT_MB,memorylimitmbiçinde tanımlananmssql.conf'den önceliklidir.memorylimitmbkonak sisteminin gerçek fiziksel belleğini aşamaz.Linux işletim sistemi için yeterli boş fiziksel bellek olduğundan emin olmak için konak sistem belleğinden ve
memorylimitmbsınırından (varsa) daha düşük bir değer ayarlayıncgroup.memorylimitmböğesini açıkça ayarlamazsanız SQL Server, toplam sistem belleği ilecgroupsınırından (varsa) düşük olan değerin yüzde 80'ini kullanır.max_server_memory sunucu yapılandırma seçeneği yalnızca SQL Server arabellek havuzunun boyutunu sınırlar ve Linux üzerinde SQL Server için genel bellek kullanımını yönetmez. Bu değeri her zaman
memorylimitmbdeğerinden daha düşük olacak şekilde ayarlayın; böylece önceki madde işaretinde açıklanan diğer bileşenler için yeterli belleğin kaldığından emin olabilirsiniz.
SQL Server ve kapsayıcı bellek sınırları arasındaki boşluk
yapılandırılmış bellek sınırı olan bir kapsayıcıda SQL Server çalıştırdığınızda (örneğin, cgroup ayarımemory.max), kapsayıcı bellek sınırı ile arasında memory.memorylimitmb boşluk bırakın. Bu ek kapasite, kapsayıcı içindeki işletim sistemi ek yükü ve yardımcı işlemler için pay bırakır.
Çoğu dağıtım için, işletim sistemi ve SQL Server olmayan işlemler için kapsayıcı belleğinin yüzde 10 ile 20'si arasında bir değer ayırın ve kalan kapasitenin altına ayarlayın
memory.memorylimitmb.Büyük bellek yapılandırmaları için yüzde tabanlı arabellek gerektiğinden daha fazla bellek ayırabilir. Örneğin, 256 GB'lık bir kapsayıcının yüzde 10'unun yaklaşık 25 GB olması, işletim sistemi ek yükü için makul bir durumdur. Ancak, 512 GB'lık bir kapsayıcının yüzde 10'unun yaklaşık 51 GB olması, işletim sisteminin gerektirdiğinden büyük olasılıkla daha fazladır. Bu gibi durumlarda, bunun yerine iş yükünüze ve işletim sistemi ek yüküne uygun şekilde boyutlandırılmış sabit bir arabellek kullanın ve kalanını SQL Server'a ayırın.
Arabelleği iş yükünün özelliklerine, kapsayıcıda çalışan diğer hizmetlere ve konak yapılandırmasına göre ayarlayın.
Note
Tüm ortamlar için geçerli tek bir önerilen boşluk payı yoktur. Yoğun yük altında sistem kararlılığı sağlamak için test yoluyla bellek ayarlarını doğrulayın.
Kullanılabilir bellekten daha yüksek bellek sınırlarını yapılandırmaktan kaçının
memory.memorylimitmb değerini, ana bilgisayarda kullanılabilir fiziksel bellekten veya kapsayıcı tarafından uygulanan bellek sınırından daha yüksek olacak şekilde yapılandırmayın. Bunu yaparsanız SQL Server, işletim sistemi ve destekleyici işlemler için yetersiz kapasite bırakarak agresif bir şekilde bellek tüketebilir. Bu yapılandırma aşağıdakilere neden olabilir:
- Artan bellek baskısı.
- Azaltılmış sistem kararlılığı ve beklenmeyen hizmet kesintileri.
- Bellek yetersizliği (OOM) koşulları nedeniyle
sqlservrişlemini sonlandıran işletim sistemi.
SQL Server bellek sınırlarını, ana makine veya kapsayıcı için fiilen kullanılabilir belleğin altında olacak şekilde yapılandırın ve işletim sistemi ile çalışma zamanı hizmetleri için yeterli arabellek alanı bırakın.
Docker bellek yapılandırma örnekleri
docker run --memory seçeneği kapsayıcı için cgroup bellek sınırını ayarlar. Bu sınır, kapsayıcıdaki tüm işlemler için çekirdek tarafından uygulanan kesin üst sınırdır.
MSSQL_MEMORY_LIMIT_MB(veya memory.memorylimitmb) SQL Server bu belleğin ne kadarını kullanabileceğini denetler.
Önceki yönergelerde açıklandığı gibi, işletim sistemi ve yardımcı işlemler için boşluk bırakmak için her zaman kapsayıcı bellek sınırından daha düşük bir değer ayarlayınMSSQL_MEMORY_LIMIT_MB.
Aşağıdaki örneklerde, 16 GB RAM'e sahip bir ana makine kullanılır. Ortamınız için değerleri ayarlayın.
Önerilmez: kapsayıcı bellek sınırı yok
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
--memory olmadan, kapsayıcının cgroup üst sınırı yoktur.
MSSQL_MEMORY_LIMIT_MB SQL Server'ı kısıtlar, ancak kapsayıcı içindeki diğer işlemler yine de sınırsız miktarda konak belleği kullanabilir.
Önerilmez: SQL Server bellek sınırına eşit bellek sınırı
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
Her iki sınır da 12 GB (--memory 12g = 12.288 MB) olarak ayarlanır. İşletim sistemi ek yükü veya yardımcı süreçler için hiçbir pay kalmaz; bu da OOM sonlandırmalarına yol açabilir.
Önerilmez: SQL Server bellek sınırı kapsayıcı sınırını aşıyor
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), kapsayıcı sınırını (12 GB) aşıyor. Bu senaryo, Kullanılabilir bellekten daha yüksek bellek sınırları yapılandırmaktan kaçının başlıklı bölümde açıklanan OOM durumlarına yol açar.
Önerilen: İşletim sistemi için baş odalı kapsayıcı sınırı
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
Kapsayıcı 12 GB ()--memory 12g ile sınırlıdır ve SQL Server en fazla 10 GB (MSSQL_MEMORY_LIMIT_MB=10240) kullanacak şekilde yapılandırılır. Kalan 2 GB (yaklaşık yüzde 17) işletim sistemi ve diğer işlemler için boşluk sağlar.
Takas alanıyla ilgili dikkat edilmesi gerekenler
Kapsayıcıda SQL Server çalıştırdığınızda, işletim sisteminin ve SQL Server olmayan işlemlerin korunmasına yardımcı olmak için konak düzeyinde değiştirme alanını etkinleştirin. Ancak SQL Server'ı, yapılandırılmış bellek sınırları içinde çalışacak şekilde yapılandırın ve normal çalışma sırasında takas alanına güvenmeyin.
SQL Server fiziksel bellek veya geçerli bellek sınırı içinde çalıştığından emin olmak için bellek sınırı
cgroupizleyin.Swap etkinleştirildiyse, bunu sürekli SQL Server iş yükleri için bir kapasite olarak değil, ana sistemdeki geçici bellek baskısına karşı bir emniyet mekanizması olarak değerlendirin.
Important
Bellek baskısı değiştirme işlemine neden olursa SQL Server performansı önemli ölçüde düşebilir. Uygun bellek boyutlandırma, bellekle ilgili hataları önlemeye yönelik birincil mekanizmadır.