Yoğun bellek kullanımı için 64 GB RAM bilgisayarda bölüm boyutunu değiştirin


36

Bilgisayarımda 64 GB RAM ve 240 GB SSD var, bu da yoğun bellek hesaplamalarında kullanacağım (makine öğrenmesi, veri madenciliği vb.). İnternette bulduğum tavsiyelerin çoğu yaklaşık 2-4-8 GB RAM bilgisayarları ve RAM takas bölümünün 2 katı (yani 128 GB) öneriyorlar.

128 GB'lik bir takas bölmesi yapmak mantıklı mı? büyük bir takas bölümü oluşturarak ne gibi avantajlar elde ederim?

Fiziksel RAM'in tükenmesi durumunda, bunu doğru anlıyor muyum:

  1. Eğer bir takas yapmazsam, 'hafıza yetersiz' hatası alıyorum
  2. Takas yapmam durumunda, RAM sayfalarından bazıları takas bölümüne kopyalanacak ve program çalışmaya devam edecektir (daha yavaş olmasına rağmen).

Bazı insanlar sınırlı sayıda okuma / yazma çevrimi içerdiğinden SSD'yi değiştirmenin kötü bir fikir olduğunu söylüyor. Takas kullanılması ne kadar hızlı SSD okuma / yazma çevrimlerini tüketir (bildiğim kadarıyla, yaklaşık 50000 yazma IOPS'si)?

Linux kullanıyorum ( Ubuntu 14.04 (Güvenilir Tahr)).

Şimdilik 16 GB'lık bir takas kuracaksınız, kesinlikle yeterli olması gerektiği gibi (örneğin, RedHat 4 GB'ı öneriyor) ve 16 GB'lık disk alanı aslında büyük bir iş değil.


1
Açıkça değiş tokuş etmeye güvenmek yerine, çalışma ayarlarının boyutunu önceden biliyorsanız veya biraz daha düşük düzeyli bellek yönetimi yapmaya istekli iseniz mmap, çalışma sayfalarınızı ayırmayı deneyin. O zaman takas tutarınız tam olarak işleminiz için ihtiyacınız olan miktar olacaktır.
kabarık

5
"İki kat RAM miktarını" öneren tavsiyeler, bilgisayarların az RAM olduğu eski zamanlara dayanıyor. Bazı dokümanlar, öncelikle <2GB RAM'e sahip bilgisayarlara uygulanabilir olduğunu belirtmektedir. Bunun üzerinde, takas boyutu çoğunlukla makine ile yaptığınız şeyle ilgilidir.
John WH Smith

Ayrıca bkz. Bu Sunucu Hatası q & a - Java kullanıyorsanız (ve muhtemelen başka uygulamalar varsa), bellek ayırmalarını artıracak kadar takas olduğundan emin olmak istersiniz. Ben şahsen benim takas bölümü için RAM + 2 RHEL standardı ile sopa
warren

2
Buradaki yorumların çoğu kaldırıldı utanç verici. Yeniden ekleme: Bu arada, çekirdeğiniz destekliyorsa, takas bölümünüzü discardbir SSD'ye monte etmek isteyebileceğinizden bahsetmeye değer . Ayrıca (ve aşağıda verilen cevaplarda bahsedilmiştir), potansiyel olarak daha kolay yönetim için bir bölüm yerine bir dosya kullanabileceğinizi unutmayın (ve örneğin parçalanma nedeniyle bir SSD'ye performans isabet etmeyin).
Jason C,

1
Yoğun bellek kullanımlı bir uygulamanız varsa, SVM öğrenme gibi, ramınız tükenip değişmeye başlarsanız, iyileşmek için her şey çok halsizleşecek ve tek uygun hareketiniz fişi çekecek (birkaç kez başıma geldi) . Muhtemelen değişmeye başlarsa en azından bir şeyi değiştirip tekrar başlayabilmeniz için sürecinizin OOM tarafından öldürülmesini istersiniz. Belki de SSD sürücüler ile o kadar da kötü değil. OOMK ayarlarını da kontrol edecektim - Ubuntu'da başıma gelenler, hala çok fazla koç bıraktığında, bazen agresif bir şekilde tahsis
edildiklerinde OOM'nin

Yanıtlar:


36

Muhtemelen sadece az miktarda bir takas gerekir. Bilgisayarınızın tipik çalışma kümesi için yeterli RAM’iniz varsa, bunu yaptığınızdan eminim, yalnızca iki şey için takas yapmanız gerekir:

  1. Disk önbelleği için daha fazla yer açmak için büyük olasılıkla hiçbir zaman RAM'den erişilemeyecek bilgileri almak için takas yapmanız gerekir. Birçok uygulama sistem başlatılırken çalışır ve bir daha asla erişilmez. Kirlenmiş sayfalarının sonsuza kadar RAM'e sıkışmasını istemezsiniz. Yani onları tutmak için takas gerekir.

  2. Asla doldurulmayacak tahsisleri kapatmak için takas gerekir. Kullanılmasa da bu alanın kullanılabilir olması gerekiyor. Onsuz, sistem bol miktarda boş fiziksel RAM olsa bile belleği ayırmayı reddetmek zorunda kalacak çünkü tüm ayırmalarının bir kerede kullanılmasına izin vermek için yetersiz bir destek deposuna sahip.

Bunların hiçbiri büyük miktarda takas gerektirmez. 16GB, örneğin, fazlasıyla yeterli olmalıdır. Amaç, daha büyük çalışma setlerini hıza göre çalıştırmanıza izin vermemektir. Amaç, 64 GB'ınızı etkili bir şekilde kullanmanıza izin vermek ve hiçbir zaman gerçekleşmeyecek uç davalar için gereksiz yere tıkamasına veya ayırmasına gerek kalmamasıdır.

(Bert ile aynı 4GB yeterli olacağı konusunda hemfikirim.)


2
@wrwt Takas bölümünüzü sürücünün sonuna yerleştirin (ya da en azından veri bölümünüzden sonra), yeniden ayarlamayı seçmeniz durumunda daha hızlı ve daha az yoğun yazma özelliğini yeniden boyutlandıracak (daha özel olarak veri bölümünü yeniden boyutlandıracak) basitleştirmek için, çünkü başlangıcı hareket ettirmek zorunda değilsiniz). SSD'lerde, bazen mekanik tahriklerde olduğu gibi konum ve performans arasında bir bağlantı yoktur.
Jason C,

Bu cevap çoğu hobi için muhtemelen yeterli olsa da, gerçek sunucular için kötü bir öneridir - cevap, uygulamanın nasıl yazıldığına bağlıdır, çünkü takas alanının yetersiz kalması, bellek dışı katilin tekmelemesine ve sonlandırmasına neden olur. rastgele işlem (evet bu hakkı
Soren

3
@Soren Bu süper kullanıcı, sunucu hatası değil. ;) Takas alanını ayarlamanın "gerçek sunucular" için vermeniz gereken tek karar olmadığı kesinlikle doğru. Ayrıca fazla mesai gibi şeyler hakkında karar vermeniz gerekir, OOM katilini ayarlamanız gerekebilir, vb. (Çalışma setinizin fiziksel RAM'ı aşmasını beklerseniz cevaplar çok daha karmaşık hale gelir. Ancak neredeyse hiç kimse makineleri bu şekilde çalıştırmaz.)
David Schwartz

5
Linux, takas özelliği etkin olmasa bile belleği aşacak. Gerçekten çok fazla bellek kullanıldığında OOMK işlemlerini gerçekleştirecek. Yani cevabın ikinci noktası yanlıştır.
Ruslan,

1
@ MaciejPiechotka Veya bir dosya kullanın.
Jason C,

29

RedHat , 64 GB'lık bir makinede 4 GB'ı önerir .

Ancak, takas boyutlandırma bir bilimden çok bir sanattır. Makinenin ne için kullanıldığına, ne kadar disk alanı ve belleğe sahip olduğunuza ve diğer faktörlere bağlıdır. Unutma, daha sonra her zaman daha fazla takas ekleyebilirsin.

2X fiziksel bellek kuralını kullanmak, bugünlerde kullanılan bellek sistemlerinin miktarı ile eskidir. Ancak ne yaptığınızı bilmiyorsanız, sıfır takas ile çalıştırmak önerilmez. 4 GB'lık tavsiye, iyi bir başlangıç ​​noktasıdır.


12
Son paragraf için +1. 2x önerisi, çoğu bilgisayarın normal kullanımda değişmekten kaçınmak için yeterli kola sahip olmadığı zamana kadar uzanır. Öznel olarak, bilgisayarları kullanmaktan sonra, 2x sınırının, takasın bitmesinden önce bilgisayarın alışılmadık derecede yavaşlayacağı kadar büyük bir sayı olarak seçildiği görülüyor.
Dan Neely, 15

1
2X, sistemler 4GB / 8GB RAM ve yüzlerce gigabayt disk alanına sahip olduğunda da iyi çalıştı. Tabii, muhtemelen gerekenden daha fazlaydı, ama zarar neydi? Ancak şimdi sistemlerde 16GB / 64GB RAM ve 128GB / 256GB SSD'ler var, bunun zararı açık.
David Schwartz

12

Linux'ta yeterli takas seçeneğine ihtiyacınız vardır; böylece mevcut toplam sanal bellek (RAM + SWAP), bir kerede çalıştırmak istediğiniz tüm işlemler ve maksimum sanal ayak izi için yeterlidir.

Bundan daha az değiş tokuşunuz varsa veya hiç değiş tokuş yoksa, aşağıdaki durum gerçekleşir: sistem bir sayfa ayırmaya çalışırken belleği yetersiz kalıyor. Ancak, takas olmamasına rağmen bu hala yumuşak bir başarısızlıktır, çünkü sistemde yer açmak için kaldırılabilecek birçok "mağdur" sayfa vardır: yani, yürütülebilir dosyalar gibi tüm dosya destekli bellek eşlemelerinin sayfaları ve paylaşılan kütüphaneler!

Sisteminiz veri için daha fazla alan talep ettiğinden (değiştirilemez), çalışma kümesi daha sıkı ve daha sıkı bir kümeye bölündüğü için, korkunç bir çökmeye yol açan çalıştırılabilir kodu (paylaşılan kütüphaneler ve çalıştırılabilirler) daha fazla tahliye edecektir. sayfaları.

Yer değiştirme alanı bu sorunu yumuşatır; isimsiz (dosya eşlemeyen) sayfaların değiştirilebilmesi için yer açar: çalıştırılabilir kodun bellekte kalması için bellek tahsisi için kullanılan sayfalar.

Buna rağmen, yoğun bellek gerektiren görevleri sık sık çalıştırmazsanız, çoğu zaman değiş tokuş etmekten kaçmak mümkün olabilir ve ihtiyaç duyduğunuzda bir takas dosyasını (özel bir bölüm yerine) manuel olarak yapılandırabilirsiniz. Anında bir takas dosyası yapmak için, kök ve

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

Daha fazla ihtiyacın olmadığında:

swapoff /path/to/swapfile
rm /path/to/swapfile

Notlar:

  1. Kesinlikle en az RAM'iniz kadar takas yapmanıza gerek yok. Bu genel kural, takas yönteminin tasarlanmasından dolayı zor şartların olduğu işletim sistemlerine dayanmaktadır.

  2. Kullanılabilir bellek olmadığında, yani bu sysctl girişlerinin değerlerini değiştirerek Linux'un başarısız olmasına neden olacak yöntemler vardır:

    vm.overcommit_memory
    vm.overcommit_ratio
    

2
Aslında çekirdek yapılandırma parametrelerine atıfta bulunmak için +1 - Anahtar, sorunun bir parçasıdır If I have no swap, I get an 'out of memory' error- yani false- gerçek şu ki, takas alanından çıktığınızda bellek dışı katilin tekmeleyeceği ve öldüreceği alan boşaltmak için rastgele bir işlem - bu nedenle gereken takas alanı miktarı, uygulamanızın nasıl yazıldığına bağlıdır.
Soren,

@Soren RAM'in çoğunun gerçek verilerle doldurulması muhtemeldir, bu nedenle bellek dışı katil fazla bir fark yaratmaz. Zaten 'gerçek' için teşekkürler.
wrwt

3

Daha fazla düşünceler var. Çalışmayı askıya almak / askıya almak istiyorsanız, o zaman en azından RAM'inizin büyüklüğüne ve bazılarına ihtiyacınız var. Ancak, esas olarak bir hesaplamalı iş atı oluşturduğunuz düşünülürse, ihtiyacınız olması muhtemel görünmüyor.

Bu durumda, lütfen bir bölüm yerine bir takas dosyası kullanmayı düşünün. Fazla boyutlandırma, kurtulma veya daha sonra ekleme konusunda endişelenmenize gerek yok, herhangi bir yeniden bölümlendirme gerektirmez. Bölüm üzerindeki bir dosyayı kullanarak (farkedilir) performans cezası yoktur. İhtiyacınız olursa, boyuta bir bakın ve bu da size iyi ipuçları verecektir.


1
@Kaz kaste'den farklı bir şeyden bahsettiğini düşünüyorum. Kaste, bilgisayarınızı askıya almak / hazırda bekletme modunu askıya almak, bilgisayarınızı kapatmak ve daha sonra kaldığınız yerden almak istiyorsanız, tüm RAM'inizi saklamak için yeterli takas alanına ihtiyacınız olduğunu söylüyor (başka nereye gider?).
amalloy,

@amalloy RAM'inizi takas alanınızda sakladıysanız, takas nereye gidiyor (takasın hafıza olarak kabul edildiğini hatırla - eğer kaybederse ram kaybetmekle aynıdır).
NPSF3000

2

Makineye uygulamak istediğiniz iş yükünün çalışması için belirli miktarda belleğe ihtiyaç duyulur (en yüksek yükleri kaldıracak denkleme eklemeyi unutmayın) ve bilgisayarınızı en azından buna göre yapılandırmanız gerekir.

Modern işletim sistemleri makine mevcut olduğundan daha daha fazla bellek gerekir eğer öyleyse, fiziksel bellek ve takas alanı bir kombinasyonu olarak sanal bellek sağlamak zorundadır boşluğu doldurmak için yeterli takas alanı ekleyin. Yani maksimum 80 GB'a ihtiyacınız varsa ve makinede 64 GB varsa, 16 GB takas gerekir.

Genellikle işletim sistemi yükleyicileri sizden bir başlangıç ​​takas alanı oluşturmanızı ister (bu en basit ve hatta küçük bilgisayarların kurulmasına izin verir) ve tipik Unix işlemleri için iyi bir temel kuralın sanal bellek boyutuna sahip olduğu bulunmuştur. Fiziksel belleğin üç katı, bu nedenle bu genellikle önerilir. Bununla birlikte, kullanım şekli hakkında daha fazla bilgi sahibi olursunuz, böylece uygun şekilde değiştirebilirsiniz.

Bellek baskınız her zaman daha azsa, takas alanı olmadan çalışmanın yanlış bir tarafı yoktur. Linux kullanılmayan herhangi bir belleği şeffaf bir şekilde disk önbelleği olarak kullanır.


2

"Çok fazla takas" uygulamasından çok daha iyi bir fikir () işlerinizi düzenleyerek çalışma kümelerinin belleğe sığmasını ve ardından yaptığınız işi saklamak ve almak için dosya sistemini kullanmaktır. Yani, işletim sistemini bellek kullanım modellerinin ne olacağını tahmin etmeye zorlamak yerine, bellek kullanım modellerinizi kontrol etmek için problemleriniz hakkında bildiklerinizi kullanın.

Bu yaz benimle hemen alakalı olan rastgele bir örnek olarak: Kuadratik elek uygulamasında, işaretlemek için büyük (görünüşte) bitişik bir diziye ihtiyaç duyuluyor (ayrıntıları gerçekten bu örnekte önemli olmayan bazı karmaşık algoritmalarla). Dizinin ~ 100 Giga-giriş olması gerekir, bu yüzden 1 TB aralığında kolayca. Bunu ayırmış gibi davranabilirim ve işletim sisteminin dizideki tüm sıralı yazmaları desteklemek için RAM içine ve dışına sayfa almak için inanılmaz miktarda verimsiz takas yapmasına izin verebilirim. Bağlanmış bir şey yapmak yerine, belleğe tam olarak uyan çok daha küçük bir dizi tahsis etmeyi ve bu küçük diziyi dilimlerdeki büyük dizinin geri kalanını yinelemeli olarak örtmek için tekrar kullanmaya ayarladım. Ayrıca işletim sistemini de kullandım, çalışan hizmet setini çıkardım, kabuğu değiştirdim,

SSD hızlı olabilir, ancak neredeyse hiç takas etmeye gerek kalmadan aynı işlemleri yapmak için hesaplamanızı düzenlemek kadar hızlı değildir.


1

Diğerlerinin de söylediği gibi, bir takas bölümü bol miktarda RAM'iniz olsa bile iyi bir fikirdir. Bir SSD'ye koymak iyi bir fikir değil; bir takas bölümünün sık sık yazılmaları, sonunda sürücünüzü yıpranacaktır.

Yedek bir USB 3.0 bağlantı noktanız varsa, takas alanınız için bir flash sürücü kullanmanızı öneririm. SSD'niz kadar hızlı olan birçok yüksek hızlı flash sürücü var, ancak daha ucuz - arıza yapmaya başladıysa değiştirebilecek kadar ucuz. Amazon’da yapılan hızlı bir arama, 20 doların altında bir çok iyi 16 GB USB 3.0 flash sürücü ve 60 doların altında bir miktar 64 GB sürücü olduğunu gösteriyor.

Tüm flash sürücüyü takas alanı olarak ayırın; ihtiyacınız olursa takas alanına sahip olacaksınız ve art arda yazılan belleğin kolayca (ve ucuza) değiştirilebileceğini bilerek rahat olmalısınız.


3
SSD'ye geçiş yapmamak için +1, böyle kullanıldığında çok kısa ömürlü olan bir bileşene geçmek için -1.
Aviator45003

1
@TC doğru, ArmanX - flaş (SSD) kullanmaktan kaçınmaya çalışıyorsanız, neden USB’de flaş kullandınız? Bu irrasyonel.
warren

2
@TC: Aracı takas ettiği için takas için SSD kullanmamak haksız bir şehir efsanesidir. Değişim “her zaman” olmaz, ancak nadiren gerçekleşir. Ayrıca, bu, Win7 sürümünden sonra Microsoft'ta kapsamlı bir şekilde araştırılan ve değiştirilen tipik erişim kalıplarının SSD için oldukça kabul edilebilir bir şey olduğu (Windows, Ubuntu değil, ama Linux'un çok daha kötü bir performans göstermemesi muhtemel). Hiç kimsenin okumadığı aptalca log dosyaları nedeniyle SSD'nizi yıkayan yüzlerce (veya bin) kez daha fazla yazma işleminiz var (genellikle her satırı senkronize eder).
Damon,

Mantık hatalı: eğer parmak ucu sürücüsü SSD kadar hızlıysa, neden daha ucuz?
Ajan_L

Bu bir denge. Bir yandan, bir takas dosyası olması iyi bir fikirdir. Öte yandan, bir takas dosyası bir SSD'yi yıpratırsa (ki, haklısınız, muhtemelen sorun olmaz), ucuz bir değiştirme kullanmak daha iyi olurdu - ve 20 $ 'lık bir flash sürücü çok daha iyi 100 dolardan fazla bir SSD.
ArmanX

1

1GiB (ve muhtemelen daha az) takas bile olsa iyi olacaksınız. İş bilgisayarım tipik olarak 140-150 MiB'den fazla kullanmaz. Bir gigabayt bunun için fazla miktarda kaynak ayırıyor.
Yüzlerce gigabaytta veri kümesi gerektiren görevleri hesaplamadığınız ve (bu önemli!) Verilere az ya da çok erişimli bir şekilde erişildiğinde, bundan daha büyük bir takas yapmak istemeyeceksiniz. Ama sonra tekrar, sadece bir veri dosyasını hafıza haritalamak bu uygulama için eşit derecede iyi çalışır.

Ama daha fazla takas daha fazla yardımcı olur, değil mi? Her şeyden daha iyi her zaman iyidir!

Örneğin, 16 GIB'nin değişimini ne gibi bir fark yaratacağını (veya 64 GIB'yi düşünün) düşünün. Bu 16GiB'yi hiç kullanmazsanız, ilk etapta bir kenara koymalarını sağlayamazsınız. Ama sen yoksa bunları kullanmak ne olur? Disk, ana belleğe kıyasla, oldukça yavaştır. SATA-600 SSD ile bile, 16GiB'nin aktarılması diğer bazı yapılandırmalarda 30 ila 40 saniye ve 2-4 defa sürer.
Şimdi birileri kaçınılmaz olarak, bir seferde 16GiB'ye değil, bir düzine kadar 4B sayfalara girip çıkmanızı tercih ediyor. Bu doğru olsa da, mesele yine de geçerli değil. Yalnızca birkaç sayfaya girip çıkmanız gerekiyorsa, 16GiB takas yapmanıza gerek yoktur, ancak 16GiB takas yapmanıza ihtiyacınız varsa, bunları da (bir şekilde veya başka bir şekilde) aktarmanız gerekir.

Teorik olarak, tüm kullanıcıların% 99.9'u herhangi bir takas olmadan 64GiB makineyi (veya herhangi bir 8 + GiB makinesini) bile kullanabilir ve büyük olasılıkla hiçbir şeyin eksik olduğunu asla farketmez. Ancak, bu tavsiye edilmez.
Birincisi, alt-optimaldir çünkü işletim sistemi fiziksel hafızası tükendiğinde neyi atabileceği konusunda daha az seçeneğe sahiptir. Yapabileceği iki şey var: Kullanılmayan bir şeyi değiştirin veya arabellek önbelleğindeki sayfaları atın. Eğer bir takasınız yoksa, yapabileceği tek bir şey var. Sayfaları arabellek önbelleğinden atmak zararsızdır, ancak performansı önemli derecede etkileyebilir.
İkincisi, özel anonim eşlemeler, herhangi bir takas yoksa basitçe başarısız olabilir. Bu genellikle olmaz, ancak sonunda hepsini tatmin etmek için yeterli fiziksel bellek olmadığında ve takas olmadığında, işletim sistemi yalnızca bu seçeneğe sahip olmaz, ancak ...
Üçüncüsü, korkak OOM katili başarabilir Bu, az çok rasgele bir sürecin öldürüleceği anlamına gelir. Hayır teşekkürler. Bu olmasını istediğin bir şey değil.

Bununla birlikte, bir kez X takasına ihtiyaç duymanız gibi tavsiyelerde bulunmak, yüklü RAM miktarının, duydukları bir şeyi tekrarlayan (ve anlamayan!) Onlardan bir yıl sonra tekrar duydukları (ve anlamayanlar) insanlardan gelmesidir. önce.
"RAM'inizi 2 kat kullanın" kuralı 1980'lerde ve 1990'larda baş parmak kuralını hatırlamak kolaydı, hiçbir zaman "altın gerçek" değildi (çoğu kullanıcı için tamam işe yarayan bir şeydi) ve bugünlerde hiç geçerli değil .

Kolayca karşılayabileceğiniz makul bir takas miktarına sahip olmalısınız (örneğin, bir gigabayt), böylece işletim sistemi bazı eski şeyleri sayfadan çıkarabilir ve böylece bir kez daha fazla bellek isteyince dünya hemen bitmez. Ama bu kadar.

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.