Linux etiketine cevap veriyorum . Cevabım sadece Linux'a özgü .
Evet, devasa sayfalar parçalanmaya daha yatkındır. Belleğin iki görünümü vardır, işleminiz (sanal) ve çekirdeğin yönettiği (gerçek). Herhangi bir sayfa büyüdükçe, özellikle de hizmetiniz varsayılan olarak onlardan daha fazla bellek ayıran ve daha fazla bellek ayıran diğerlerini desteklemesi gereken bir sistemde çalışırken, komşularını gruplandırmak (ve onunla birlikte tutmak) daha zor olacaktır. aslında sonunda kullanmak.
Çekirdeğin (gerçek) verilen adresleri eşlemesi özeldir. Kullanıcı alanının çekirdeği onları sunduğu gibi görmesinin çok iyi bir nedeni var, çünkü çekirdeğin kullanıcı alanını karıştırmadan fazla işlem yapabilmesi gerekiyor. İşleminiz , çekirdeğin aslında sahne arkasındaki bellekle ne yaptığından habersiz, çalışacak güzel, bitişik bir "Disneyfied" adres alanı alır .
Uzun süredir çalışmakta olan sunucularda düşük performans görmenizin nedeni büyük olasılıkla, açıkça kilitlenmemiş (örneğin mlock()
/ mlockall()
veya posix_madvise()
) ve bir süredir değiştirilmemiş olan ayrılmış bloklar sayfalara ayrıldığından, hizmetinizin okunması gerektiğinde diske kayması anlamına gelir onlar. Bu davranışı değiştirmek, işleminizi kötü bir komşu yapar , bu nedenle birçok kişi RDBMS'lerini web / php / python / ruby / whatever'den tamamen farklı bir sunucuya koyar. Bunu düzeltmenin tek yolu, bitişik bloklar için rekabeti azaltmaktır.
Parçalanma yalnızca A sayfası bellekte olduğunda ve B sayfası değiş tokuşa taşındığında (çoğu durumda) gerçekten fark edilir. Doğal olarak, hizmetinizi yeniden başlatmak bunu `` iyileştiriyor '' gibi görünebilir, ancak sadece çekirdek, henüz tahsis edilen oranın sınırları içinde yeni tahsis edilmiş blokları (şimdi) sayfadan çıkarma fırsatına sahip olmadığı için.
Aslında, yüksek bir yük altında 'apache'nin yeniden başlatılması (diyelim) büyük olasılıkla diğer hizmetlerin sahip olduğu blokları doğrudan diske gönderecektir. Yani evet, 'apache' kısa bir süre için iyileşirdi, ama 'mysql' acı çekebilir .. en azından çekirdek yeterli fiziksel hafıza eksikliği olduğunda çekirdek eşit derecede acı çekene kadar.
Daha fazla bellek ekleyin veya talepkar malloc()
tüketicileri ayırın :) Sadece bakmanız gereken parçalanma değil.
vmstat
Nerede depolandığına dair genel bir bakış elde etmeye çalışın .