Takas alanını sadece acil durumlar için nasıl kullanırım?


41

8 GB RAM ve 16 GB geçişli bir Debian (Buster) dizüstü bilgisayarım var . Çok uzun süren bir görev yürütüyorum. Bu, dizüstü bilgisayarımın üzerinden geçerken geçen altı gün boyunca açık kaldığı anlamına gelir.

Bunu yaparken periyodik olarak dizüstü bilgisayarımı dizüstü bilgisayar olarak kullanmam gerekiyor. Bu bir problem olmamalı; uzun süredir devam eden görev G / Ç'ye bağlı, bir USB sabit diskindeki şeyler üzerinde çalışıyor ve fazla RAM (<200 MB) veya CPU (<4%) kullanmıyor.

Sorun şu ki birkaç saat sonra dizüstü bilgisayarıma geri döndüğümde çok halsiz olacak ve normale dönmesi 30 dakika sürebilir. Bu çok kötü bir durumdur; çarpışma monitörleri kendi uygulamalarını donmuş olarak işaretler (özellikle tarayıcı pencereleri) ve işler yanlış şekilde çökmeye başlar.

Sistem monitörüne baktığımızda, yaklaşık yarısı kullanılmış olan 2,5 GB'lik parça değiştirilebiliyor. Bunun, takas alanını ( swapoff /dev/sda8) kaldırarak sorun olduğunu onayladım . Takas alanı olmadan bırakırsam, 24 saat sonra bile neredeyse anında canlanır. Takasla, pratikte ilk altı dakikalığına sadece altı saat kalan bir tuğla. Ben yokken bile bellek kullanımının 3 GB'ı geçmediğini onayladım .

Ben azaltarak denedi swappiness ( ayrıca bkz: Wikipedia ) değerlerine 10ve 0, ama yine de sorun devam. Hareketsizlikle geçen bir günün ardından, çekirdek bütün GUI'nin artık gerekli olmadığına inanıyor ve RAM'den siliyor (diske kaydırıyor). Uzun süren görev geniş bir dosya ağacından okumak ve her dosyayı okumaktır. Bu yüzden çekirdek, önbelleklemenin yardımcı olacağını düşünmekle karıştı. Ancak, ~ 1 milyar dosya adı olan 2 TB'lık bir USB HD'nin tek bir taramasında, ekstra bir GB RAM performansa pek yardımcı olmaz. Bu halsiz bir sabit disk ile ucuz bir dizüstü bilgisayar. Sadece verileri yeterince hızlı bir şekilde RAM'e geri yükleyemez.

Linux'a acil durumlarda yalnızca takas alanını kullanmalarını nasıl söyleyebilirim? Takas olmadan koşmak istemiyorum. Beklenmeyen bir şey olursa ve işletim sistemi birdenbire birkaç GB'ye ihtiyaç duyarsa, görevlerin ölmesini istemiyorum ve takas kullanmaya başlamayı tercih ediyorum. Ancak şu anda, takas özelliğini etkin bırakırsam, dizüstü bilgisayarım gerektiğinde kullanılamaz.

Bir "acil durum" un kesin tanımı tartışma için bir sorun olabilir. Ancak ne demek istediğimi açıklığa kavuşturmak için: Acil durum, sistemin değiş tokuş yapmak veya işlemleri öldürmekten başka bir seçeneği kalmadan bırakılması olabilir.


Acil durum nedir? - Gerçekten sormak zorunda mısın? ... Umarım kendini yanan bir binada asla bulamazsın!

Bu soruda acil durum oluşturabilecek her şeyi tanımlamam mümkün değil. Ancak, örneğin, çekirdek OOM Killer ile öldürme işlemlerine başlayacağı için belleğe o kadar itildiğinde acil olabilir . Acil durum, çekirdek, takas kullanarak performansı artırabileceğini düşündüğü zaman DEĞİLDİR.


Son Düzenleme: İşletim sistemi düzeyinde tam olarak ne istediğimi yapan bir cevabı kabul ettim. Gelecekteki okuyucular, uygulama düzeyinde çözümler sunan cevapları da dikkate almalıdır.


11
"Acil durumu" tanımlayın ve takas kullanıldığında sıradan herhangi bir durumdan bunun nasıl farklı olduğu hakkında bir şeyler söyleyin.
Kusalananda

4
Çekirdeğin takas kullanmasına izin verecek, sınır dışı "acil durum" özel bir türünü tanımlamak isteyip istemediğinizi bilmek istedim, ancak bu takas kullanılamazdı. AFAIK hafızayı hafızada bırakan ve yalnızca "acil durumlarda" her zaman yapılan bir şeydir ve "değiş tokuş" olayı, bu davranışı düzeltmek için kullanabileceğiniz tek şeydir (ancak Linux kullanıcısı değilim).
Kusalananda

2
Hayır bu doğru değil. Sadece acil durumlarda yapılmaz. En azından sorumun açıkça ortaya koyduğunu düşünmüştüm, sadece 8GB'dan 3GB kullandım ... Bu acil bir durum değil ama çekirdek yine de değişiyor. Sana takas ve çevre konularında okumanızı öneririm. Değiş tokuş yapmanın çeşitli nedenleri hakkında oldukça fazla tartışma var. Mantıklı, çekirdeğin içinde olmayan bir kavram istiyorum, ama benim isteme nedenlerim oldukça iyi haklı ..
Philip Couling

4
Tavsiyelerin her zaman "değişmeden asla çalıştırılmadığını" biliyorum. Ancak, bellek boyutları ölçeklendirilmiş sabit sürücü (HDD SSD değil) okuma / yazma hızlarını değiştirdi; bu da takas işleminin giderek daha kötü bir fikir olduğu anlamına geliyor. Bazıları 8GB RAM + 8GB takas işleminin 16GB RAM + 0 takas gerçekleştireceğine inanıyor gibi geliyor. Gerçekten yaparsa, Linux çekirdeğinde bir şeyler çok yanlış olur.
Philip Couling

7
@Philip Couling: Hayır, mesele şu ki 16 GB RAM + 16 GB takas 16 GB ve 0
takastan

Yanıtlar:


11

Bugünlerde böyle büyük bir değiş tokuş yapmak çoğu zaman kötü bir fikirdir. İşletim sistemi takas için sadece birkaç GB hafıza değiştirdiğinde, sisteminiz çoktan ölüme kadar süründü (gördükleriniz gibi).

Küçük bir yedek takas bölümü ile kullanmakzram daha iyidir . ChromeOS, Android ve çeşitli Linux dağıtımları gibi pek çok işletim sistemi, özellikle RAM az olan sistemler için yıllarca varsayılan olarak zram özelliğini etkinleştirdi. Sabit diski takas etmekten çok daha hızlıdır ve bu durumda sistemin yanıt verebilirliğini net bir şekilde hissedebilirsiniz. Bir SSD'de daha az, ancak kıyaslama sonuçlarına göre , varsayılan lzo algoritmasıyla bile hala daha hızlı görünüyor. Biraz daha az sıkıştırma oranıyla daha da iyi performans için lz4 olarak değiştirebilirsiniz . Kod çözme hızı, resmi ölçütlere göre lzo'dan neredeyse 5 kat daha hızlı

Orada da zswapbunu hiç kullanmadım rağmen. Muhtemelen bir denemeye değer ve hangisinin yararlarınız için hangisinin daha iyi olduğunu karşılaştırın

Bundan sonra, başka bir öneri, bu IO'ya bağlı işlemlerin önceliğini azaltmak ve muhtemelen yüksek bir yük altındayken komutları hemen çalıştırabilmeniz için terminalin daha yüksek öncelikli çalışmasını sağlamaktır.

daha fazla okuma


Anladığım kadarıyla, bir zramblok cihaz yaratabileceğimi , onu takas olarak kullanabileceğimi, HDD bölümü olarak daha düşük öncelikli bir takas yapabileceğimi söylüyorsunuz ?
Philip Couling

@PhilipCouling HDD kullanıyorsanız evet, kesinlikle bir zram veya benzeri çözümler kullanmalısınız. Takas alanının önceliği zramdan daha düşük olmalıdır, bu nedenle Linux ilk önce zayı kullanmaya çalışır ve sonra takası dikkate alır. Ubuntu kullanıyorsanız, zram-config paketi sizin için öncelikli ayarlara zaten dikkat eder
phuclv

3
Bu cevabı kabul ediyorum çünkü tam olarak istediğim şeyi yapıyor gibi görünüyor. Eğer 16GB'lık swap'ımı hala düşük bir öncelikte etkinleştirirsem, çekirdek onu yalnızca zswap bitince kullanacaktır. IE: "acil bir durumda". Debian-buster'a dikkat edin, zram araçlarını kurarak kurulumu çok kolaydır.
Philip Couling

25

Bir düzeltme, bellek grubu denetleyicisinin etkinleştirildiğinden emin olmaktır (bence yarı-yakın çekirdekte bile varsayılan olarak, aksi halde cgroup_enable=memoryçekirdeğin komut satırına eklemeniz gerekir ). Daha sonra, yoğun G / Ç görevinizi, kullanabileceği önbellek miktarını sınırlayan, bellek sınırlaması olan bir grupta çalıştırabilirsiniz.

Eğer systemd kullanıyorsanız, ayarlayabileceğiniz +MemoryAccounting=yesve ya MemoryHigh/ MemoryMaxya da MemoryLimitbirimde veya bir dilim onu içeren (eğer CGroup v1 veya v2 kullanıyorsanız üzerinde depeneds). Eğer bir dilim ise, systemd-runprogramı dilimde çalıştırmak için kullanabilirsiniz .

Firefox’u bellek sınırlamasıyla çalıştırmak için kullandığım sistemlerden tam örneği. Bunun v2 gruplarını kullandığına ve benim kullanıcım olarak ayarlandığına dikkat edin, kök değil (v2'nin v1 üzerindeki v2'nin avantajlarından biri, bunu root olmayanlara devretmenin güvenli olmasıdır, bu nedenle systemd bunu yapar).

$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

Kullanıcının bir çalışanı bulmasını buldum, bir dilim kullanmak zorunda kaldım. Sistem bir, sadece seçenekleri servis dosyasına koyarak (veya systemctl set-propertyservisi kullanarak ) çalışır.

İşte örnek bir servis (vgroup v1 kullanarak), son iki satıra dikkat edin. Bu, sistemin (pid = 1) örneğinin bir parçasıdır.

[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G

Belgeler içeride systemd.resource-control(5).


1
Sadece kullanarak benzer ve taşınabilir bir şey yapamaz mısın ulimit?
Eski Pro

1
@ Eski Pro gerçekten değil. İlk olarak, sayfa önbelleği dahil olmak üzere toplam bellek kullanımında (burada aşırı kullanılan kullanım) AFAIK bulunmaz. İkincisi, bellek için ulimit işlem başınadır, uzun süren görev çatal olsa bile gruplar çalışır.
derobert

Yeni sistemlerde bellek muhasebesinin varsayılan olarak etkin olmasının, systemd238 sürümündeki bir değişiklikten kaynaklandığını düşündüm .
sourcejedi

1
@sourcejedi nispeten yeni. Bellek denetleyicisi ilk kez tanıtıldığında, sadece kullanılabilir olması (kullanımda olmasa bile), bazılarının varsayılan olarak en azından devre dışı bıraktığı ve onu etkinleştirmek için bu çekirdek komut satırı argümanını geçmeniz gereken yeterince yüksek bir performans maliyetine sahipti. Performans sorunları giderildi, böylece değişti ve daha yakın bir zamanda systemd bunu varsayılan olarak da etkinleştirdi.
derobert

14

Hareketsizlikle geçen bir günün ardından, çekirdek bütün GUI'nin artık gerekli olmadığına inanıyor ve RAM'den siliyor (diske kaydırıyor).

Çekirdek buna inanan The Right Thing ™ 'i yapıyor . Neden kullanılmayan 1 belleği RAM'de tuttu ve bu kadar temel olarak önbellek veya başka bir şey kullanmak yerine israf ettin?

Linux çekirdeğinin özenle veya beklentilerin sayfalarını değiştirdiğini sanmıyorum, bu nedenle RAM'de başka bir şey depolamak için olması gerekiyorsa, bu nedenle uzun süredir devam eden görevinizin performansını veya en azından bu amaç ile geliştirmek zorundasınız.

Dizüstü bilgisayarınızı ne zaman önceden kullanmanız gerektiğini biliyorsanız, bir takas temizliği zamanlamak için ( ) atkomutunu kullanabilirsiniz .crontabswapoff -a;swapon -a

Takas temizlik gibi boğucu ve hatta OOM katil tetikleyebilir eğer RAM içinde nedense, her şey uygun için, öldürürsün sadece "unswap" 2 sen canlandırmak istiyoruz çalışan uygulamalarla ilgili her şeyi.

Bunu yapmanın bir yolu gdb, etkilenen işlemlerin her birine benzer bir hata ayıklayıcı eklemek ve bir çekirdek dökümü üretimini tetiklemektir:

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

Yazdığınız gibi, uzun süredir devam eden uygulamanız ilk geçişten sonra okuduğu verileri yeniden kullanmaz, bu nedenle uzun süreli önbelleğe almanın kullanışlı olmadığı belirli bir durumda olursunuz. Daha sonra, Will Crawford tarafından önerilen gibi doğrudan G / Ç kullanarak önbelleği atlamak iyi bir geçici çözüm olmalıdır.

Alternatif olarak, sadece düzenli yankılanan dosya önbellek temizleme olabilir 1veya 3hiç /proc/sys/vm/drop_cachesOS sizin GUI uygulamaları ve çevreyi değiş tokuş etmek için iyi bir fikir olduğunu düşündü önce sözde dosyası.

Bkz. Linux sistemindeki tamponları ve önbelleği nasıl boşaltırsınız? detaylar için.

1 Anlamda kullanılmıyor: anlamlı bir zamandan beri aktif olarak kullanılmıyor, hafıza hala sahipleriyle alakalı.
2 Takas alanında depolanan RAM sayfalarına geri yerleştirin.


2
Muhtemel sebepler hakkındaki düşünceleriniz için teşekkürler. İlgili olabileceğinden, soruya biraz ekledim. Önbelleğe alma önceliğini, uygulamanın kendi belleğine karşı azaltmanın bir yolu olup olmadığını merak ediyorum.
Philip Couling

5
“Linux çekirdeğinin boşuna ya da beklentiyle sayfaları değiştirdiğini sanmıyorum, eğer öyleyse, RAM'de başka bir şey depolamak, dolayısıyla performansı artırmak olmalı.” - Bu ifadenin biraz belirsiz olduğunu düşünüyorum. Çekirdek kesinlikle şansı ne zaman olursa olsun (örneğin, çok az disk G / Ç var) takas için sayfalar yazacaktır. Bununla birlikte, bunları RAM'den çıkarmayacaktır. Bu şekilde, her iki dünyanın da en iyisine sahip olursunuz: bu sayfalara hızlı bir şekilde tekrar ihtiyacınız varsa, bunlar zaten RAM’dedir ve yapacak bir şeyleri yoktur. Acil bir durum (OP'nin belirttiği gibi) ortaya çıkarsa, bu sayfaları RAM'de serbest bırakmanız gerekir, çünkü
Jörg W Mittag

3
… Onlar zaten takas edildi. Eğer neden Ve bu tam da değil "Sadece acil durumlarda" takas kullanmak istiyorum acil durumlarda sistem stres altında zaten ve istediğiniz son şey G / Ç için bu diskin büyük miktarda eklemek çünkü.
Jörg W Mittag

2
Bunun değişmesine neden olan şey muhtemelen uzun süren işlem: muhtemelen diskteki dosyalara erişiyor. Bellekteki bu dosyalar GUI'nin belleğinden daha yakın bir zamanda kullanılmış olacaktır.
jpmc26

3
@ JörgWMittag Linux çekirdeğinin, G / Ç kullanımı düşük olduğunda, engelleyici bir şekilde sayfaların takas alanına "tam da olsa", yani RAM'den kurtulmadan yazdığını kanıtlıyor musunuz?
jlliagre

10

Çalıştırdığınız işlem, kendi oluşturduğunuz bir şey mi?

Öyleyse , el ile sayfanınO_DIRECT alıntılandığı bayrağını kullanarak dosyaları açmak için kodunuzu ince ayarlamaya değer olabilir -

G / Ç’nin önbellek efektlerini bu dosyaya ve Genel olarak bu, performansı düşürür, ancak uygulamaların kendi önbelleklemelerini yaptığı gibi özel durumlarda kullanışlıdır. Dosya G / Ç, doğrudan kullanıcı arabelleklerine yapılır. O_DIRECT bayrağı tek başına verileri senkronize olarak aktarmak için çaba harcar, ancak O_SYNC bayrağının verilerini ve gerekli meta verilerin aktarılmasını garanti etmez. Eşzamanlı I / O’yu garanti etmek için, O_DIRECT’e ek olarak O_SYNC kullanılmalıdır. Daha fazla tartışma için aşağıdaki NOTLAR'a bakınız.


1
Başka bir benzer (ancak O_DIRECT'in hizalama kısıtlamaları olduğundan ve okurlarınız büyük değilse performansı düşüreceğinizden oldukça emin olduğumdan daha kolay), çekirdeğe bu veriyi bir daha temizlemenize gerek kalmayacağını söyleyerek çekirdeğe geçmeniz yeterlidir. sayfa önbelleği. (telefonda veya bağlantılar sağlayacaktır, üzgünüm)
derobert

1
@ robert Birisi için, nocachekomut bunu yapmak için uygun bir hack. (Bazı libc çağrılarını kaçırmak için LD_PRELOAD kullanır).
sourcejedi

6

İşte kendimi denemediğim bir fikir (ve üzgünüm şu anda bunu denemek için zamanım yok).

Arka plan işleminiz için sadece 512 MB belleğe sahip küçük bir VM oluşturduğunuzu varsayalım. Bunun, herhangi bir takas, arama veya ana bilgisayar sistemindeki takas özelliğini kapatmasını isteyip istemediğinizden emin değilim.


3

Geçtiğimiz günlerde işletim sistemleri artık birkaç yıl önce olduğu gibi swap kullanmıyorlarsa, takas alanını kaldırın ya da% 20 azaltın ( sistemlere göre değişebilir ). Muhtemelen bazı sorularına cevap veriyor:

-> resmi redhat.com

Aşağıdaki Red Hat bilgilerinden bazıları,

Geçmişte, bazı uygulama satıcıları RAM'e eşit boyutta bir takas, hatta iki kez RAM tavsiye ettiler. Şimdi yukarıda belirtilen sistemi 2 GB RAM ve 2 GB takas ile hayal edelim. Sistemdeki bir veritabanı, 5GB RAM'e sahip bir sistem için yanlışlıkla yapılandırıldı. Fiziksel bellek kullanıldıktan sonra, takas kullanılır. Takas diski RAM'den çok daha yavaş olduğu için, performans düşer ve devrilme meydana gelir. Bu noktada, sisteme giriş yapmak bile imkansız hale gelebilir. Gittikçe daha fazla bellek yazıldığı zaman, sonunda hem fiziksel hem de değiştirilebilir bellek tamamen tükenir ve OOM katili devreye girerek bir veya daha fazla işlemi öldürür. Bizim durumumuzda oldukça fazla takas mevcuttur, bu nedenle düşük performans süresi uzundur.

ve

https://wiki.debian.org/Swap

Debian linkinin yukarıdaki kısmını,

Kullanılacak takas tutarı ile ilgili bilgi ve düşünceler:

“Önerilen takas alanı miktarı, geleneksel olarak sistem belleği miktarının iki katı olmuştur. Bu, zamanla bir ya da yarım kez sistem belleği olarak değişmiştir, her iki cevap da iyi taban çizgileridir ancak zaman geçtikçe soruya daha az ve daha az yararlı cevaplar haline gelmektedir. Sisteminiz ve kullanımınız için isteyeceğiniz mevcut sistem değişimini belirleyen kullanım amacı hakkında birçok değişken var. "

Deneyebilirsiniz:

"Linux'ta takas özelliğini devre dışı bırakmanın en iyi yolu"


Kişisel not:


6 GB RAM ve son zamanlarda tüm Linux işletim sistemimde çalıştığımdan beri. Swap kullanımına dair herhangi bir belirti görmedim. Onu alan için de kapatmam gerektiğine karar verdim (birkaç gigabayt daha fazla) ve sistemimi bazen yavaşlattığı için.


1
Geçmişte, bazı uygulama satıcıları RAM'e eşit boyutta bir takas, hatta iki kez RAM tavsiye ettiler. Bunu bir şekilde görünce çok daha yaşlı hissediyorum ... Yine de ~ 528MB bariyerde HDD'lerden birine ve 2.5GB'a sahip olmama rağmen, bir şekilde bu alıntı - bu çok uzun zaman önce olan bir şey ... İlginç bir alıntı ve birkaç yıl önce benzer sorunları neden gördüğümü açıklayabilir. Düzeltmek için sysctl kullandığımma inanıyorum, ancak tam olarak hangi ayar yapıldıysa onu hatırlamıyorum.
Pryftan
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.