tmpfs ile RAM’i Geçici Depolama Olarak Kullanma

RAM’in boş bırakılması, Linux dünyasında neredeyse günah sayılır. Sistem yöneticileri olarak biz de bu felsefeyi benimseyip RAM’i her fırsatta verimli kullanmaya çalışırız. İşte tmpfs tam da bu noktada devreye giriyor: disk I/O’sunu tamamen devre dışı bırakıp geçici verilerinizi doğrudan RAM’de tutmanızı sağlayan, kernel tarafından desteklenen bir dosya sistemi. Bu yazıda tmpfs’i derinlemesine inceleyeceğiz, gerçek dünya senaryolarıyla nasıl kullanabileceğinizi göstereceğiz ve dikkat etmeniz gereken noktalara değineceğiz.

tmpfs Nedir ve Nasıl Çalışır?

tmpfs, Linux kernel’inin içinde yerleşik olarak gelen sanal bir dosya sistemidir. Veriler RAM’de tutulur ve sistem yeniden başlatıldığında tüm içerik silinir. Ama işin ilginç tarafı şu: tmpfs sadece RAM kullanmaz, gerektiğinde swap alanını da devreye sokar. Yani “tamamen RAM’de” demek teknik olarak biraz yanıltıcı, kernel yük altında bazı sayfaları swap’a taşıyabilir.

Klasik ramdisk yaklaşımından farkı ise çok önemli. Ramdisk, kullanmasanız bile belirlediğiniz boyutu RAM’den ayırır. tmpfs ise dinamik çalışır: içine 100 MB veri koyduğunuzda 100 MB RAM kullanır, 500 MB boyut limiti koymuş olsanız bile boş alanı israf etmez.

Sisteminizde zaten birkaç tmpfs mount noktası çalışıyor olabilir:

df -h -t tmpfs

Çıktıda şöyle şeyler göreceksiniz:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           7.8G  2.1M  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           7.8G   68K  7.8G   1% /run/user/1000

/dev/shm zaten POSIX paylaşımlı bellek için kullanılan bir tmpfs alanıdır. Birçok uygulama bunu farkında olmadan kullanır.

Temel Mount Parametreleri

tmpfs’i mount ederken birkaç önemli parametre var:

size: Maksimum boyut. 1G, 512M, 2048k gibi değerler alır. Belirtmezseniz RAM’in yarısı varsayılan olur.

nr_inodes: Maksimum inode sayısı. Dosya sayısını sınırlamak için kullanılır.

nr_blocks: Boyut yerine blok sayısıyla sınırlama yapar.

mode: Mount noktasının izinleri. Örneğin 1777 sticky bit ile herkese açık ama sadece kendi dosyasını silen bir yapı kurar.

uid ve gid: Sahiplik ayarları. Belirli bir kullanıcı veya gruba özel tmpfs için kullanışlıdır.

noexec: Bu alan üzerinden çalıştırılabilir dosyaların çalıştırılmasını engeller. Güvenlik açısından önemli.

nosuid: SUID bitinin etkisini kaldırır.

nodev: Aygıt dosyalarının kullanılmasını engeller.

İlk tmpfs Mount İşlemi

Hemen elimizi kirletelim. Geçici bir çalışma alanı oluşturalım:

sudo mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=512M,mode=1777 tmpfs /mnt/ramdisk

Mount oldu mu kontrol edelim:

mount | grep tmpfs
df -h /mnt/ramdisk

Bu kadar basit. Artık /mnt/ramdisk altında yaptığınız her şey RAM’de yaşar. Sistemi yeniden başlattığınızda hepsi gider.

Geçici test için bile olsa unmount etmek isterseniz:

sudo umount /mnt/ramdisk

fstab ile Kalıcı Hale Getirme

Sistemi her yeniden başlattığınızda elle mount yapmak istemezsiniz. /etc/fstab‘a ekleyelim:

sudo nano /etc/fstab

Şu satırı ekleyin:

tmpfs   /mnt/ramdisk   tmpfs   defaults,size=1G,mode=1777,noexec,nosuid,nodev   0   0

Test etmek için:

sudo mount -a
df -h /mnt/ramdisk

Hata yoksa, bir dahaki boot’ta otomatik mount edilecek.

Gerçek Dünya Senaryosu 1: Derleme Süreçlerini Hızlandırma

Büyük bir C++ veya Rust projesi derliyorsunuz ve her seferinde dakikalar bekliyorsunuz. Derleme geçici dosyaları (object dosyaları, intermediate artifacts) disk üzerinde oluşturuluyor. Bunu tmpfs’e taşıdığınızda çarpıcı farklar görürsünüz.

Örnek: Linux kernel derlemek için:

# Önce tmpfs alanını hazırla
sudo mkdir -p /tmp/kernel-build
sudo mount -t tmpfs -o size=8G tmpfs /tmp/kernel-build

# Kernel kaynak kodunu indir ve çıkart
cd /tmp/kernel-build
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
tar -xf linux-6.6.tar.xz
cd linux-6.6

# Derlemeyi yap - tüm geçici çıktılar RAM'de
make defconfig
make -j$(nproc) O=/tmp/kernel-build/output

O= parametresiyle tüm build çıktısını tmpfs’e yönlendiriyoruz. Gerçek kaynak dosyalar diskte kalıyor, sadece derleme artefaktları RAM’de oluşuyor. Disk I/O’yu neredeyse sıfıra indiriyoruz.

Aynı yaklaşım Rust projeleri için de geçerli:

# Cargo target dizinini tmpfs'e taşı
sudo mount -t tmpfs -o size=4G tmpfs /home/user/project/target
cd /home/user/project
cargo build --release

Gerçek Dünya Senaryosu 2: Web Sunucusu Log Optimizasyonu

Yoğun trafik alan bir web sunucusunda Nginx veya Apache logları saniyede binlerce satır yazıyor. Bu disk I/O’su hem performansı düşürür hem de SSD’lerin ömrünü kısaltır.

Çözüm: Access logları (hata logları değil, onlar diskte kalmalı) tmpfs’e almak.

# Log için tmpfs oluştur
sudo mkdir -p /var/log/nginx-ram
sudo mount -t tmpfs -o size=256M,noexec,nosuid,nodev tmpfs /var/log/nginx-ram
sudo chown www-data:www-data /var/log/nginx-ram

# Nginx konfigürasyonunu güncelle
sudo nano /etc/nginx/nginx.conf

Nginx konfigürasyonunda:

access_log /var/log/nginx-ram/access.log main buffer=64k flush=5m;
error_log /var/log/var/nginx/error.log warn;

Burada buffer=64k ve flush=5m parametreleri çok önemli. Nginx her satırda yazmak yerine 64KB dolduğunda veya 5 dakika geçtiğinde yazacak. Ama bu loglar kritikse, düzenli aralıklarla diske yedeklemek şart:

# Cron ile her 15 dakikada bir diske yedekle
cat > /etc/cron.d/nginx-log-sync << 'EOF'
*/15 * * * * www-data rsync -a /var/log/nginx-ram/ /var/log/nginx/archive/
EOF

Gerçek Dünya Senaryosu 3: Veritabanı Geçici Tablolar

PostgreSQL ve MySQL/MariaDB, karmaşık sorgularda geçici tablolar oluşturur. Bunları tmpfs’e almak sorgu performansını ciddi ölçüde artırır.

PostgreSQL için:

# PostgreSQL geçici dizini için tmpfs
sudo mkdir -p /var/lib/postgresql/tmp
sudo mount -t tmpfs -o size=2G,uid=postgres,gid=postgres,mode=0700 tmpfs /var/lib/postgresql/tmp

PostgreSQL konfigürasyonunda (postgresql.conf):

temp_tablespaces = 'fast_tmp'

Tablespace oluşturmak için:

CREATE TABLESPACE fast_tmp LOCATION '/var/lib/postgresql/tmp';

MySQL için my.cnf:

[mysqld]
tmpdir = /var/lib/mysql-tmp

Ve mount:

sudo mkdir -p /var/lib/mysql-tmp
sudo mount -t tmpfs -o size=1G,uid=mysql,gid=mysql,mode=0700 tmpfs /var/lib/mysql-tmp

Dikkat: Sadece geçici tablolar ve sort buffer gibi operasyonlar için kullanın. Ana veritabanı dosyalarını asla tmpfs’e taşımayın, sistem yeniden başlarsa her şeyi kaybedersiniz.

Gerçek Dünya Senaryosu 4: CI/CD Pipeline Hızlandırma

Jenkins, GitLab Runner veya benzeri CI/CD araçlarını çalıştırıyorsanız, her build için workspace temizlenip yeniden oluşturuluyor. Bu süreç disk I/O’suna çok bağlı.

# CI workspace için tmpfs
sudo mkdir -p /opt/ci-workspace
sudo mount -t tmpfs -o size=10G,noexec=off tmpfs /opt/ci-workspace
# Not: noexec=off, çünkü burada binary derleme ve çalıştırma gerekiyor

# Jenkins için workspace ayarı
sudo chown -R jenkins:jenkins /opt/ci-workspace

Jenkins konfigürasyonunda workspace dizinini /opt/ci-workspace olarak ayarlayın. Her build çok daha hızlı çalışacak, özellikle dependency indirme ve dosya kopyalama adımları.

tmpfs Boyutunu Dinamik Olarak Değiştirme

tmpfs’in güzel özelliklerinden biri, unmount etmeden boyutunu değiştirebilmeniz:

# Mevcut boyutu gör
df -h /mnt/ramdisk

# Boyutu 1GB'a çıkar (unmount gerekmez)
sudo mount -o remount,size=1G /mnt/ramdisk

# Tekrar kontrol et
df -h /mnt/ramdisk

Bu özellik özellikle derleme süreçlerinde çok işe yarıyor. “Az biraz daha lazım” dediğinizde her şeyi kaybetmeden genişletebiliyorsunuz.

Güvenlik Konuları

tmpfs kullanırken güvenliği ihmal etmek tehlikeli olabilir. Birkaç kritik nokta:

noexec kullanımı: Mümkün olduğunca tmpfs alanlarına noexec koyun. Kullanıcıların bu alana zararlı script yükleyip çalıştırmasını engeller.

nosuid ve nodev: Neredeyse her zaman bu iki seçeneği de ekleyin. SUID binary’ler ve aygıt dosyaları çoğu durumda tmpfs’te işinize yaramaz.

# Güvenli mount örneği
sudo mount -t tmpfs -o size=512M,mode=1777,noexec,nosuid,nodev tmpfs /mnt/secure-tmp

Boyut limiti: Boyut limiti koymazsanız kullanıcılar RAM’i doldurabilir. Her zaman makul bir limit belirleyin.

Şifreleme: Hassas veriler için tmpfs ideal olsa da, swap devreye girdiğinde veriler diskte şifresiz kalabilir. Swap şifreleme kullanmıyorsanız dikkatli olun. /etc/crypttab ile swap şifrelemeyi aktif edebilirsiniz.

Kullanımı İzleme ve Alarm Sistemi

tmpfs dolduğunda yazan işlem hata alır ve ciddi sorunlar çıkabilir. İzleme şart:

# Basit kullanım kontrolü
df -h -t tmpfs

# Yüzde olarak - alarm için
df -t tmpfs --output=pcent,target | tail -n +2

Basit bir monitoring scripti yazalım:

cat > /usr/local/bin/check-tmpfs.sh << 'SCRIPT'
#!/bin/bash

THRESHOLD=85
ALERT_EMAIL="[email protected]"

while IFS= read -r line; do
    USAGE=$(echo "$line" | awk '{print $1}' | tr -d '%')
    MOUNT=$(echo "$line" | awk '{print $2}')
    
    if [ "$USAGE" -gt "$THRESHOLD" ]; then
        echo "UYARI: $MOUNT tmpfs kullanimi %$USAGE seviyesinde!" | 
            mail -s "tmpfs Doluluk Alarmı: $MOUNT" "$ALERT_EMAIL"
        logger "tmpfs alarm: $MOUNT at $USAGE%"
    fi
done < <(df -t tmpfs --output=pcent,target | tail -n +2)
SCRIPT

chmod +x /usr/local/bin/check-tmpfs.sh

# Cron'a ekle - her 5 dakikada kontrol
echo "*/5 * * * * root /usr/local/bin/check-tmpfs.sh" > /etc/cron.d/tmpfs-monitor

Sistem Yeniden Başlatmada İçerik Kaybı Yönetimi

tmpfs’teki veriler sistem kapanınca gider. Ama bazı durumlarda bu verileri yeniden oluşturmanız gerekir. systemd servisleriyle bunu otomatize edebilirsiniz:

cat > /etc/systemd/system/setup-ramdisk.service << 'EOF'
[Unit]
Description=RAM Disk Kurulum ve Hazırlık
After=local-fs.target
Before=nginx.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/setup-ramdisk.sh
ExecStop=/usr/local/bin/cleanup-ramdisk.sh

[Install]
WantedBy=multi-user.target
EOF

Ve çalıştırılacak script:

cat > /usr/local/bin/setup-ramdisk.sh << 'SCRIPT'
#!/bin/bash

RAMDISK="/mnt/ramdisk"

# Dizin yapısını oluştur
mkdir -p "$RAMDISK"/{cache,tmp,sessions}

# Gerekli izinleri ayarla
chown -R www-data:www-data "$RAMDISK/cache"
chown -R www-data:www-data "$RAMDISK/sessions"
chmod 1777 "$RAMDISK/tmp"

# Varsa yedekten geri yükle
if [ -d "/var/backup/ramdisk-snapshot" ]; then
    rsync -a /var/backup/ramdisk-snapshot/ "$RAMDISK/"
    echo "Yedekten geri yüklendi."
fi

echo "RAM disk hazır: $RAMDISK"
SCRIPT

chmod +x /usr/local/bin/setup-ramdisk.sh
sudo systemctl enable setup-ramdisk.service
sudo systemctl start setup-ramdisk.service

tmpfs ile /tmp Optimizasyonu

Birçok modern Linux dağıtımında /tmp zaten tmpfs olarak yapılandırılabilir. Ubuntu ve Fedora’da bunu aktif etmek için:

# Ubuntu/Debian
sudo systemctl enable tmp.mount
sudo systemctl start tmp.mount

# Durumu kontrol et
systemctl status tmp.mount
df -h /tmp

Eğer /tmp boyutunu özelleştirmek istiyorsanız:

sudo cp /usr/share/systemd/tmp.mount /etc/systemd/system/tmp.mount
sudo nano /etc/systemd/system/tmp.mount

[Mount] bölümüne ekleyin:

[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,nosuid,nodev,size=2G

Performans Karşılaştırması

Gerçek dünyadan rakamlar vermek gerekirse, aynı işlemi disk ve tmpfs üzerinde test eden basit bir yöntem:

# Disk üzerinde yazma hızı testi
time dd if=/dev/zero of=/tmp/disktest bs=1M count=1024 conv=fdatasync
rm /tmp/disktest

# tmpfs üzerinde yazma hızı testi (zaten /tmp tmpfs ise)
mount | grep "on /tmp"
time dd if=/dev/zero of=/tmp/ramtest bs=1M count=1024
rm /tmp/ramtest

# Okuma hızı - önce cache temizle
sudo sync && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
time dd if=/tmp/ramtest of=/dev/null bs=1M

Tipik sonuçlar: SATA SSD üzerinde 400-500 MB/s yazma, tmpfs üzerinde 8-15 GB/s yazma hızı görürsünüz. NVMe SSD ile fark biraz kapanır ama yine de tmpfs birkaç kat hızlı çalışır.

Sık Karşılaşılan Hatalar

“No space left on device” hatası: tmpfs sınırına ulaştınız. Boyutu artırın veya içeriği temizleyin.

# Ne kadar dolduğunu gör
du -sh /mnt/ramdisk/*
# Boyutu artır
sudo mount -o remount,size=2G /mnt/ramdisk

Sistem reboot sonrası mount noktasının boş olması: fstab’ı doğru yazdınız ama servisler veri bekliyor. systemd servisiyle başlangıç scriptini düzgün yapılandırın.

swap kullanımının artması: Çok fazla tmpfs alanı açtınız ve kernel swap’a itiyor. RAM kullanımınızı izleyin, gereksiz tmpfs alanlarını kapatın.

# Swap kullanımını gör
swapon --show
free -h

Sonuç

tmpfs, doğru kullanıldığında sistem yöneticisinin elindeki en güçlü performans araçlarından biri. Özellikle derleme süreçleri, web sunucu cache’leri, veritabanı geçici alanları ve CI/CD pipeline’ları için muhteşem sonuçlar veriyor.

Ama bazı temel kuralları asla unutmayın: boyut limiti koyun, güvenlik bayraklarını (noexec, nosuid, nodev) ihmal etmeyin, kritik verileri tmpfs’e taşımayın ve mutlaka bir izleme sistemi kurun. tmpfs dolduğunda sessiz sedasız hata verip uygulamanızı çökertebilir.

Başlangıç için /tmp‘yi tmpfs yapmak ve derleme ortamınızı optimize etmek iyi bir ilk adım. Zamanla hangi iş yüklerinizin disk I/O’suna bağlı olduğunu profiling araçlarıyla tespit edip (iotop, iostat, blktrace) tmpfs ile hızlandırabilirsiniz. RAM’i boş bırakmak gerçekten israftır, en azından geçici veriler için dolu tutun.

Yorum yapın