Aşağıda bir üretim sunucum var:
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?
free -m
. Grafiklerin okunması zor.
Aşağıda bir üretim sunucum var:
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?
free -m
. Grafiklerin okunması zor.
Yanıtlar:
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 vmstat
genellikle 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 si
ve so
altı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
.
echo 0 >/proc/sys/vm/swappiness
. Bu vm.swappiness = 0
/etc/sysctl.conf dosyasına eklenerek kalıcı yapılabilir .
swappiness=7
Uzun zamandır kullanılmayan sayfalarla bile olsa bir şeylerle değiştirilir. swappiness=0
Diğer değerler arasında ve hatta düşük değerler arasında büyük bir fark var . Çekirdek varsayılanı swappiness=60
genellikle 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).
swappiness
harika. Baskı ile, swappiness=7
dosya ö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.
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, tmpfs
bellekte 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!
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.
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ı.
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.
İ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.
si
daha sunucunuza daha ölümcül bi
? Her ikisi de, bazı programların diskten belleğe 4096 bayt okunmasını beklediği anlamına gelir. bi
Herhangi bir dosya olduğunu ve si
dosyaların belirli dar kategoriden (ama onların bayt hareket kadar hızlı tam olarak aynı yolu).
swappiness=0
sunucular için tamamen uygunsuz görünüyor. Etkileşimli bir masaüstü sistemi için düşünebilirsiniz (ancak o zaman bile, swappiness=1
en 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=7
veya bir şey, soğuk sayfaları RAM'e sabitlemeden 60
OOM'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 .
si
daha 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.
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.
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.
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/