Ana içeriğe geç

Bitmek Bilmeyen Linux Swap Meselesi

Linux'ta swap alanı ile ilgili bir yerlerde sürekli olarak bir şeyler konuşuluyor, yazılıyor, çiziliyor. Tıpkı şu an benim yaptığım gibi...

Fakat maalesef - belki de benim şanssızlığımdır - okuduğum yazılar gerçeklikten uzak ve yanlış bilgilerle dolu oluyor. Öncelikle sık karşılaştığım yanlışlara değinmek isterim.

Linux'ta Swap Ne DEĞİLDİR?

  • Hard diskin RAM olarak kullanılması... Değildir.

Böyle bir şey mümkün olamaz zaten. 1 TB boyutunda sabit diski swap olarak verdiğimizde, 1 TB RAM'imiz mi olacak gerçekten? Swap alanı böyle bir şey değil.

  • RAM'in hard disk'ten ödünç alan alması... Değildir.

Ödünç almalık bir durum yok. Diskinizde swap alanınız zaten bellidir. Swap için ayırdığınız alan, zaten ayrılmıştır. İhtiyaç hâlinde içine veri yazılabilir. Ancak hiç ihtiyaç olmasa bile artık ayrılmış bir alandır. Ödünçlük bir durum yoktur. Oranın adı swap'tir artık. Kullanıp kullanmamanız, durumu değiştirmez.

Zaten RAM de gidip kimseden ödünç alamaz. İşletim sistemi ilgilenir bu konularla.

  • Kullanıldığında sistemi yavaşlatan şey... Değildir.

İşletim sisteminin en temel görevlerinden biri, kendini korumaktır. İşletim sistemi swap'e gitmesi gerektiyse, gitmiştir. Swap'in kullanılmış olması, her zaman kötüye işaret değildir.

  • Mutlaka kapatılması gereken şey... Değildir.

Bazı durumlarda kapatmak faydalı olabilir. Ancak bunu "her zaman" diyerek genellemek yanlıştır.

  • Yeterince RAM'i olan sistemlerde hiç ihtiyaç duyulmayan şey... Değildir.

Gigabyte'larca boş RAM'iniz de olsa, işletim sisteminiz swap alanını kullanmayı tercih edebilir.

Linux ate my RAM!

Boş RAM demişken, Linux'ta RAM kullanımı ile ilgili, yukarıdaki görseli aldığım Help! Linux ate my RAM! sayfasını incelemenizi öneririm.

Linux'ta Swap Nedir?

Bunu gerçek anlamıyla öğrenmek istiyorsanız, bu yazıyı okumayı bırakıp onun yerine Mel Gorman tarafından yazılmış Understanding the Linux Virtual Memory Manager isimli online kitabı okumanızı tavsiye ederim.1

Bir önceki bölümde paylaştığım "Linux ate my RAM!" sayfasında da açıklandığı gibi; Linux, boş RAM alanını disk ön belleği olarak kullanabiliyor. Bu da, verinin ihtiyaç hâlinde diskten okunmasını beklemek yerine önceden hazırlanmış blokların RAM'den hızlıca okunmasını sağlıyor.

Bunun tersi durum da mümkün. Yani RAM'deki verinin diske taşınması.

Linux, bir process tarafından kullanılan bazı RAM alanlarını boşaltmak isteyebilir. Ancak bunu yaparken, sıradan şekilde bir taşıma işlemi yapılamaz. Bunun yerine, depolama alanında özel olarak ayrılmış bir alan kullanılır. Bu da bizi swap alanına getirir.

Swap alanına ihtiyaç duyulmasının temelde iki sebebi vardır:

  1. Erişilmeyen, kullanılmayan, ihtiyaç duyulmayan sayfaların RAM'den swap'e taşınması ile; RAM'de daha fazla alan açılmış olur. Bu da sistemin daha fazla işlemi çalıştırabilmesine ve/veya çalışmakta olan işlemler için daha fazla RAM'i hazırda tutmasına olanak sağlar.

"Zaten yeterince RAM'im var. Sunucumun işlevi de belli. O zaman niye swap var?" diyebilirsiniz. Bu da bizi ikinci sebebe getirir:

  1. Process'in oluşturulması sırasında ihtiyaç duyulan pek çok sayfa, yalnızca initialization sürecinde kullanılmış ve bir daha asla ihtiyaç duyulmayacak verilerle dolu olabilir. İlgili process'in bu bellek sayfalarına asla ihtiyaç duymayacağını bile bile bunları RAM'de tutmak gereksizdir.

Swap Kullanımının Temel Problemleri

Eğer sisteminiz, gerçekten de yeterli RAM alanı olmadığı için ısrarla swap'e gidip geliyorsa; burada performans düşüşü kaçınılmazdır.

  1. Disk/SSD, RAM'e göre kat kat yavaştır. Hiçbir disk - en azından günümüz teknolojisinde ve mimarisinde - RAM'in yerini tutamaz. Swap, sisteminiz için ayakta kalmak için bir çare hâline dönüştüyse, daha fazla RAM'e ihtiyacınız var demektir.
  2. Swap alanını kolaylıkla arttırabilir ve RAM'e nefes alacak daha fazla alan açabilirsiniz. Ancak swap alanını boşaltmak durumunda kaldığınızda, işiniz o kadar kolay olmayacak. Çünkü swap'e alınan verilerin tamamının RAM'e geri yazılması fiziken mümkün olamayabilir. Tek başına bu süreç bile, bellek yönetimine ekstra yük oluşturabilir.

Swap Ne Sıklıkla Kullanılır?

/etc/sysctl.conf gibi, kernel'ın ayarlarına müdahale edebileceğiniz alanlar, pek çok kernel parametresini düzenlemenize olanak sağlar. Bunlardan biri de swappiness kontrolüdür.

vm_swappiness ifadesi ile belirleyebileceğiniz bu değer, 0-100 arası değer alır(dı). Bu değer güncel Linux sürümleri için 0-200 arasında.2 Düşük değerler, swap alanını mümkün mertebe kullanmamayı ifade ederken, yüksek değerler ise mümkün mertebe kullanmayı ifade eder.

Değeri yüksek tutarsanız, yani swap alanını sık kullanmayı tercih ederseniz, filesystem performansına katkıda bulunursunuz. Değeri düşürerek ise, latency'i azaltabilirsiniz. Ancak filesystem buffer'larından feragat etmiş olursunuz.3

Sisteminiz için ideal swappiness değerini bulmak için deneme-yanılma yöntemi kullanılabileceği gibi, sunulacak servisin dokümanlarını dikkate almak da önem arz etmektedir.

Örneğin Cloudera için, RHEL kernel 2.6.32-642.el6 ve üzerinde, bu değerin 1-10 arasında, mümkünse 1 olması öneriliyor.4

vm_swappiness Değerinin Yönetilmesi

Hâlihazırda kullanılan değeri görmek için aşağıdaki komutlar kullanılabilir:

root@gnuadmin:~# cat /proc/sys/vm/swappiness
60
root@gnuadmin:~# sysctl vm.swappiness
vm.swappiness = 60
root@gnuadmin:~# sysctl -a | grep -i swap
vm.swappiness = 60

Geçici süreliğine bu değeri değiştirmek için aşağıdaki komutlar kullanılabilir. Bu değişiklik, bir sonraki yeniden başlatmaya kadar geçerli olacaktır:

root@gnuadmin:~# sysctl vm.swappiness=100
vm.swappiness = 100
root@gnuadmin:~# sysctl vm.swappiness
vm.swappiness = 100
root@gnuadmin:~# echo 50 | sudo tee /proc/sys/vm/swappiness
50
root@gnuadmin:~# sysctl vm.swappiness
vm.swappiness = 50

Değişikliği kalıcı hâle getirmek için ise, /etc/sysctl.conf dosyasına veya /etc/sysctl.d/ altında bir dosyaya; vm.swappiness=10 gibi bir değer eklemek ve sysctl -p çalıştırmak yeterli olacaktır:

root@gnuadmin:~# echo "vm.swappiness=70" >> /etc/sysctl.conf
root@gnuadmin:~# sysctl -p
vm.swappiness = 70
root@gnuadmin:~# sysctl vm.swappiness
vm.swappiness = 70

Bağlantılar


  1. Understanding the Linux Virtual Memory Manager, https://www.kernel.org/doc/gorman/html/understand/ 

  2. Documentation for /proc/sys/vm/, https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html#vm-swappiness 

  3. RHEL 6 - 5.5. Tuning Virtual Memory, https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-tunables#s-memory-tunables 

  4. Setting the vm.swappiness Linux Kernel Parameter, https://docs.cloudera.com/cdp-private-cloud-base/7.1.9/managing-clusters/topics/cm-setting-vmswappiness-linux-kernel-parameter.html