Sınırlı RAM kullanımına sahip bir kullanıcı nasıl oluşturulur?


43

Bu yüzden 4 GB RAM + 4 GB takas var. Sınırlı ramlı ve takaslı bir kullanıcı oluşturmak istiyorum: 3 GB RAM ve 1 GB takas. Böyle bir şey mümkün mü? Sınırlı RAM ile uygulamaları başlatmak ve ayrı bir kullanıcı oluşturmadan (ve herhangi bir özel uygulama yüklememek - sadece varsayılan bir Debian / CentOS sunucu yapılandırmasına sahip ve sudo kullanmamak) kendilerine uygun takas yapmak mümkün mü?

Güncelleme:

Bu yüzden terminall'ı açtım ve içine ulimit komutunu yazdım : sınırlama ulimit -v 1000000gibi olacak 976,6Mb. Sonra aradım ulimit -ave sınırlamanın "açık" olduğunu gördüm. Sonra uygulamamı derleyen ve başlatan bir bash betiği başlattım nohup, uzun bir nohup ./cloud-updater-linux.sh >& /dev/null & ... ama bir süre sonra şunu gördüm:

görüntü tanımını buraya girin

(eğer herhangi bir sınırlama uygulanmazsa sorun olmaz - biraz büyük lib dosyası indirdi ve derlemeye başladı.)

Ama kabuğa ve onunla birlikte / içinden başlatılan tüm işlemlere sınırlamalar uyguladığımı sanıyordum ulimit -v 1000000? Neyi yanlış yaptım? Terminal nasıl yapılır ve başlattığı tüm alt işlemler ram kullanımıyla sınırlandırılır?


1
Bir kullanıcıya bellek kısıtlamalarını bir bütün olarak, sadece her bir işlemde koyamazsınız. RAM ile takas kullanımı arasında ayrım yapamazsınız. Daha hassas kontrol istiyorsanız, kullanıcının işlemlerini sanal bir makinede çalıştırın.
Gilles 'SO- kötülük olmayı bırak'

@Gilles, sanal makinelerin yalnızca grup ve ad alanları veya türevlerini kullandığından emin
RapidWebs

@RapidWebs hayır onlar değil. Sadece önceden tanımlanmış RAM miktarını öykünürler ve konuk işletim sistemi daha sonra süreçlere nasıl tahsis edileceğine karar verir.
Ruslan,

Kaplar (sanal makineler değil) bellek kullanımını sınırlamak için cgroups kullanır. Sanal belleği sınırlandırmak iyi bir fikir değildir; Bir işlem çok fazla sanal bellek kullanabilir, ancak yalnızca küçük bir RAM kullanabilir. Örneğin, sistemim 34359738367 kB ayrılmış sanal belleğe sahip ancak daha az ram var.
ctrl-alt-delor,

Yanıtlar:


63

ulimitbunun için yapılmıştır. İçin ulimitkullanıcı başına veya grup bazında varsayılan ayarları ayarlayabilirsiniz .

/etc/security/limits.conf

ulimit -v KBYTESmaksimum sanal bellek boyutunu ayarlar. Maksimum bir takas verebileceğini sanmıyorum. Bu sadece kullanıcının kullanabileceği sanal bellek miktarında bir sınırlama.

Böylece limits.confhattınız olacaktı (maksimum 4Ghafızaya)

luser  hard  as   4000000

GÜNCELLEME - CGroups

Süreçte uygulanan ulimitve uygulanan sınırlamalar limits.conf. Bu konuda kesinlikle net değildim.

Bir kullanıcının kullandığı toplam bellek miktarını sınırlamak istiyorsanız (istediğiniz şey). Grupları kullanmak istiyorsun .

İçinde /etc/cgconfig.conf:

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

Bu, cgroupmaksimum 4GiB bellek sınırına sahip bir tane yaratır.

İçinde /etc/cgrules.conf:

luser   memory   memlimit/

Bu, çalıştırılan tüm işlemlerin luseriçinde memlimitoluşturulan grupların içinde çalıştırılmasına neden olur cgconfig.conf.


böyle bir şey ayarlanabilir useraddmi?
myWallJSON 16.03

4
@ myWallJSON Doğrudan değil, ancak hemen limit.conf dosyasına ekleyebilir veya belirli limitleri olan bir grubu limit.conf olarak ayarlayabilir ve bu gruba kullanıcı ekleyebilirsiniz.
utopiabound

1
Bu harika! Bunu yapabileceğini bilmiyordum! Harika cevap +1
Yanick Girouard 16:12

1
@utopiabound: Q'mu ulimit kullanmaya çalıştığım bazı verilerle güncelledim.
myWallJSON 16.06.2008

1
@ f.ardelian Çekirdeği yükseltin. İşte bunun nasıl yapılacağı hakkında bir makale !
Daniel C. Sobral

4

Kullanıcı düzeyinde hafıza kullanımını sınırlayamazsınız, ulimit bunu tek bir işlem için yapabilir.

Kullanıcı başına limitleri kullanmakla bile /etc/security/limits.conf, bir kullanıcı birden fazla işlemi çalıştırarak tüm belleği kullanabilir.

Kaynakları gerçekten kapatmak istiyorsanız , Solaris kapsamındaki projeler ve bölgeler tarafından kullanılan rcapd gibi bir kaynak yönetimi aracı kullanmanız gerekir .

Linux'ta araştırabileceğiniz benzer özellikler sağlayan bir şey var: cgroups .


Eh, sanırım tüm işlemler o kabuktan miras alacağı için kullanıcıların giriş kabuğu veya bunun gibi bir şey için "kullanıcı için bir sınır belirleme" olarak yorumlanabileceği şeklinde yorumlanabilir mi?
amn

1
@ amn Olmaz. Bir kullanıcı basitçe böyle bir limiti aşmak için yeni bir giriş kabuğu açabilir.
jlliagre

Doğru, bu benim varsayımı geçersiz kılar.
amn

3

cgroupsBunu yapmanın doğru yolu, diğer cevapların işaret ettiği gibi. Ne yazık ki, aşağıda ele alacağımız gibi, sorun için mükemmel bir çözüm yoktur. Grup hafızası kullanım sınırlarını ayarlamanın bir sürü farklı yolu vardır. Bir kullanıcının oturum açma oturumunu otomatik olarak bir grubun parçası haline getirme sistemi sistemden sisteme değişir. Red Hat'in bazı araçları var, yani systemd .

memory.memsw.limit_in_bytesve memory.limit_in_bytessırasıyla takas dahil olmak üzere olmayan limitleri belirlemek. Dezavantajı memory.limit_in_bytes, çekirdek tarafından önbelleğe alınan dosyaları, grubun kotasına karşı gruptaki işlemler adına sayar olmasıdır. Daha az önbellekleme, daha fazla diske erişim anlamına gelir; bu nedenle, sistemde başka bir bellek varsa, potansiyel olarak bazı performanslardan vazgeçersiniz.

Öte yandan, memory.soft_limit_in_bytesgrubun kotaya girmesine izin verir, ancak çekirdek OOM katili çağrılırsa, kotalarını aşan gruplar ilk önce mantıklı bir şekilde öldürülür. Bununla birlikte bunun dezavantajı, bir miktar belleğe derhal ihtiyaç duyulduğu durumlar olduğu ve OOM katilinin öldürmek için işlem aramaya vakti olmadığı ve bu durumda kontenjanlı kullanıcının işlemlerinden önce bir şeyler başarısız olabileceğidir. öldürdü.

ulimitAncak, bunun için kesinlikle yanlış bir araçtır. ulimit sanal bellek kullanımına sınırlar koyar; ki bu kesinlikle istediğiniz şeyi değildir. Birçok gerçek dünya uygulaması fiziksel bellekten çok daha fazla sanal bellek kullanır. Çöp toplanan çalışma sürelerinin çoğu (Java, Go) parçalanmayı önlemek için bu şekilde çalışır. Adres temizleyici ile derlenmişse, C'deki önemsiz bir "merhaba dünya" programı, 20 TB sanal belleği kullanabilir. Güvenmeyin Tahsisatçılar sbrkgibi jemalloc (ki Rust için varsayılan ayırıcısı olan) ya da tcmallocAyrıca, fiziksel kullanımlarından büyük ölçüde sanal bellek kullanımına da sahip olacaktır. Verimlilik için, birçok araç sanal kullanımı artıran ancak fiziksel kullanımı gerektirmeyen dosyaları eşleştirecektir. Chrome süreçlerimin her biri 2 TB sanal bellek kullanıyor. 8GB fiziksel belleğe sahip bir dizüstü bilgisayardayım. Buradaki sanal bellek kotalarını kurmaya çalışan herhangi biri, Chrome'u kırabilir, Chrome'u büyük miktarlarda sanal bellek ayırmaya (ancak kullanmamasına) bağlı olan bazı güvenlik özelliklerini devre dışı bırakmaya zorlar veya bir kullanıcının sistemi kötüye kullanmasını engellemekte tamamen etkisiz kalı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.