Sistem yöneticiliğinde en sık karşılaşılan sorunlardan biri, sunucunun fiziksel RAM’ini doldurması ve ardından ne yapacağını bilememesidir. İşte tam bu noktada swap alanı devreye girer. Swap, RAM dolduğunda işletim sisteminin disk üzerinde geçici bellek olarak kullandığı alandır. Doğru yapılandırılmış bir swap alanı, kritik bir anda sisteminizin çökmesini önleyebilir. Bu yazıda swap alanı oluşturmayı, yönetmeyi ve gerçek senaryolarda nasıl optimize edeceğinizi adım adım ele alacağız.
Swap Nedir ve Neden Gereklidir?
Swap alanı, Linux çekirdeğinin RAM’deki aktif kullanılmayan sayfaları diske taşıyarak fiziksel belleği boşaltmasına olanak tanır. Bu işleme swapping veya paging denir. Sistemde yeterli RAM olmasına rağmen swap kullanmak mantıklı olabilir; çünkü çekirdek uzun süredir kullanılmayan bellek sayfalarını swap’a taşıyarak aktif süreçler için daha fazla fiziksel RAM bırakabilir.
Swap alanının iki farklı biçimi vardır:
- Swap partition: Disk üzerinde ayrı bir bölüm olarak oluşturulur. Genellikle kurulum sırasında ayarlanır ve performans açısından biraz daha verimlidir.
- Swap dosyası: Mevcut bir dosya sistemi üzerinde oluşturulan sıradan bir dosyadır. Daha esnek olup ihtiyaca göre boyutlandırılabilir.
Modern sistemlerde swap dosyası yaklaşımı giderek daha popüler hale gelmiştir çünkü partition tablosunu değiştirmeden kolayca eklenip kaldırılabilir.
Mevcut Swap Durumunu Kontrol Etme
Herhangi bir şey yapmadan önce sistemdeki mevcut swap durumuna bakalım:
# Swap alanlarını listele
swapon --show
# Bellek ve swap kullanımını göster
free -h
# Daha ayrıntılı bilgi için
cat /proc/swaps
free -h komutunun çıktısı şu şekilde görünecektir:
total used free shared buff/cache available
Mem: 7.7G 2.1G 3.2G 245M 2.4G 5.1G
Swap: 2.0G 128M 1.9G
Eğer swap satırında sıfır değerler görüyorsanız, sistemde hiç swap yapılandırılmamış demektir. Bu özellikle minimal kurulumlar ve bulut sunucularında sık karşılaşılan bir durumdur.
Swap Dosyası Oluşturma
Adım 1: Dosyayı Oluşturma
Swap dosyası oluşturmanın en güvenilir yolu dd veya fallocate komutunu kullanmaktır. fallocate daha hızlıdır ancak bazı dosya sistemlerinde (örneğin btrfs) çalışmaz. dd ise her durumda güvenli çalışır:
# fallocate ile 4GB swap dosyası oluştur (ext4 için idealdir)
sudo fallocate -l 4G /swapfile
# Alternatif: dd ile oluştur (her dosya sistemi ile uyumlu)
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
Btrfs dosya sistemi kullanıyorsanız şu yöntemi tercih edin:
# Btrfs için swap dosyası oluşturma
sudo btrfs filesystem mkswapfile --size 4G /swapfile
Adım 2: İzinleri Ayarlama
Swap dosyası güvenlik açısından yalnızca root tarafından okunabilir olmalıdır:
# Dosya izinlerini ayarla
sudo chmod 600 /swapfile
# İzinleri doğrula
ls -lh /swapfile
# Çıktı şöyle olmalı: -rw------- 1 root root 4.0G ...
Adım 3: Swap Alanı Olarak Biçimlendirme
# Dosyayı swap olarak işaretle
sudo mkswap /swapfile
# Çıktı şuna benzer olacak:
# Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
# no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Adım 4: Swap’ı Etkinleştirme
# Swap'ı aktif hale getir
sudo swapon /swapfile
# Doğrulama
swapon --show
free -h
Adım 5: Kalıcı Hale Getirme
Şu ana kadar yaptığımız değişiklikler yeniden başlatmadan sonra kaybolacaktır. Kalıcı hale getirmek için /etc/fstab dosyasına eklememiz gerekir:
# Mevcut fstab içeriğini görüntüle
cat /etc/fstab
# Swap satırını fstab'a ekle
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# fstab'ı doğrula
sudo mount -a # Hata yoksa devam edebilirsiniz
Swap Partition Oluşturma
Yeni bir disk veya bölüm üzerinde swap partition oluşturmak için fdisk veya parted kullanabilirsiniz. Burada /dev/sdb diskini örnek alacağız:
# Mevcut disk yapısını gör
sudo fdisk -l /dev/sdb
# fdisk ile partition oluştur
sudo fdisk /dev/sdb
# n -> yeni partition
# p -> primary
# Partition numarası: 1
# İlk sektör: Enter (varsayılan)
# Son sektör: +4G (4GB için)
# t -> partition tipi değiştir
# 82 -> Linux swap tipi
# w -> kaydet ve çık
# Yeni partition'ı swap olarak biçimlendir
sudo mkswap /dev/sdb1
# Etkinleştir
sudo swapon /dev/sdb1
# UUID'yi öğren ve fstab'a ekle
sudo blkid /dev/sdb1
# Çıktıdaki UUID'yi kullanarak:
echo 'UUID=<your-uuid> none swap sw 0 0' | sudo tee -a /etc/fstab
Swappiness Değerini Ayarlama
Swappiness, çekirdeğin swap kullanma eğilimini belirleyen 0 ile 100 arasında bir değerdir. Düşük değer, swap kullanımını minimize ederken yüksek değer çekirdeği daha agresif swap kullanmaya iter.
- 0: Swap kullanımını mümkün olduğunca ertele
- 10: Masaüstü sistemler ve SSD’li sunucular için iyi bir denge noktasıdır
- 60: Varsayılan değer (birçok dağıtımda)
- 100: Her fırsatta swap kullan
Mevcut swappiness değerini kontrol edin:
# Mevcut swappiness değerini gör
cat /proc/sys/vm/swappiness
# Geçici olarak değiştir (yeniden başlatmadan sonra sıfırlanır)
sudo sysctl vm.swappiness=10
# Kalıcı olarak değiştir
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
Veritabanı sunucuları (MySQL, PostgreSQL) için swappiness değerini 1-10 arasında tutmak genellikle önerilir. Bu sunucularda swap kullanımı performansı ciddi şekilde düşürebilir.
VFS Cache Pressure Ayarı
Swappiness ile birlikte ayarlanması gereken bir diğer parametre vfs_cache_pressure‘dır. Bu değer, çekirdeğin dosya sistemi önbelleğini ne kadar agresif geri alacağını belirler:
# Mevcut değeri gör
cat /proc/sys/vm/vfs_cache_pressure
# Varsayılan 100, daha az agresif için 50 kullan
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
Swap Boyutunu Değiştirme
Swap Dosyasını Genişletme
Mevcut swap dosyasını yeterli bulmuyorsanız, onu kaldırıp daha büyük bir dosya oluşturabilirsiniz:
# Swap'ı devre dışı bırak
sudo swapoff /swapfile
# Yeni boyutta dosya oluştur (8GB)
sudo fallocate -l 8G /swapfile
# Swap olarak işaretle
sudo mkswap /swapfile
# Tekrar etkinleştir
sudo swapon /swapfile
# Doğrula
free -h
İkinci Bir Swap Alanı Ekleme
Acil durumlar için mevcut swap’ı kapatmadan ikinci bir swap alanı ekleyebilirsiniz:
# İkinci swap dosyası oluştur
sudo fallocate -l 2G /swapfile2
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon /swapfile2
# Her iki swap alanını gör
swapon --show
# fstab'a da ekle
echo '/swapfile2 none swap sw 0 0' | sudo tee -a /etc/fstab
Swap Kullanımını İzleme
Swap kullanımını gerçek zamanlı izlemek için birkaç kullanışlı yöntem vardır:
# vmstat ile anlık durum ve swap etkinliği
vmstat 1 5
# si: Saniyede diskten RAM'e alınan swap sayfası (swap in)
# so: Saniyede RAM'den diske yazılan swap sayfası (swap out)
# Hangi süreçler swap kullanıyor?
for file in /proc/*/status; do
awk '/VmSwap|Name/{printf $2 " " $3 "n"}' $file
done | sort -k 2 -n -r | head -20
# Daha okunabilir versiyon
sudo smem -rs swap | head -20
# top ile izleme (Shift+W ile yapılandırmayı kaydedebilirsiniz)
top
Gerçek Dünya Senaryoları
Senaryo 1: Geceleri Çöken Web Sunucusu
Bir web sunucusunda gece 3’te uygulamanın çöktüğüne dair alarmlar alıyorsunuz. Sabah bakıyorsunuz, OOM Killer (Out of Memory Killer) uygulamanızı durdurmuş:
# OOM Killer aktivitesini kontrol et
dmesg | grep -i "out of memory"
dmesg | grep -i "oom"
# Sistem loglarında ara
sudo journalctl -k | grep -i oom
# Eğer swap yoksa hemen ekle ve swappiness'i ayarla
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo sysctl vm.swappiness=10
Bu durum genellikle trafik artışlarında veya memory leak yaşayan uygulamalarda ortaya çıkar. Swap, uygulamayı kurtarmaz ama size sorunun kökenini araştırmak için zaman tanır.
Senaryo 2: VPS’de Swap Optimizasyonu
Dijital Ocean, Linode gibi platformlardaki küçük VPS’lerde (1-2GB RAM) swap hayat kurtarır. Ancak disk I/O maliyeti yüksek olduğundan optimize etmek gerekir:
# 1. Swap oluştur (RAM'in 2 katı kadar)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 2. Swappiness'i düşür - SSD üzerinde bile swap maliyetlidir
sudo sysctl vm.swappiness=5
# 3. VFS cache pressure ayarla
sudo sysctl vm.vfs_cache_pressure=50
# 4. Kalıcı hale getir
cat << EOF | sudo tee /etc/sysctl.d/99-vps-tuning.conf
vm.swappiness=5
vm.vfs_cache_pressure=50
EOF
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Senaryo 3: Veritabanı Sunucusunda Swap Yönetimi
Bir PostgreSQL sunucusunda swap kullanımı arttıkça sorgu süreleri dramatik biçimde uzuyor:
# Hangi PostgreSQL süreçleri swap kullanıyor?
for pid in $(pgrep postgres); do
swap=$(cat /proc/$pid/status 2>/dev/null | awk '/VmSwap/{print $2}')
if [ "$swap" -gt 0 ] 2>/dev/null; then
echo "PID $pid: ${swap}KB swap kullanıyor"
fi
done
# PostgreSQL için swappiness değerini minimize et
echo 1 | sudo tee /proc/sys/vm/swappiness
# Kalıcı hale getir
echo 'vm.swappiness=1' | sudo tee /etc/sysctl.d/99-postgresql.conf
sudo sysctl -p /etc/sysctl.d/99-postgresql.conf
Veritabanı sunucularında mümkünse yeterli RAM sağlamak swap bağımlılığını ortadan kaldırır. Swap burada bir güvenlik ağı olarak tutulmalı, aktif kullanım için değil.
Swap’ı Devre Dışı Bırakma ve Kaldırma
Swap alanını artık kullanmak istemiyorsanız veya yapılandırmanızı sıfırlamak istiyorsanız:
# Tüm swap alanlarını devre dışı bırak
sudo swapoff -a
# Sadece belirli bir swap alanını devre dışı bırak
sudo swapoff /swapfile
# fstab'dan swap satırını kaldır (el ile düzenlemeniz gerekir)
sudo nano /etc/fstab
# /swapfile ile başlayan satırı silin
# Swap dosyasını sil
sudo rm /swapfile
# Doğrula
free -h
swapon --show
Swap Önceliği (Priority) Ayarlama
Birden fazla swap alanınız varsa hangisinin önce kullanılacağını belirleyebilirsiniz. Yüksek öncelikli swap alanı önce doldurulur:
# Belirli öncelikle swap etkinleştir (-p ile priority)
sudo swapon -p 10 /swapfile # Düşük öncelik
sudo swapon -p 100 /dev/sdb1 # Yüksek öncelik (SSD partition varsa bunu öne al)
# fstab'da öncelik belirtme
# /dev/sdb1 none swap sw,pri=100 0 0
# /swapfile none swap sw,pri=10 0 0
# Mevcut öncelikleri gör
swapon --show
SSD ve HDD birlikte kullandığınız sistemlerde swap partition’ını SSD’ye koyup yüksek öncelik verin. HDD swap dosyasını düşük öncelikli tutun. Bu şekilde performanslı swap kullanımı elde edersiniz.
Zram ile Bellek İçi Sıkıştırma
Modern sistemlerde geleneksel swap yerine veya ona ek olarak zram kullanmak mümkündür. Zram, RAM’in bir bölümünü sıkıştırarak sanal swap olarak kullanır ve disk I/O gerektirmez:
# zram modülünü yükle
sudo modprobe zram
# zram aygıtını yapılandır (2GB sıkıştırılmış alan)
echo lz4 | sudo tee /sys/block/zram0/comp_algorithm
echo 2G | sudo tee /sys/block/zram0/disksize
# Swap olarak etkinleştir
sudo mkswap /dev/zram0
sudo swapon -p 100 /dev/zram0 # Yüksek öncelik ver
# Durum kontrolü
swapon --show
cat /sys/block/zram0/mm_stat
Ubuntu 20.04 ve üzerinde zram-config paketi bu işlemi otomatikleştirir:
sudo apt install zram-config
# Servis otomatik başlar ve yapılandırılır
Swap ile İlgili Önemli Notlar
Pratikte swap yönetirken bazı kritik noktaları göz önünde bulundurmak gerekir:
- Swap, yetersiz RAM’in kalıcı çözümü değildir: Eğer sisteminiz sürekli swap kullanıyorsa RAM yükseltmesi düşünün. Swap bir güvenlik ağıdır, performans aracı değil.
- SSD’lere dikkat edin: Swap SSD üzerindeyse aşırı yazma operasyonları SSD ömrünü kısaltabilir. Swappiness değerini düşük tutun.
- Hibernation için swap boyutu: Sisteminizi hazırda bekletme (hibernate) özelliği için kullanacaksanız swap alanı en az RAM boyutu kadar olmalıdır.
- Şifreli swap: Hassas veriler RAM’den swap’a taşındığında disk üzerinde şifresiz kalabilir. Güvenlik gerektiren sistemlerde şifreli swap kullanın (
cryptsetupveyaecryptfsile yapılandırılabilir).
- Bulut sunucularında swap: AWS, GCP gibi platformlarda varsayılan instance’larda genellikle swap yoktur. Ephemeral diskler varsa bunları swap için değerlendirebilirsiniz.
Sonuç
Swap alanı, Linux sistem yönetiminin temel taşlarından biridir. Doğru boyutlandırılmış ve iyi yapılandırılmış bir swap, sistemin beklenmedik bellek yüklerinde ayakta kalmasını sağlar. Swappiness ve vfs_cache_pressure gibi çekirdek parametrelerini iş yüküne göre optimize etmek, swap’ın sisteme yük getirmeden güvenlik ağı görevini yerine getirmesini sağlar.
Sunucu tipine göre özetleyecek olursak: Web ve uygulama sunucularında swappiness 10 civarında tutun, veritabanı sunucularında 1-5 arasında kalın, geliştirme ortamlarında varsayılan değerler genellikle yeterlidir. Swap kullanımını düzenli olarak izleyin ve eğer sürekli yüksek swap aktivitesi görüyorsanız bu bir uyarı işaretidir; uygulamanızı veya sunucu kapasitesini gözden geçirin.
En iyi swap stratejisi, swap’a hiç ihtiyaç duymamaktır. Ama gerçek dünyada bu her zaman mümkün olmaz ve o anlarda doğru yapılandırılmış bir swap alanı sizi kurtarır.