Performans için en iyi uygulamalar: Linux'ta SQL Server belleği

Ş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.

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.

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:

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.

İç içe geçmiş bellek denetim katmanlarını gösteren diyagram.

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ı, memorylimitmb veya MSSQL_MEMORY_LIMIT_MB ortam 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, memorylimitmb içinde tanımlanan mssql.conf'den önceliklidir.

  • memorylimitmb konak 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 memorylimitmb sı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 ile cgroup sı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 memorylimitmb değ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ınmemory.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 sqlservr iş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.

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.

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.

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.

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ı cgroup izleyin.

  • 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.