Vm.overcommit_memory nasıl çalışır?


49

Varsayılan ayarları kullandığımda:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Bu değerleri /proc/meminfodosyadan okuyabilirim :

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Ben değiştirmek Fakat vm.overcommit_memorygelen 0etmek 2, özellikle Amarok Değişiklikten önce başlayabileceğini uygulamaların aynı kümesini başlatamıyorum. Ben değiştirmek zorunda vm.overcommit_ratioiçin 300, böylece sınır artırılabilir. Şimdi amarok'a başladığımda /proc/meminfoşunları gösteriyor:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Bu makinede yalnızca 1GiB RAM var, ancak amarok vm.overcommit_memory0'a ayarlandığında sorunsuz çalışıyor. Fakat ayarlanması durumunda, 2amarok'un 2GiB'den fazla bellek ayırması gerekiyor. Bu normal bir davranış mı? Öyleyse, birisi neden örneğin firefox'un (amarok'tan 4-6 kat daha fazla bellek tüketen) değişiklikten önce ve sonra aynı şekilde çalıştığını açıklayabilir mi?

Yanıtlar:


66

Belgeleri şurada bulabilirsiniz man 5 proc( veya kernel.org adresinde ):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

Basit cevap, ayarın 1'e devredilmesi, aşamayı, bir programın malloc()bir bellek parçası tahsis etmek gibi bir şey çağırdığında ( man 3 malloc), sistemin mevcut olan tüm belleğe sahip olmayacağını bilmeden bağımsız olarak her zaman başarılı olacağıdır. için sordu.

Anlamak için temel konsept sanal bellek fikridir . Programlar gerçek fiziksel belleğe eşlenebilecek veya eşlenmeyebilecek sanal bir adres alanı görüyor. Aşırı ödeme denetimini devre dışı bırakarak, işletim sistemine yalnızca sanal alanı yedeklemek için her zaman yeterli fiziksel belleğin olduğunu varsaymasını söylersiniz.

Örnek

Bunun neden bazen önemli olduğunu vurgulamak için, Redis’in neden vm.overcommit_memorybunun için 1 olarak ayarlanması gerektiğine dair kılavuzlarına bakınız .


2
Ancak Committed_ASher iki durumda da değeri aynı olmamalı mı?
Mikhail Morfikov

@MikhailMorfikov: Teoride, buna inanıyorum, fakat bu programların ne yaptığını kim biliyor. Malloc aracılığıyla bir parça koç attığını söyleyen basit bir programla daha kontrollü bir ortam görmek isterdim. Ve sonra testler arasında yeniden başlattıktan sonra testi çalıştırın.
Kyle Brandt

Tamam, şimdilik kalacağım 0.
Mikhail Morfikov

2
@MikhailMorfikov: Evet, pratik olarak 0'ın en anlamlı olduğunu düşünüyorum. Çevremde, 1'i etkinleştirdiğim tek zaman Redis için, beklediği yerlerde bir çatal () yüzünden kullandığı daha fazla bellek istiyor. Çocuk hemen hemen tüm aynı bellek sayfalarını kullanacak, ancak Linux, 2x belleğin kullanılacağını varsaymak zorunda olduğunu güvenli olduğunu söyledi (daha fazla bilgi edinmek istiyorsanız: redis.io/topics/faq )
Kyle Brandt

Cevabınızdaki son ifade "fazla mesaiyi etkinleştirerek" gibi başlamaz mı? çünkü onu 1'e ayarlamak demek istemek anlamına geliyor, değil mi?
18'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.