Linux'un takas okumasını tekrar hafızaya alması


28

Linux çekirdeği, 16 GB fiziksel belleğin çoğunu kullanan bir uygulamayı çalıştırdığımda çoğu sayfayı bellekten değiştiriyor. Uygulama bittikten sonra her işlem (komutları yazmak, çalışma alanlarını değiştirmek, yeni bir web sayfasını açmak, vb.) Tamamlamak çok uzun sürüyor çünkü ilgili sayfaların ilk önce takas alanından okunması gerekiyor.

Linux çekirdeğine, sayfaların her bir uygulamaya elle dokunmadan (ve beklemeden) takas edilmeden fiziksel belleğe kopyalanmasını söylemenin bir yolu var mı? Çok fazla uygulama çalıştırdım, bu yüzden bekleme daima acı verici.

Sık sık swapoff -a && swapon -asistemin tekrar yanıt vermesini sağlamak için kullanıyorum , ancak bu sayfaların değiştirilebilmesini önlüyor, bu yüzden komut dosyasını bir sonraki çalıştırışımda tekrar yazmaları gerekiyor.

Çekirdeği takas alanından tüm sayfaları okuma talimatı vermek için belki de sysfs kullanan bir çekirdek arayüzü var mı?

Düzenleme: Ben gerçekten takas tüm takas yapmak yapmak için bir yol arıyorum. (Teşekkürler derobert!)

[PS serverfault.com/questions/153946/… ve serverfault.com/questions/100448/… ilgili konulardır, ancak Linux çekirdeğinin, takasları silmeden sayfaları takastan tekrar belleğe nasıl kopyalayabilecekleri konusunu ele almayın.]


Tüm takas işlemlerinin sistem belleğinin önbelleği olmasını ister misiniz? Yani , isteğinize göre yeniden yükleyebileceğiniz sistem belleğinin bir görüntüsünü mü istiyorsunuz ? Temel olarak hazırda bekletme modunun çalışması - sistem belleğini diske görüntüler, kapatır ve açılışta görüntüyü geri yükler. Herhangi bir ihtimal var mı, bu konuyu takip eden bir sorguda sizin için yararlı olabileceğini düşünüyor musunuz? Örneğin, hafızanızı görüntülemeniz, takas işleminizi devre dışı bırakmanız, bir görevi tamamlamanız ve ardından görüntüyü geri yüklemeniz ve yinelemeniz durumunda - yapmak isteyebileceğiniz bir şey mi var?
mikeserv

Bunun takaslı bir durumda takas bırakacağını sanmıyorum. Öyle görünüyor ki, öneriniz swapoff-swapon yöntemi için bir alternatif.
drrossum

Hayır, takası önbelleğe almaz (ki bu benim için biraz gariptir) , RAM'i en bütünleyici olduğunu düşündüğünüz bir noktada önbelleğe alır, ardından sistem belleğinin tamamını önbelleği geri yüklemeden önce yoğun bir göreve tahsis eder. görev bitti. Yoğun görev sırasında takas etmek istediğiniz şeyse, sadece söz konusu görevi yavaşlatırsınız - devam ederken sayfaları değiştirmek için ekstra zamana ihtiyacınız olacaktır.
mikeserv

Yanıtlar:


4

Başlangıçta burada bulunan memdump programına dayanarak, belirtilen uygulamaları seçici olarak tekrar belleğe okumak için bir komut dosyası oluşturdum. :remember

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

Kullanım: gibi bir şey

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

Takas edilmemiş hafızaya (saniyede gigabayt) hızlı bir şekilde atlar ve takas gerektiğinde yavaşlar.


Bu araç tam olarak aradığım şeyi yapıyor. Teşekkürler!
drrossum

Güzel bir şey, gözlemlerime göre, takas sayfaların RAM’de kopyalanması, ancak takastan silinmemeleri (en azından çoğu değil, çünkü takas kullanımı sadece biraz azalır). Benim yorumum, Linux’un her sayfanın iki kopyasını, biri RAM’de, biri de takas halinde. Bu doğru kullanılırsa, takas işleminin iptal edilmesinden ve yeniden takılmasından bile daha iyidir, çünkü bu, çift sayfanın tekrar değiştirilmesi gerektiğinde, başka bir kopyaya gerek olmayacağı anlamına gelir. Onaylayabilecek herhangi bir çekirdek uzmanına teşekkürler.
Giovanni Mascellani

11

Bu yardımcı olabilir /proc/sys/vm/page-cluster(varsayılan: 3).

Çekirdek dokümantasyonundan ( sysctl/vm.txt):

sayfa küme

sayfa kümesi tek bir denemede ardışık sayfaların takastan okunduğu sayfa sayısını kontrol eder. Bu sayfa önbellek okuma kafası için takas karşılığı. Sözü edilen ardışıklık sanal / fiziksel adresler açısından değil, takas alanı üzerinde ardışıktır - bu da birlikte değiştirildikleri anlamına gelir.

Logaritmik bir değerdir - sıfıra ayarlamak "1 sayfa", 1'e "2 sayfa", 2'ye "4 sayfa" olarak ayarlanması vb.

Varsayılan değer üç (bir seferde sekiz sayfa). İş yükünüz yüksek yoğunluklu ise, bunu farklı bir değere ayarlamanın bazı küçük yararları olabilir.

Düşük değerler, ilk hatalar için düşük gecikmeler anlamına gelir, ancak aynı zamanda, ardışık sayfaların bir parçası olmuş olacaklarsa, sonraki hatalar için ekstra hatalar ve G / Ç gecikmeleri ortaya çıkar.

Belgeler bir sınırlamadan bahsetmiyor, bu yüzden muhtemelen takas işlemlerinin en kısa zamanda tekrar okunmasını sağlamak için bu absürd şekilde yükseğe yerleştirebilirsiniz. Ve elbette daha sonra tekrar aklı başında bir değere dönün.


Bu yararlı bir geçici çözüm gibi görünüyor. İki manuel müdahale, tek bir kullanıcı müdahalesi yapmak için bir uyku komutu ile birleştirilebilir. Ancak, tüm takas işlemlerinin mutlaka erişilen sayfadan art arda okuduğu için çok hızlı bir şekilde takas edilmesine neden olmayabilir. Bu, şu ana kadarki en iyi çözüm. Teşekkürler!
drrossum

tbh bu muhtemelen elde edeceğiniz en iyi çözümdür. Daha önce hiç duymadım ama takasın muhtemelen performans sorunlarınıza neden olan sürekli bir küçük GİB dizisinden ziyade bir dizi büyük GİB'e dönüştüğü görülüyor. Kişisel durumunuza mükemmel bir şekilde hitap eden bir şey olsaydı meşru olarak şaşırırdım.
Bratchley

Bu nedenle, ardışık küçük takaslar nedeniyle yavaşlamalar yaşıyorsanız, page-clusterdeğerin sürekli olarak ayarlanması bile performansı artırabilir.
Ilmari Karonen

5

En çok önem verdiğiniz programları bir gruba eklemeyi ve değiştirmeyi ayarlamayı deneyebilirsiniz, böylece uygulama bir sonraki eklediğiniz programları çalıştırdığınızda, takas için aday olma olasılığı daha düşüktür.

Sayfalarının bir kısmı hala değiştirilmeye devam edecek, ancak performans sorunlarınız çözülebilir. Büyük bir kısmı, bir programın birçok sayfasının takas edildiğinde ve programın sayfalarını RAM'e ancak yalnızca 4k'lik artışlarla değiştirmek için programın sürekli olarak duraklatılması gerektiğinden, muhtemelen yalnızca "dur ve başlat" davranışıdır.

Alternatif olarak, bir gruba çalışan uygulamayı ekleyebilir ve uygulamanın takas dosyasını en çok kullanma eğiliminde olması için değiş tokuş ayarını yapabilirsiniz. Uygulamayı yavaşlatır, ancak sistemin geri kalanını yedekler.


4

Bana öyle geliyor ki, sihirli bir şekilde "sistemi tekrar duyarlı hale getiremezsin". Ya ceza alırsınız ya da sayfalarınızı takas alanından şimdi belleğe geri okursunuz ya da daha sonra da tahakkuk ettirirsiniz, ancak bir şekilde ya da diğerine tahammül edersiniz. Aslında, böyle bir şey swapoff -a && swapon -ayaparsanız, daha az değil, daha fazla acı hissedebilirsiniz , çünkü bazı sayfaları bir daha asla gerekmeyecek ve sonuçta okunmadan bırakılacak şekilde tekrar belleğe kopyalanmaya zorlarsınız (bir uygulamadan çıktınız: Öbeklerinin çoğu değiştirilir, bu sayfalar belleğe hiç geri okunmadan tamamen atılabilir).

ancak bu, sayfaları takastan temizler, bu yüzden komut dosyasını bir sonraki çalıştırışımda tekrar yazılmaları gerekir.

Eh, takastan tekrar ana belleğe kopyalanan herhangi bir sayfa yine de neredeyse değiştirilmek üzeredir, bu yüzden gelecekte tekrar takas etmek için tekrar dışarı taşınması gerekirse, yine de takasta yeniden yazılması gerekir. Takas işleminin salt okunur sayfalar değil (genellikle dosya destekli) değil yığın bellek olduğunu unutmayın.

Bence swapoff -a && swapon -anumaraların, bulabildiğin her şey kadar iyi.


Bu ikimiz aynı anda aynı şeyi söylüyoruz;)
goldilocks

@goldilocks evet, cevabınızın mayın hazır olmadan önce göründüğünü gördüm ama çoktan bitirdim, bu yüzden onunla kaldım :-)
Celada

Sen ve goldokunlar aynı şeyi söylüyorsunuz ama takas önbelleklemenin işe yarayacağına inanmıyorum. Anladığım kadarıyla aynı anda hem değiştirilebilir sayfalarda hem de bellekte sayfalar olabilir. Takas sayfası sadece bellekteki sayfa güncellendiğinde geçersiz hale gelir.
drrossum

David Spillett tarafından bahsettiğiniz cevabın doğru olduğuna inanıyorum : aynı anda hem RAM hem de RAM'de bir sayfanız olabilir ... ancak yalnızca RAM sürümü değiştirilinceye kadar. Ardından, takastaki eski kopyayı atmanız gerekir. "Hemen hemen takastan kopyalanan herhangi bir sayfa [...] yine de değiştirilmek üzeredir" dediğimde demek istediğim, bunun çoğu zaman ne olacağını umduğumdur, bu yüzden sayfaları beklemiyorum. Her iki yerde de endişe etmeye değer önemli bir kesir olmak.
Celada

Kullanım senaryonuz farklı olabilir: sık sık okunan ve yazılmayan büyük yığınlar içeren birçok uygulamanız olabilir. Benim düşüncem, çoğu insanın böyle bir senaryosu olmadığıdır. Ama yaparsan, haklısın sanırım: senin swapoff -a && swapon -aiçin iyi olmayacak. Sanırım bu durumda /proc/<each-process>/memRAM’de olduğundan emin olmak için her bir bellek sayfasını tarayan ve okuyan bir şeye ihtiyacınız olacak . Var mı bilmiyorum.
Celada

0

Burada çok güzel bir tartışma var: http://rudd-o.com/tr/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that Sistemin algılanan duyarlılığının arttırılması fikrinin kodun değiştirilmesini önlemesi gerektiği (ve olan budur). Bu gerçekten sorunuza bir cevap değildir, ancak bu sorunun ortaya çıkmasını önleyebilir (uygulamalarınız sadece değiştirilmez, sadece kullanılmayan veriler ve sayfa önbelleği)


Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantıyı sağlamak tercih edilir.
slm
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.