Uygulama belleği kullanımını nasıl sınırlayabilirim?


10

Bu konuyla ilgili soruları okumak için 2 saat harcadım ve hala bazı yanlış anlaşılmalar var.

Bu süreç var:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Bu tüm sistem belleği 19.3Mbetrafında 1.8%, sistem yerleşik bellek (takas dosyası yok) kullanır gösterir 1GB. Sanal boyut 1.39GB?!?. ulimit -mİşe yaramıyor okudum . İnsanlar ulimit -vörneğin işlem için sanal bellek ayarlamak gibi işlemler kullanırlar. Bu sanal bellek listelenen VSZ psmi? Bu işlemi 100MBen çok sistem belleğini kullanacak şekilde kısıtlamak istiyorsam hangi değeri ayarlamalıyım . Ben belgelerini okudum setrlimitve bu yasal görünüyor:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

Ancak belgelerin diğer sürümlerinde bu RLIMIT_ASparametre sanal bellek boyutunu ayarlar. Gerçek ne?


Lütfen yazı biçimlendirmesine biraz dikkat edin.
rozcietrzewiacz

Yanıtlar:


6

Evet, VSZ sanal bellektir. RLIMIT_AS ile ilgili olarak, yukarıda belirtilen paragrafı nerede buldunuz? Setrlimit (2) bir Linux sistem çağrısı olduğundan, bir kütüphane fonksiyonu olan malloc'u (3) nasıl izleyebileceğini göremiyorum. Bunun yerine, sadece brk (2), sbrk (2) ve mmap (2) ile çalışabilir - bu aynı zamanda kendi sayfasının (Scientific Linux kontrol edilir) önerdiği şeydir. Ancak, bu işlevler yoluyla talep belleğin toplam miktarı ise RLIMIT_AS gerçekten sanal bellek sınırlar böylece sanal bellek. (Bu yine setrlimit (2) kılavuzuna uygundur.)

Ne yazık ki, Linux altında RSS'yi sınırlandıramazsınız (bu olurdu ulimit -m). ulimit -d(RLIMIT_DATA) öğesini deneyebilirsiniz , ancak bu genellikle büyük ayırmalar için kullanılan mmap'i (2) yok sayar. Başka bir olasılık sanal belleği sınırlamak olabilir, ancak RSS ve VSZ arasındaki bu kadar büyük bir farkla, bu zor olabilir.


Cevabınız için teşekkür ederim. Paragraf setrlimitman sayfasından IEEE/The Open Group 2003 GETRLIMIT(3P)geliyor psBana RSS'yi nasıl gösterebilirim, ancak çekirdek bunun üzerinde sınır uygulayamaz?
Dragomir Ivanov

6
Alan Cox'a göre, bunun tarihsel nedenleri var: RSS'yi hesaplamak pahalıydı, bu yüzden sınırın uygulanması çekirdeğe büyük bir yük getirecekti; kaynak: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Ayrıca bkz stackoverflow.com/questions/3043709/…
Ansgar Esztermann

Anlıyorum. Sanırım o zaman giderdim ulimit -d. Uygulama benim tarafımdan yazılmış ve ben kullanmadım mmap().
Dragomir Ivanov

2
Hayır, genellikle yapmazsınız (sbrk ()), ancak malloc () olabilir.
Ansgar Esztermann

Anlıyorum. Bu çok talihsiz bir durum. O halde bu sorunun çözümü ya gruplar ya da bazı kod dilleriyle bellek kullanımı anketidir.
Dragomir Ivanov

3

Birçok işlem belleğinin bir kısmını diğer işlemlerle paylaşır, örneğin libc neredeyse her işlem tarafından kullanılır, ancak bellekte yalnızca bir kez eşleştirilir, ancak her işlemin sanal bellek kullanımına sayılır. Yalnızca belirli bir işlem (çoğunlukla RSS) tarafından kullanılan bellek kullanımını sınırlamak, cgroups kullanılarak yapılabilir. Nasıl yapılacağı hakkında bir sürecin ve çocuklarının toplam kaynaklarını (belleğini) sınırlama konusundaki yanıtlara bakın . Bu, bir sürecin ve çocuklarının toplam belleğini sınırlayacaktır.

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.