Takas alanının yaklaşık 40 GB boş hafıza içeren bir ana bilgisayarda kullanıldığından endişe etmeli miyim?


39

Aşağıda bir üretim sunucum var:

htop

Sistem, yaklaşık 40 GB boş, kullanılmayan bellek alanı korurken, 1 GB takas kullanıyor. Bu konuda endişelenmeli miyim yoksa çoğunlukla normal mi?


23
Aslında, yaklaşık 40GB belleği boşa harcayan gerçek yüke sahip bir üretim sunucusu hakkında endişelenmelisiniz. Kuşkusuz bu belleği koymak için bir yol bulabilirdi - uygulamalar disklere erişiyor, bu belleği bu verilerin bir kısmını önbelleğe almak, G / Ç'leri azaltmak ve performansını artırmak için kullanamaz mıydı? İş yapan bir makineye neden 40 GB bellek harcanıyor? Endişelenmen gereken şey bu. Bu normal değil.
David Schwartz

25
Bize çıktısını göstersen çok daha faydalı olurdu free -m. Grafiklerin okunması zor.
user9517 GoFundMonica'yı

@DavidSchwartz - Bu konuda hala aktif olan ilgili bir sorum var. serverfault.com/questions/825909/…
MrDuk

Yanıtlar:


68

Bu bir problem değil ve muhtemelen normal. Çok sayıda kod (ve muhtemelen veri) çok nadir kullanılır, böylece sistem belleği boşaltmak için değiştirir.

Değiştirme, yalnızca hafıza sürekli olarak içeri ve dışarı alındığında sorun olur. Performansı öldüren ve sistemin başka bir yerinde bir problem öneren bu tür bir faaliyettir.

Eğer takas aktivitenizi izlemek istiyorsanız, birkaç araçla yapabilirsiniz, ancak vmstatgenellikle oldukça kullanışlıdır.

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 348256  73540 274600    0    0     1     9    9    6  2  0 98  0  0
 0  0      0 348240  73544 274620    0    0     0    16   28   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   29   33  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   21   23  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   24   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   23   23  0  0 100  0  0

Sistem başlatıldığından beri ilk satırdaki aktivite olduğunu görmezden gelin. Not sive soaltında sütun ---swap--; çoğu zaman 0 değilse, genellikle oldukça küçük rakamlar olmalıdırlar.

Ayrıca bahsetmeye değer, bu önleyici takas işleminin bir çekirdek ayarı ile kontrol edilebileceğidir. Konumundaki dosya /proc/sys/vm/swappiness, çekirdeğe belleği ne kadar agresif bir şekilde değiştireceğini söyleyen 0 ile 100 arasında bir sayı içerir. Bunun neye ayarlanmış olduğunu görmek için dosyaya tıklayın. Varsayılan olarak, çoğu Linux bunu varsayılan olarak 60'a dağıtır, ancak bellek bitmeden herhangi bir değiş tokuş görmek istemiyorsanız, aşağıdaki gibi bir dosyaya 0 eko yapın:

echo 0 >/proc/sys/vm/swappiness

Bu ekleyerek kalıcı yapılabilir

vm.swappiness = 0

için /etc/sysctl.conf.


14
Ayrıca, bu önleyici takas işleminin bir çekirdek ayarı ile kontrol edilebileceği de belirtmeye değer. / Proc / sys / vm / swappiness dosyasında, çekirdeğe belleği ne kadar agresif bir şekilde değiştireceğini söyleyen 0 ile 100 arasında bir sayı bulunur. Bunun neye ayarlanmış olduğunu görmek için dosyaya tıklayın. Varsayılan olarak, çoğu Linux dağıtımlar 60 bu varsayılan, ancak hafıza tükenmeden önce herhangi takas görmek istemiyorsanız, böyle dosyaya bir echo 0: echo 0 >/proc/sys/vm/swappiness. Bu vm.swappiness = 0/etc/sysctl.conf dosyasına eklenerek kalıcı yapılabilir .
virtex

@ virtex: Masaüstümde swappiness = 1 veya 10'dan küçük bir şey kullanmayı seviyorum. Bu, çoğu zaman sunucularda da iyi olabilir. Tamamen yasaklamaksızın RAM'ı daha fazla sayfa önbelleği için serbest bırakmak için takas etmekten kesinlikle vazgeçirin.
Peter Cordes,

1
@PeterCordes Sunuculara, özellikle de veritabanlarına erişen veya dosya sunanlara dikkat edin. Bunlar, bellekten dosya önbellekleri için uygun olmalarından çok yararlanabilirler.
Jonas Schäfer

4
@JonasWielicki: swappiness=7Uzun zamandır kullanılmayan sayfalarla bile olsa bir şeylerle değiştirilir. swappiness=0Diğer değerler arasında ve hatta düşük değerler arasında büyük bir fark var . Çekirdek varsayılanı swappiness=60genellikle sunucular için iyidir ve yalnızca düşük bir takasın iyi olduğu masaüstü etkileşimli kullanım içindir. Ancak onu 7'ye ayarlamak veya bir şey çok fazla acı vermemelidir. (Ancak kontrol etmedim, sunucu sysadmin değilim).
Peter Cordes,

2
@PeterCordes Bellek baskısı yapana kadar, her şey swappinessharika. Baskı ile, swappiness=7dosya önbelleğini neredeyse tamamen uzun bir süre aç bıraktığını görürken, swappiness=60çok fazla önbelleği kapatır ancak saniyeler içinde değiş tokuş etmeye başlar. Hala atışı alan önbellek, ama çok daha dengeli bir şekilde.
kubanczyk

25

Linux, yapacak daha iyi bir şeyi yoksa, önleyici olarak sayfaları diske yazar. Yani yok değil olsa, bellekten bu sayfaları tahliye olacağı anlamına. Bu durumda sadece o var olmalıdır zaten olduğundan bazen gelecekte bu sayfaları tahliye, o onları diske yazılacak beklemek gerekmez.

Ne de olsa, hafızanızın tükenmesinin nedeni, muhtemelen makinenizin zaten çok çalışmakta olması nedeniyle, ek bir takas işlemi ile daha fazla yük yüklemek istemezsiniz. Makine hiçbir şey yapmıyorken takas işlemini yapmak daha iyidir.

Benzer bir nedenle, hafızanız her zaman dolu olmalıdır. Bellek sayfaları, dosya sistemi önbelleği, tmpfsbellekte tutulabilecek çok şey var. Gerçekten, hafızanız boşsa endişelenmelisiniz; Sonuçta, bunun için çok para ödediniz (en azından aynı disk alanıyla karşılaştırıldığında), bu yüzden daha iyi kullanılsın!


Jorg, çekirdeğin önceden disklere disklere yazdığı sayfalar, takas sayfaları değil, kirli disk önbellek sayfalarıdır. Vm.dirty_background _... tunnables bunu kontrol eder. Takas etme etkinliği, ayarlanabilen takas özelliğine göre başlar ve boş zamanları beklemez.
Lucas

11

Kullanılan takas işlemi fena değil, ancak takas etkinliğinin büyük bir kısmı

  vmstat 1
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  6  0 521040 114564   6688 377308    8   13   639   173    0 1100  5  4 90  0
  1  0 521040 114964   6688 377448    0    0   256     0    0 1826  3  4 94  0
  0  0 521040 115956   6688 377448    0    0     0     0    0 1182  7  3 90  0
  0  0 521036 115992   6688 377448    4    0    16     0    0 1154 10  2 88  0
  3  0 521036 114628   6696 377640    0    0   928   224    0 1503 15 17 67  1

Swapd sütunu hiç sorun değil. Si ve benzeri sütunlarda sıfır olmayan değerler sunucu performansına ölümcül olur. Özellikle çok miktarda RAM olanları.

Birkaç GB ram bulunan makinelerde swapinness özelliğini devre dışı bırakmak en iyisidir:

sysctl -w vm.swappiness=0

Bu, takas işlemini devre dışı bırakmaz. Linux'a sadece takas alanını son çare önlemi olarak kullanma talimatı verilecek. Bu, RAM'de olması gerekmeyen birkaç MB programı boşa harcar ... Ancak disk erişim sıralarınızı şişirmek için takas etmek tercih edilir.

Düzenleme 1: varsayılan takas değerinin neden uygun olmadığı

Yirmi yıl önce, büyük bir 486'nın sadece 32Mb RAM'e sahip olduğunu hatırlamalıyız. Takas algoritmaları, RAM'in tamamı küçük bir saniyede diske taşınabilirken geliştirildi. O zamandaki yavaş disklerle bile. Varsayılan takas politikalarının bu kadar agresif olmasının nedeni budur. RAM o günlerde darboğazdı. O zamandan beri RAM boyutu 10.000 kattan fazla arttı ve disk hızları 10 kattan azdı. Bu, tıkanıklığı disk bant genişliğine kaydırdı.

Düzenleme 2: Neden bu kadar aktivite sunuculara ölümcül?

Si ve bu yüzden ton RAM'e sahip makinelerde aktivite ölümcül, çünkü sistemin RAM için savaşmakta olduğu anlamına geliyor. Olan şu ki, diskler, hatta büyük depolar RAM'lere kıyasla çok yavaşlar. Agresif takas, uygulama verileri üzerinde çekirdek disk önbelleğini tercih eder ve RAM için en yaygın mücadele kaynağıdır. İşletim sistemi her si için disk önbelleğini boşaltmak zorunda kalacağı için , takasın sağladığı ekstra önbelleklerin yaşama süreleri zaten faydalı olamayacak kadar düşüktür. Sonuç olarak, muhtemelen kullanılmayacak olan önbelleği saklamak için disk bant genişliğini alıyorsunuz ve si sayfalarını bekleyen programlarınızı duraklatıyorsunuz . Uygulamalara çok az fayda sağlayan veya hiç fayda sağlamayan çok sayıda kritik kaynak tüketen anlamına gelir.

Yanıtın "çok fazla RAM içeren sunucularda çok fazla takas etkinliği" başlıklı notunu not alın. Bu, arada sırada si ve benzeri aktiviteye sahip makineler için geçerli değildir. Bu, işletim sistemlerinde daha akıllı takas algoritmaları geliştirildiğinde ileride geçerli olmayabilir.

3: "soğuk" sayfaları düzenleyin

İnsanlar takas algoritmasını romantikleştirir. Bazıları "RAM'in daha az kullanılan sayfalarını alır" diyor, ama çekirdeğin yaptığı şey bu değil. Değişimin anlaşılması zor olan şey, çekirdeğin "soğuk sayfa" nın ne olduğunu bilmemesidir. Çekirdek, sayfanın kullanılıp kullanılmayacağını veya yakın gelecekte kullanılması muhtemel olup olmadığını belirlemek için iyi bir metriğe sahip değildir. Çekirdeğin takas yerine sayfaları rastgele veya daha az rastgele yerleştirmesi ve gerekmeyen sayfalar orada kalması için kullanılır. Bu algoritmanın sorunu, sayfaların uygulamaların gerekip gerekmediğini bilmek için takas alanına gitmesi gerekmesidir. Ve bu, bir çok "sıcak" sayfanın takas alanına gideceği anlamına gelir. Bununla ilgili sorun, RAM'lere kıyasla disklerin çok yavaş olması.

İyi bir hacme sahip birçok uygulama için çok yaygın olan gerçekçi bir senaryo olan kendi ölçütümü oluşturdum. Testlerimden, takas kullanımda iken verimlilik veya gecikme konusunda hiçbir fayda görmedim. Ne münasebet. Değiş tokuş başladığında, hem verimi hem de gecikmeyi en azından bir büyüklük sırasına göre yavaşlatır.

Bu konuda biraz daha ileri gidiyorum: Takas işlem için değil anlıyorum. Takaslar sadece acil durumlar içindir. Aynı anda çok fazla uygulamanın çalıştığı o anlar ve bir ani artış elde edersiniz. Takas olmadan bu bellek yetersiz hatalara neden olur. Takas kullanımını geliştirme ve üretim ekiplerinin başarısızlığı olarak görüyorum. Bu sadece burada tartıştığımızın ötesine geçen bir fikir, fakat düşündüğüm şey. Tabii ki uygulamalarımın kendi başlarına mükemmel hafıza yönetimi var.


9
"Değişkenliği engellemek için en iyi" En iyisi, neden? (En iyisi, hangi amaç için?) Varsayılan, tüm kullanımlar için doğru olmayabilir, ancak yine de değiştirmek için bir nedene ihtiyacım var.
Jpaugh

3
Nasıl sidaha sunucunuza daha ölümcül bi? Her ikisi de, bazı programların diskten belleğe 4096 bayt okunmasını beklediği anlamına gelir. biHerhangi bir dosya olduğunu ve sidosyaların belirli dar kategoriden (ama onların bayt hareket kadar hızlı tam olarak aynı yolu).
kubanczyk

2
128 MB ram'lı bir 486 çok nadirdi ve bir ana bilgisayar ya da süper bilgisayar olarak kabul edilirdi - bu nedenle CPU pek olası değildi 486. Eski 486'mın 4 MB RAM'i vardı ve arkadaşımın makinesini 16 MB ram (kısmi sunucular) ile kıskanıyordum. 16 - 32 MB RAM vardı). Pentium'lara hızlı bir şekilde ilerleyin ve normal olarak 8 - 16 MB görmeye başlıyoruz. Pentium3 ilk göründüğünde (CPU'lar normalde 1 GHz'i aştığında) 32 MB normaldi ve web sunucuları genellikle 64 ila 128 MB'a sahipti.
slebetman,

swappiness=0sunucular için tamamen uygunsuz görünüyor. Etkileşimli bir masaüstü sistemi için düşünebilirsiniz (ancak o zaman bile, swappiness=1en sonunda çok soğuk sayfaları değiştirmek için daha iyi bir seçimdir). Başka bir cevapla ilgili yorumları görün . swappiness=7veya bir şey, soğuk sayfaları RAM'e sabitlemeden 60OOM'a kadar önemli ölçüde takas etkinliğini azaltacaktır ve belirli bir sunucu için çok takas edip edemeyeceğinizi düşünmeye değer .
Peter Cordes

1
@kubanczyk: Bence sidaha kötü bi. Çoğu sunucu yazılımı, diskten G / Ç'nin yavaş olabileceği varsayımı etrafında tasarlanmıştır ve G / Ç'de beklerken genel olarak duyarlı kalmak için iş parçacıkları, zaman uyumsuz G / Ç veya başka bir teknik kullanır. Bir sayfa hatası her yerde olabilir. En kötü durumda, kilitlendikten sonra yavaşça bir sayfa hatası olabilir ve diğer tüm dişlilerin bu kritik bölüme ~ 10ms girmesini engeller (yavaş rotasyonel depolamada takas ile). Kritik bir bölüm paylaşılan bir veri yapısından potansiyel olarak soğuk bir sayfaya veri kopyalarsa bu olası olabilir.
Peter Cordes

8

Bu sorunuzun cevabı değil; ama daha doğrusu, bilinçli bir karar vermenize yardımcı olacak ek bilgilerdir.

Hangi işlemlerin özellikle ne kadar değiş tokuş kullandığını bilmek istiyorsanız, işte size küçük bir kabuk betiği:

#!/bin/bash

set -o posix
set -u

OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
  PID=`echo $DIR | cut -d / -f 3`
  PROGNAME=`ps -p $PID -o comm --no-headers`

  SUM=0
  for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
    let SUM=$SUM+$SWAP
  done
  echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"

  let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"

Ayrıca, tmpfs’lerin de değiştirileceğini de eklemeliyim. Bu, tmpfs kullanarak kullanıcı alanı / tmp kaplamaları oluşturan systemd kullanan modern linux sistemlerinde daha yaygındır.


Güzel senaryo. Smem'e de bir göz at.
user9517, 12:17,

Bence bunu daha verimli bir şekilde yazabilirsiniz ( çok daha az çatallanmış işlem) awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps. Bu her işlem için cut ve ps komutunu çalıştırır ve sistemdeki her işlem için grep + awk komutunu birkaç kez çalıştırır.
Peter Cordes

0

Ajanlar yoğun bir şekilde yer değiştirirken MySQL Cluster replikasyonunun yavaşladığını veya başarısız olduğunu fark ettim. Belki bazı uygulamalar umursamıyor ya da belki bazı değiş tokuşlardan yararlanıyor ama veritabanları gerçekten de bundan zarar görüyor. Bununla birlikte, forumlarda gördüğüm birçok tartışma, belirli iş yükü tartışmasından decontextualized takas tartışır.

DBA dünyasında fikir birliği var gibi görünüyor "MySQL (ya da gerçekten başka herhangi bir DBMS çalıştırırken) takas alanınızda herhangi bir G / Ç görmek istemiyorsanız sağduyulu. Önbellek boyutunu ölçeklendirme (kullanarak (MySQL'in durumunda) innodb_buffer_pool_size) yeterli boş bellek olduğundan emin olmak için standart bir uygulamadır, böylece takas gerekmez.

Ama ya bir hata yaparsanız ya da yanlış hesaplarsanız ve takas yaparsanız ne olur? Performansı gerçekten ne kadar etkiliyor? Bu tam olarak araştırmaya karar verdiğim şey. "

Umarım okuyucular aşağıdaki bağlantıları apropos bulur.

https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/

https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/


1
Sunucu Arızasına Hoşgeldiniz! Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak tercih edilir.
Frederik Nielsen
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.