Belirtiler
Microsoft SQL Server 2017 ' i RHEL 7,4 üzerine yükledikten sonra, MSSQL-conf aracını çalıştırmayı denediğinizde program sonlanır ve çekirdek döküm oluşturur. Ayrıca, MSSQL-sunucu hizmeti için systemctl günlüklerinde (journalctl-u MSSQL-Server. Service)aşağıdaki giriş kaydedilir:
Bu program önemli bir hatayla karşılaştı ve çalışmaya devam edemez. Aşağıdaki tanı bilgileri kullanılabilir: Neden: 0x00000003 İleti: sonuç StackTrace: 00005577212bcd92 0000557721266767 Süreç: 590-sqlservr Thread: 594 (uygulama iş parçacığı 0x1000) Örnek kimliği: afe0f97b-fdbc-4a4d-910c-038e7ee2049b Kilitlenme kimliği: 544c4c67-0f49-4877-A959-92c14798vseç58e Derleme damgası: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249 Temel döküm ve bilgi dökümü alınıyor...
Neden
Bu sorun, Linux 'daki SQL Server 2017 'in eski VA düzenleriyle uyumlu olmaması nedeniyle oluşur. RHEL 7,4 üzerinde etkinleştirilen ayarlar nedeniyle, tüm işlemler legacy_va_layout kullanılarak başlar.
Başlangıç sırasında, Linux 'taki SQL Server adres aralıklarını doğrular. Eski bir VA düzeni nedeniyle bir uyumsuzluk bulduğunda, bir onaylama işlemi gerçekleştirir, programı sonlandırır ve temel döküm oluşturur.
RHEL 7,4, aşağıdaki nedenlerden biriyle eski bir VA düzeni kullanmaya geçebilir:
-
Soft Stack limit değeri sınırsız (örneğin, değiştirilmiş bir limit. conf komut dosyası veya bir ulimit-s ayarı) olarak ayarlanır.
-
Genel bir eski VA düzeni etkindir (örneğin, sysctl VM. legacy_va_layout veya /etc/sysctl.conf).
Çözüm
-
/Etc/Security/Limits.conf düzeninde yeni bir satır ekleyin ve aşağıdaki kodu girin: mssql soft stack 8192 root soft stack 8192
-
/Etc/sysctl.conf düzeninde yeni bir satır ekleyin ve aşağıdaki kodu girin: vm.legacy_va_layout = 0
-
Bilgisayarı yeniden başlatın: reboot
-
Hem kullanıcıların, hem kök hem de MSSQLiçin yumuşak yığın ayarının 8192olduğundan emin olun. Kullanıcı bağlamına geçin ve aşağıdaki komutu çalıştırır: ulimit -s
-
Genel eski VA düzeninin 0olduğundan emin olun: Sysctl vm.legacy_va_layout
Ek Bilgi
Yığın boyutu sınırını işaretleme
Yığın boyutu sınırını ve legacy_va_layout ayarını (yeni RHEL-7 yüklemesinden alınan varsayılan değerler) Gözden geçirme.
[root@localhost ~]# sysctl vm.legacy_va_layout vm.legacy_va_layout = 0 [root@localhost ~]# ulimit -s 8192
Bu ayarlar bir x64 sisteminde yapıldığında, adres alanı düzeni şuna benzer:
+----------------------+ TASK_SIZE ((1UL << 47)-PAGE_SIZE) | YıĞıN | +----------------------+ +----------------------+ MMAP_BASE (STACK_SIZE + RND_OFFSET) | MMAP () | | vvvvvvvvvvvvvvvv | | | | | | | | | | | | | | | | | | | | | | | |^^^^^^^^^^^^^^| | YıĞıN | +----------------------+ | ELF KESIMLERI | +----------------------+ +----------------------+ 0
MMAP_BASE adres alanının en üstüne yakındır. Eşlemeler eklendiğinde, adres alanı ayırma "aşağı genişler". Bu, RHEL için varsayılan kurulum budur ve bu, SQL Server başlatıldığında karşılaşmanız beklenir.
Basit bir program çalıştırma
Bir sayfayı eşleyen basit bir program çalıştırarak, çekirdeğin döndürdüğü adresi döndürür (örnek):
mmap code ========= #include <stdio.h> #include <sys/mman.h> int main() { void* result = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); printf("mmap %p\n", result); return 0; } [root@localhost ~]# ./mmap mmap 0x7fb6976d6000
Bununla birlikte, parametrelerden biri veya ikisi değiştirilirse, VA düzeni eski düzenine geri döndürülebilir:
+----------------------+ TASK_SIZE ((1UL << 47)-PAGE_SIZE) | YıĞıN | | vvvvvvvvv ^ SanalDizinAdı | | | | | | | | | | | | | | | | | | | |^^^^^^^^^^^^^^| | MMAP () | +----------------------+ TASK_UNMAPPED_BASE (PAGE_ALIGN (TASK_SIZE/3)) | | | | | | |^^^^^^^^^^^^^^| | YıĞıN | +----------------------+ | ELF KESIMLERI | +----------------------+ +----------------------+ 0
Burada MMAP_BASE adres alanının üçte birine yerleştirilmiştir. Eşlemeler eklendiğinde, adres alanı ayırması "büyüyor" (genişler). 64 bit Linux 'un 47 bit sanal adres alanı olduğu için, bit b, MMAP_BASE 3 2 TB sanal "0x2A0000000000." Dolayısıyla, sabit eşlemeleri ayarlamaya çalışıldığında 64TB 'nin altında eşlenmiş olan adreslerde MSSQL.
Sınırsız büyüme için yığın boyutunu ayarlama
[root@localhost ~] # ulimit-s sınırsız [root@localhost ~] #./mharita MMAP 0x2b6634464000
* VM 'yi ayarlama. legacy_va_layout
[root@localhost ~] # ulimit-s 8192 [root@localhost ~] # sysctl-w VM. legacy_va_layout = 1 VM. legacy_va_layout = 1 [root@localhost ~] #./mharita MMAP 0x2b46f28f9000
VM 'yi ayarlamak ile aynı etkiyi elde edebilirsiniz; yığın boyutunu sınırsız olarak ayarlamak için legacy_va_layout. Fark, yönetici VM legacy_va_layout 'yi ayarladıktan sonra, sistem bu eski VA düzenini tüm işlemler için genel olarak kullanacaktır. (Bunu geçersiz kılmanın tek yolu, o ssctl öğesini 0olarak Sıfırlamaktan.) Bununla birlikte, VM. legacy_va_layout = 0 (varsayılan) ile karşılaşırsanız, ulimit (veya limit. conf 'i özelleştirme) vererek oturum açma