vm.min_free_kbytes nedir ve nasıl ayarlanır?

What Is Vm Min_free_kbytes



Linux çekirdeği için ayarlanabilen vm.min_free_kbytes sysctl nedir ve hangi değere ayarlanmalıdır? Bu makalede bu parametreyi ve çalışan bir linux sistemini nasıl etkilediğini inceleyeceğiz. İşletim sistemi sayfa önbelleği ve malloc'lar üzerindeki etkisini ve bu parametre ayarlandığında sistem serbest komutunun ne gösterdiğini test edeceğiz. Bu ayarlanabilir için ideal değerler hakkında bazı eğitimli tahminler yapacağız ve yeniden başlatmalardan kurtulmak için vm.min_free_kbytes'ın kalıcı olarak nasıl ayarlanacağını göstereceğiz. O zaman hadi gidelim.

vm.min_free_kbytes nasıl çalışır?

Sistemin kendisinin düzgün çalışmasını sağlamak için sistem tarafından bellek tahsislerine ihtiyaç duyulabilir. Çekirdek tüm belleğin ayrılmasına izin veriyorsa, işletim sisteminin sorunsuz çalışmasını sağlamak için normal işlemler için belleğe ihtiyaç duyulduğunda sorun yaşayabilir. Bu nedenle çekirdek ayarlanabilir vm.min_free_kbytes sağlar. Ayarlanabilir, çekirdeğin bellek yöneticisini en az X miktarda boş bellek tutmaya zorlar. İşte resmi tanımdan linux çekirdek belgeleri : Bu, Linux sanal makinesini minimum sayıda kilobaytı boş tutmaya zorlamak için kullanılır. VM, sistemdeki her bir düşük bellek bölgesi için bir filigran[WMARK_MIN] değeri hesaplamak için bu sayıyı kullanır. Her lowmem bölgesi, boyutuna göre orantılı olarak ayrılmış bir dizi ücretsiz sayfa alır. PF_MEMALLOC tahsislerini karşılamak için minimum miktarda bellek gereklidir; Bunu 1024KB'den daha düşük bir değere ayarlarsanız, sisteminiz kurnazca bozulur ve yüksek yükler altında kilitlenmeye meyilli hale gelir. Bunu çok yükseğe ayarlamak, makinenizi anında OOM yapacaktır.







vm.min_free_kbytes Çalışmalarının Doğrulanması

min_free_kbytes ayarının tasarlandığı gibi çalıştığını test etmek için sadece 3.75 GB RAM ile bir linux sanal örneği oluşturdum. Sistemi analiz etmek için aşağıdaki ücretsiz komutu kullanın:



#Bedava -m



MB cinsinden değerlerin yazdırılması için -m bayrağını kullanarak yukarıdaki boş bellek yardımcı programına bakın. Toplam bellek 3.5 ila 3.75 GB bellektir. 121 MB bellek kullanılır, 3,3 GB bellek boştur, arabellek önbelleği tarafından 251 MB kullanılır. Ve 3.3 GB hafıza mevcuttur.





Şimdi vm.min_free_kbytes değerini değiştireceğiz ve sistem belleği üzerindeki etkisinin ne olduğunu göreceğiz. Çekirdek parametre değerini aşağıdaki gibi değiştirmek için yeni değeri proc sanal dosya sistemine ekleyeceğiz:

# echo 1500000 > /proc/sys/vm/min_free_kbytes
# sysctl vm.min_free_kbytes



Parametrenin yaklaşık olarak 1.5 GB olarak değiştirildiğini ve yürürlüğe girdiğini görebilirsiniz. Şimdi kullanalım Bedava sistem tarafından tanınan değişiklikleri görmek için tekrar komut verin.

#Bedava -m

Boş bellek ve arabellek önbelleği komut tarafından değiştirilmez, ancak bellek miktarı şu şekilde görüntülenir: mevcut 3327'den 1222 MB'a düşürüldü. Bu, parametredeki değişikliğin yaklaşık 1,5 GB dk boş belleğe indirgenmesidir.

Şimdi 2GB'lık bir veri dosyası oluşturalım ve sonra bu dosyayı arabellek önbelleğine okumanın değerlere ne yaptığını görelim. Aşağıda 2 satırlık bash betiğinde 2GB'lık bir veri dosyasının nasıl oluşturulacağı aşağıda açıklanmıştır. Komut dosyası, dd komutunu kullanarak 35 MB'lık rastgele bir dosya oluşturacak ve ardından 70 kez yeni bir dosyaya kopyalayacaktır. veri dosyası çıktı:

# dd if=/dev/random of=/root/d1.txt sayı=1000000
# 'seq 1 70' içinde i için; yankı $i yap; cat /root/d1.txt >> /root/data_file; tamamlamak

Dosyayı okuyalım ve aşağıdaki gibi /dev/null dizinine okuyarak ve yeniden yönlendirerek içeriğini yok sayalım:

#kediveri dosyası> /dev/boş

Tamam, bu manevra seti ile sistem hafızamıza ne oldu, şimdi kontrol edelim:

#Bedava -m

Yukarıdaki sonuçların analizi. Hala 1.8 GB boş belleğimiz var, bu nedenle çekirdek, min_free_kbytes ayarımız nedeniyle ayrılmış olarak büyük bir bellek yığınını korumuştur. Tampon önbellek, veri dosyamızın toplam boyutu olan 2.3 GB'den daha küçük olan 1691 MB kullanmıştır. Görünüşe göre tüm veri dosyası arabellek önbelleği için kullanılacak kullanılabilir belleğin olmaması nedeniyle önbellekte depolanamadı. Dosyanın tamamının önbellekte saklanmadığını, ancak dosyayı okumak için tekrarlanan girişimlerin zamanlamasını doğrulayabiliriz. Önbelleğe alınmışsa, dosyayı okumak bir saniyeden kısa sürer. Hadi deneyelim.

# time cat data_file > /dev/null
# time cat data_file > /dev/null

Dosyanın okunması neredeyse 20 saniye sürdü, bu da neredeyse kesinlikle tamamının önbelleğe alınmadığını ima ediyor.

Son bir doğrulama olarak, sayfa önbelleğinin çalışması için daha fazla alana sahip olmasını sağlamak için vm.min_free_kbytes değerini azaltalım ve önbelleğin çalıştığını ve dosyanın çok daha hızlı okunduğunu görmeyi bekleyebiliriz.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# time cat data_file > /dev/null
# time cat data_file > /dev/null

Önbelleğe almak için kullanılabilen ekstra bellekle, dosya okuma süresi, tümü önbellekteyken 20 saniyeden .364 saniyeye düştü.

Başka bir deney yapmayı merak ediyorum. Bu gerçekten yüksek vm.min_free_kbytes ayarı karşısında bir C programından bellek ayırmak için malloc çağrılarına ne olur. Malloc başarısız olur mu? Sistem ölecek mi? Deneylerimize devam etmek için önce vm.min_free_kbytes ayarını gerçekten yüksek bir değere sıfırlayın:

#dışarı attı 1500000 > /yüzde/sistem/vm/min_free_kbayt

Boş hafızamıza tekrar bakalım:

Teorik olarak 1,9 GB boş ve 515 MB boş alanımız var. Biraz hafıza kullanmak ve nerede başarısız olduğumuzu görmek için stres-ng adlı bir stres testi programı kullanalım. Vm tester kullanacağız ve 1 GB bellek ayırmaya çalışacağız. 3,75 GB'lık bir sistemde yalnızca 1,5 GB ayırdığımız için, bunun işe yarayacağını tahmin ediyorum.

# stres-ng --vm 1 --vm-bytes 1G --zaman aşımı 60s
stres: bilgi:[17537]domuz gönderme:1vm
stres: bilgi:[17537]önbellek ayırma: varsayılan önbellek boyutu: 46080K
stres: bilgi:[17537]başarılı çalışma tamamlandıiçinde60.09s(1dakika,0.09kuru)
# stres-ng --vm 2 --vm-bytes 1G --zaman aşımı 60s
# stres-ng --vm 3 --vm-bytes 1G --zaman aşımı 60s

Daha fazla işçi ile tekrar deneyelim, 1, 2, 3, 4 işçi deneyebiliriz ve bir noktada başarısız olması gerekir. Testimde 1 ve 2 işçi ile geçti ama 3 işçi ile başarısız oldu.

Şimdi vm.min_free_kbytes'ı düşük bir sayıya sıfırlayalım ve bunun 3.75 GB'lık bir sistemde her biri 1 GB olan 3 bellek stresörünü çalıştırmamıza yardımcı olup olmadığına bakalım.

# echo 67584 > /proc/sys/vm/min_free_kbytes
# stres-ng --vm 3 --vm-bytes 1G --zaman aşımı 60s

Bu sefer hatasız başarılı bir şekilde çalıştı, iki defa denedim sorunsuz. Böylece, vm.min_free_kbytes değeri daha düşük bir değere ayarlandığında, malloc için daha fazla kullanılabilir belleğe sahip olmanın davranışsal bir farkı olduğu sonucuna varabilirim.

vm.min_free_kbytes için varsayılan ayar

Sistemimdeki ayar için varsayılan değer, sistemdeki RAM'in yaklaşık %1,8'i veya 64 MB olan 67584'tür. Güvenlik nedenleriyle, aşırı derecede bozuk bir sistemde, daha fazla ayrılmış boş belleğe izin vermek için belki biraz 128MB'a çıkarma eğilimindeydim, ancak ortalama kullanım için varsayılan değer yeterince mantıklı görünüyor. Resmi belgeler, değeri çok yüksek yapma konusunda uyarır. Bunu sistem RAM'inin %5 veya %10'una ayarlamak, muhtemelen ayarın amaçlanan kullanımı değildir ve çok yüksektir.

Yeniden başlatmalardan kurtulmak için vm.min_free_kbytes ayarı

Ayarın yeniden başlatmalarda hayatta kalabilmesini ve yeniden başlatma sırasında varsayılan değerlere geri yüklenmemesini sağlamak için, /etc/sysctl.conf dosyasına istediğiniz yeni değeri koyarak sysctl ayarını kalıcı hale getirdiğinizden emin olun.

Çözüm

vm.min_free_kbytes linux kernel tuneable'ının özellikle yoğun kullanım ve yoğun hafıza tahsislerinde sistemin daha kararlı olması için değiştirilebildiğini ve sistem üzerinde hafıza rezerve edebildiğini gördük. Varsayılan ayarlar, özellikle yüksek bellekli sistemlerde biraz fazla düşük olabilir ve dikkatli bir şekilde yükseltilmesi düşünülmelidir. Bu ayarlanabilir tarafından ayrılan belleğin, OS önbelleğinin tüm belleği kullanmasını engellediğini ve ayrıca bazı malloc işlemlerinin de tüm belleği kullanmasını engellediğini gördük.