Mac OS X'te maksimum takas alanını nasıl artırabilirim?


14

Mac OS X Yosemite 10.10.5'te, 128 GB bellek tahsis etmesi ve kullanması gereken bir hesaplama yapmaya çalıştığımda (C ile yazılmış bir komut satırı programıdır), çekirdek işlemimi aşırı önyargı ile öldürür. Bu konsol günlüğü girdisi bir örneğe örnektir:

25/09/15 7: 08: 40.000 PM çekirdek [0]: düşük swap: öldürme pidesi 6202 (huffgrp)

Hesaplama 64 GB bellek ayırıp kullandığında iyi ve makul bir süre içinde çalışır. Mac bilgisayarımın sabit diskinde 32 GB RAM ve beaucoup alanı var. Bunu, 64 GB hesaplamanın da iyi çalıştığı, elbette daha uzun sürdüğü 8 GB RAM ile başka bir Mac'te denedim, ancak 128 GB hesaplaması çekirdek tarafından aynı şekilde öldürüldü.

Bu arada, malloc()ne kadar yer istersem de asla hata döndürmez. Çekirdek, işlemi yalnızca bu bellek çok fazla işlem tarafından kullanıldığında öldürür ve bu da sabit sürücüye çok fazla değişimle sonuçlanır.

Yani 64 GB ile 128 GB arasında bir yerde gizli bir takas alanı sınırı var gibi görünüyor.

Benim sorum: Çekirdeği daha fazla takas alanına izin verecek şekilde nasıl yeniden yapılandırabilirim? Umut verici görünümlü bir dosya buldum /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist, ama orada gizli numarayı göremiyorum. Man sayfası dynamic_pager, tüm yaptığı takas dosyalarının adını ve konumunu ayarlamak olduğunu söylüyor. Aynı man sayfasının, -Soluşturulan swap dosyalarının boyutunu ayarlama seçeneğini belgeleyen daha eski bir sürümü var . Bunu denedim, 160 GB takas dosyaları istedim, ancak hiçbir etkisi olmadı. Takas dosyaları hala 1 GB'dı ve işlem hala çekirdek tarafından öldürüldü.


Bu soruyu apple.stackexchange.com'a da gönderdim, ancak orada herhangi bir yanıt gelmedi.
Mark Adler

1
Sahip olduğunuzdan mallocdaha fazlasını yapabilmenizin nedeni, commit_limit çok yüksek (muhtemelen sonsuz) olmasıdır. Bu nedenle işletim sistemi sahip olmadığı belleği tahsis edecektir (bu işlemin kullanmayacağına bahse girer, işletim sistemi genellikle bu bahsi kazanır). Taahhüt sınırını bellek sınırı olarak ayarlamak isteyebilirsiniz, bu şekilde işlem erken başarısız olur.
ctrl-alt-delor

Neden 5. paragrafın doğru olduğunu düşündüğünüzü göremiyorum, 4. paragraftan sonra gelmiyor (“öyle” ile başlasanız da). Ayrıca çok fazla takas eklemeyi denediniz mi? (cevabın evet olduğundan şüphelenmeme rağmen soru bu konuda net değil).
ctrl-alt-delor

@richard Evet, bunu neden malloc()yaptığını biliyorum . Birisinin dönüş değerini kontrol etmediğimi düşünen biri hakkında olası yorumları saptırıyordum malloc(). Bu arada, amacım daha önce başarısız olmak değil. Amacım başarılı olmak.
Mark Adler

@richard Çünkü çekirdek mesajı "düşük takas" diyor. "Çok fazla takas ekleme" konusunda, hayır bunu yapmadım çünkü nasıl olduğunu bilmiyorum. Bu tam olarak bu soru. Takas alanı nasıl ekleyebilirim? Tabii ki, çekirdek otomatik olarak takas alanı ekler, ancak sadece bir sınıra kadar. Dolayısıyla sorunun kökü: Çekirdeğin takas alanı sınırını nasıl artırabilirim?
Mark Adler

Yanıtlar:


4

İstediğiniz yanıt değil, ancak uygun bir boyutta kendi dosyanızı oluşturursanız, bunu işleminize ekleyin ve ardından hesaplamanızı bu adres alanında çalıştırın, bir takas dosyasıyla aynı etkiye sahip olmalıdır ve kullanılabilir RAM / swap için diğer işlemlerle rekabet yerine alan var.

Ayrıca, verilerin üzerine ne sıklıkta yazdığınıza bağlı olarak daha yavaş olabilir, ancak çok daha taşınabilir olmalıdır.


2
İyi fikir! Yüksek umutlarım vardı. Ne yazık ki, gerçekliğin sert kıyılarına çarptılar. Süreç, sanal bellek olarak kullanmak için oluşturduğum bir dosyayı kullanıyor olsa bile, daha önce olduğu gibi ("düşük takas" konsol mesajı) büyük miktarda takas için çekirdek tarafından hala öldürüldü mmap().
Mark Adler

Üzgünüm, tecrübelerimin çoğu Linux ile. Ancak, belki de sorun, çekirdeğin dosyaya geri dönmemesi ve RAM'de tutmamasıdır. Ya periyodik msync()olarak bunu yapmaya zorlarsanız?
dataless

0

Mac bilgilerim oldukça tarihli, artık bunu yapmak için çekirdek büyüsü olmayabilir. Bu nedenle, çok basit bir şekilde takas olarak bir klasör veya bölüm bağlayabileceğiniz bu program için Linux kullanmanızı öneririm.

Dinamik bir takas klasörü kullanmanın belirsizliklerini ortadan kaldırın. Fiziksel takas bölümü oluşturun (yalnızca boş, biçimlendirilmemiş bir bölüm, takas için disk tablosu tür koduyla, Linux'ta onaltılık koddur 0x82.) Sonra:

  1. / Etc / rc dosyasını düzenleyerek takas bölümü yorumunu bulabilirsiniz. satırı eklemount -vat swap
    • / etc / fstab içindeki tüm takas bölümlerini bağlama anlamına gelir
  2. Çalıştırmak pdisk /dev/disk? -dump
    • "?" hd kaydınızın disk numarası takas bölümünün yanındaki sayıdır
  3. / Etc / fstab (büyük olasılıkla mevcut değil) düzenleyin veya oluşturun /dev/disk?s?? none swap sw 0 0
    • ? senin disk.
    • ?? takas bölümünün sayısıdır.
  4. reboot.
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.