Linux Swap Yönetimi

swap nedir?
Takas alanı, sabit disk üzerinde işletim sistemi tarafından ayrılmış bir bölümdür. İşlenecek veriler RAM'e sığmadığı zaman bu bölüm RAM gibi kullanılır ve böylece işlemlerin devam etmesi sağlanır. Sabit disklerin veri okuma/yazma hızları RAM'lerden çok daha düşük olduğu için takas alanının kullanılması işlemleri yavaşlatır.
Linux işletim sisteminde bu alan sabit disk üzerindeki bir bölümlendirilmelidir. Fakat Microsoft'a ait işletim sistemlerinde "pagefile" isminde bir dosya oluşturulur, RAM'e sığmayan veri buraya yazılır ve windows kurulumunda ayarlanan boyut ortalama RAM miktarının 1.5 katıdır ve daha sonradan değiştirilebilir. Bu oluşturulan alanı kullanıcı normal olarak göremez; ancak üçüncü parti yazılım üreticilerinin programları ile görmesi mümkündür.
Oysa Linux'ta bu alanı kullanıcı belirler, genelde RAM değerinin iki katı olarak ayrılır. "Pagefile" üzerinde hem Linux hem Windows olan bir bilgisayarda Linux kullanılarak görülebilir.
Swap Alanı Belirlenmesi
Takas bölümünün boyutu tartışmalı bir konudur. Linux'un ilk günlerinden kalma eski kural (“RAM miktarının iki katı”), sistemin nasıl kullanıldığına ve kurulu fiziksel RAM miktarına bağlı olarak artık geçerli olmayabilir.
Red Hat Enterprise Linux 7 belgelerinde Red Hat aşağıdakileri önerir:
| RAM miktarı | Önerilen Takas Boyutu | Hazırda Bekletme ile Önerilen Takas Boyutu |
|---|---|---|
|
2 GB RAM |
2x RAM miktarı |
RAM miktarının 3 katı |
|
2-8 GB RAM |
RAM miktarına eşit |
2x RAM miktarı |
|
8-64 GB RAM |
En az 4 GB |
1.5x RAM miktarı |
|
> 64 GB RAM |
En az 4 GB |
Tavsiye edilmez |
Elbette takas miktarı iş yüküne bağlı olabilir. Makine, veritabanı, web veya SAP sunucusu gibi kritik bir hizmeti çalıştırıyorsa, bir öneri için bu hizmetlerin belgelerini kontrol etmek akıllıca olacaktır.
swappines ayarlanması
Swap kullanımı ile alakalı önemli çekirdek parametresi ise vm.swappines'tir. Swap gerçekleştirilmeden önce boş olan RAM'in yüzdesini temsil eder. Bu değeri ne kadar yüksek tutarsak sunucumuzun swap'e düşme ihtimalini artacak iken, ne kadar düşük olursa swap'e düşme ihtimali o kadar düşük olur. 0-100 arasında belirlenebilen bu parametrenin işletim sistemi kurulduktan sonra varsayılan değeri 60'tır. Yani bunun anlamı ram kullanımı %40 olduğunda en az kullanılan dosyaları cachelemek için swap alanına atar. Swap alandan dosyalara erişmek performans kaybına yol açar.
Veritabanı iş yükleri için daha düşük swappines değeri önerilir. Örneğin, Oracle veritabanları için Red Hat, 10'luk bir swappines değeri önerir. Buna karşılık, MariaDB veritabanları için swappines değeri 1 olarak ayarlanması önerilir.
Artık biraz, swappines mantığını anladıysak aşağıdaki seçeneklere bakarak, bir değer belirleyelim.
- 0: takas devre dışı
- 1: tamamen devre dışı bırakmadan minimum takas miktarı
- 10: Bir sistemde yeterli bellek bulunduğunda performansı artırmak için önerilen değer
- 100: agresif takas
İlk olarak sistemimdeki varsayılan swap değerine bakıyorum. Varsayılan olarak 60 olarak geldiğini doğrulamış olduk.
sysctl vm.swappiness

Ben bu sunucuyu veritabanı olarak yapılandıracağım için, 0 olarak ayarlamaya karar verdim. Unutmayın bu işlem kalıcı olmayacaktır. Sistem yeniden başladıktan sonra varsayılan değere dönecektir.
sudo sysctl vm.swappiness=0

Swappiness değerini kalıcı olarak ayarlamak için '/etc/sysctl.d/99-swappiness.conf' dosyası oluşturup değerimi "0" olarak tanımlıyorum. Artık sistem yeniden başlasa bile kalıcı hale gelecektir.
sudo echo "vm.swappiness=0" | sudo tee -a /etc/sysctl.d/99-swappiness.conf

Ardından kullanacağım değeri tekrar tetikliyorum ve takas işlemini kapatmak (takas içeriğini RAM'e geri taşımak) ve ardından yeniden etkinleştirmek için son olarak aşağıdaki komutları çalıştıralım.
sudo sysctl vm.swappiness=0
sudo swapoff -a
sudo swapon -a

swap oluşturma
Sistem kurulumunda gelen swap’e genişletme yapamayacağımız için dosya oluşturarak ve yeni disk ekleyerek swap alanını arttırabiliriz. İlk olarak dosya üzerinden yapalım. Swap dosyasına baktığımda 3.9 GB olduğunu görüyorum. Ben buna ek olarak 8 GB daha ekleme kararı verdim.
cat /proc/swaps
free
du -h /swap.img

Kök dizinde 8GB boyutunda bir swap dosyası oluşturuyorum.
sudo dd if=/dev/zero of=/swap1.img bs=1M count=8124

Oluşturduğumuz dosyamızın sahipliğini, izinlerini ayarlıyorum ve takas alanı olarak kullanılacak dosyayı hazırlayıp aktif hale getiriyorum.
sudo chown root:root /swap1.img
sudo chmod 600 /swap1.img
sudo mkswap /swap1.img
sudo swapon /swap1.img

Artık takas alanımız oluşmuştur. Ancak sistem yeniden başlatıldığında swap aktif olmayacaktır. Kalıcı hale getirmek için, oluşturduğumuz swap alanını “/etc/fstab” dosyasına ekleyelim.
sudo vi /etc/fstab

dosyasını açıp "/swapfile" dosyamızı aşağıdaki gibi ekliyoruz.
/swap1.img swap swap defaults 0 0

swap alanımızı yeninden sorguladığımızda toplam 12 GB swap alanımızın olduğunu görüyoruz.
free -m

Bu kısımda önemli olan birden fazla swap dosyalarını free komutu ile göremeyiz. Hepsini görmek için aşağıdaki komutu kullanabiliriz.
swapon -s

Mevcut swapler'i açıp kapatmak için aşağıdakileri komutları kullanabilirsiniz. Sonrasında “/etc/fstab” dosyasından silmeyi veya yorum satırı eklemeyi unutmayınız.
Oluşturduğumuz swap dosyasını açmak için
sudo swapon /swap1.img
Oluşturduğumuz swap dosyasını kapatmak için
sudo swapoff /swap1.img