Bol miktarda boş hafıza kaldığında neden Swap kullanılır?


35

İyi bellek kaynaklarına sahip oldukça iyi bir web (özel) sunucum var:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Gördüğünüz gibi, bol miktarda boş bellek bulunduğunda sunucum takas kullanıyor.

Bu normal mi, konfigürasyonda veya kodlamada bir sorun mu var?

Not
MySQL sürecim bir sebepten dolayı CPU gücünün% 160'ından fazlasını kullanıyor; Nedenini bilmiyorum ama 70'ten fazla eşzamanlı kullanıcım yok ...


Uygulamalar Linux'ta CPU'nun% 100'ünden fazlasını kullanabilir mi? Erm ...
BlueRaja

5
@BlueRaja: Evet, çünkü Linux'ta CPU kullanımı, sisteminizdeki tüm CPU'lar için değil, tek bir CPU'ya göre ölçülür. Bu yüzden 8 işlemcili bir makinede, maksimum% 800 işlemciye sahipsiniz.
Daniel Pryden

MySQL'in hangi sürümünü kullanıyorsunuz ???
RolandoMySQLDBA

@RolandoMySQLDBA sürüm 5.5
user1179459 11:12

Yanıtlar:


61

Bu tamamen normal.

Sistem başlangıcında, bir dizi servis başlar. Bu servisler kendilerini başlatır, konfigürasyon dosyalarını okur, veri yapıları oluşturur vb. Biraz hafıza kullanıyorlar. Bu hizmetlerin birçoğu, sistemi kullandığınız süre boyunca bir daha asla çalışmayacak, çünkü siz onları kullanmıyorsunuz. Bazıları saatler, günler veya haftalar içinde koşabilir. Yine de tüm bu veriler fiziksel bellekte.

Tabii ki, sistem bu verileri çöpe alamaz. Kelimenin tam anlamıyla erişilemeyeceğini kanıtlayamaz. Bu servislerden biri, örneğin, kutuya uzaktan erişim sağlayan servis olabilir. Bir hafta içinde kullanmamış olabilirsiniz, ancak kullanırsanız daha iyi bir iş çıkardı.

Ancak sistem, bu fiziksel belleği bir disk önbelleği gibi şeyler için veya performansı artıracak başka şekillerde kullanmak isteyebileceğini biliyor. Bu yüzden fırsatçı değiş tokuş yapar. Yapacak daha iyi bir şeyi olmadığı zaman, çok uzun zamandır kullanılmayan verileri diske, takas alanını kullanarak yazar. Ancak, sayfaları hala fiziksel bellekte tutar. Böylece hala yerlerine takılmak zorunda kalmadan erişilebilirler.

Şimdi, eğer sistem daha sonra bu fiziksel belleğe başka bir şey için ihtiyaç duyuyorsa, bu sayfaları basitçe çöpe atabilir, çünkü zaten takas için yazmıştır. Bu, sisteme her iki dünyanın da en iyisini verir. Veriler hala bellekte tutulur, böylece diskten okumak zorunda kalmadan erişilebilir. Fakat sistem bu hafızaya başka bir amaç için ihtiyaç duyuyorsa, önce onu yazmak zorunda kalmayacak. Her yerde büyük kazanç.


Bu durumda, neden bazen takas alanının hiç kullanılmadığını açıklayabilir misiniz? Mem: 49554484k toplam, 4087592k kullanıldı, 45466892k ücretsiz, 349244k arabellek Takas: 94204k toplam, 0k kullanıldı, 94204k ücretsiz, 1113644k önbelleğe
alındı

4
@ananthan: Bunun birçok nedeni olabilir. En muhtemel olanı, tamponlanmış yazmalardan dolayı bile sistemin hiçbir zaman herhangi bir hafıza baskısı altında olmamasıdır, dolayısıyla fırsatçı takas kodu hiçbir zaman tetiklenmemiş olabilir. Birisi takas kullanımının kötü olduğunu düşündü ve bu nedenle sistemi fırsatçı bir şekilde değiştirmemek için yanlış bir şekilde ayarladı ( değişebilirliği azaltarak ).
David Schwartz

6

Bu, geçmişte bir süre makinede fiziksel RAM'inizden daha fazla belleğe ihtiyaç duyduğunuzda ortaya çıkabilir. O zaman takas alanına bazı veriler yazılacak.

Daha sonra bellek boşaltıldığında, takastan gelen veriler otomatik olarak RAM'e geri okunmaz: bu, takastaki veriler aslında bazı işlemler için gerekli olduğunda gerçekleşir. Bu tamamen normal.

MySQL işleminiz gelince: bu tüm çalıştırdığınız sorgu türüne bağlıdır. Teoride 2, çok karmaşık sorgular, kullanıcı sayınız ne olursa olsun, böyle bir yük elde etmek için muhtemelen yeterli olabilir. Yavaş sorgu günlüğünün hangi sorguların yoğun olduğu konusunda daha fazla bilgi edinmesini sağlayabilirsiniz.


No - swap kullanımı yüksek su işareti değildir. Sayfalar takas edildiğinde geri haritalanır, disk sayfaları kullanımda değil olarak işaretlenir (ancak yine de veri içerebilir).
symcbean

Takas kullanımına sahip olabileceğiniz tek bir senaryodan bahsetmiştim, ancak bu aslında her zaman yeterli fiziksel belleğe sahip olmanın semptomu değildir - yukarıda David Schwartz tarafından da açıklandığı gibi
beyin99

3

Bu davranışı, ayrıca sysctl -w vm.swappiness=10gerektiğinde takas kullanımını büyük ölçüde azaltacak şekilde değiştirebilirsiniz.

MySQL'e gelince, en azından tuning-primer.sh betiğini kullanarak bir temel yapılandırma testi yaptınız mı?


1
Bu, önbellek / tamponların geri kazanılma eğilimini artıracaktır. Maalesef% 29,53 rakamının tampon / önbellek içerip içermediği orijinal sorudan net değil. Öyle değilse, önerdiğiniz değişikliği yapmanın performans üzerinde olumsuz bir etkisi olacağı kesin. Bu dbms yoğun bir şekilde innodb kullanıyorsa, muhtemelen kötü bir şekilde yapılandırılmıştır (web sunucusu olarak kullanmak için tek bir 8 çekirdekli 16 gb kutu, başlamak için bir BAD tasarım seçeneğidir)
symcbean

neden web sunucusu için kötü bir seçim olduğunu söylüyorsun? innodb kullanmıyorum çünkü hala myisam'ı tercih ediyorum çünkü okurlarım% 70 ve sadece% 30 yazıyor ....
user1179459

1

Bu muhtemelen, David'in açıkladığı gibi, Linux Çekirdeğinin normal bir davranışıdır, ancak aynı zamanda MySQL “takas deliliğini” probleminin bir sonucu olabilir . Durumunuzda (8 CPU, toplam 16 GB RAM, 5 GB kullanılmış), bunun gerçekleşmesi için, bilgisayarınızın 4 düğüm (soket) ve düğüm başına 4 GB RAM ve 4'lü MySQL InnoDB arabellek havuzu olan bir NUMA sistemi olması gerekir. GB.

Kısacası (tüm detayları görmek için yukarıdaki bağlantıyı okumalısınız), olan bu:

  1. Sisteminiz başlatıldığında, işlemler bazı NUMA düğümlerinde belleklerinin bir kısmını kullanarak yayılır.
  2. MySQL başladığında, bir NUMA düğümünün RAM'ini doldurarak ve diğer düğümlerde bir miktar RAM kullanarak InnoDB arabellek havuzu için 4 GB ayırır.
  3. Daha sonra, tahsis edilmiş RAM'i bir NUMA düğümünden bir başkasına taşıyamayan Linux çekirdeği, sayfaları aç düğümden çıkarmanın iyi bir fikir olduğunu düşünür (ya da sayfaların değiştirilmesi gerektiğinden sayfaları değiştirmek gerekir).

Bunu önlemek için, MySQL'in tüm belleklere RAM ayırması için bellek tahsisini değiştirin (daha fazla ayrıntı için yukarıdaki bağlantıya bakın).

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.