Yıllarca gzip ve bzip2 kullandıktan sonra bir gün production sunucuda 50GB’lık bir log arşivi oluştururken saatlerce beklemek zorunda kaldım. O gün hayatıma lz4 ve zstd girdi. Eğer siz de sıkıştırma işlemlerinde hız ile oran arasında sürekli bir denge arayışındaysanız, bu iki araç tam olarak aradığınız şey olabilir. Modern sistemlerin ihtiyaçlarına yönelik tasarlanmış bu araçlar, özellikle büyük dosyalar ve yüksek I/O gerektiren senaryolarda geleneksel alternatiflerin önüne geçiyor.
lz4 Nedir ve Neden Bu Kadar Hızlı?
lz4, Yann Collet tarafından geliştirilen ve hız odaklı bir sıkıştırma algoritmasıdır. Temel tasarım felsefesi şudur: sıkıştırma oranını biraz feda et, ama karşılığında inanılmaz hız kazan. Özellikle RAM’e sığmayan büyük veri setlerini işlerken veya gerçek zamanlı sıkıştırma gerektiren durumlarda lz4 rakipsizdir.
lz4’ün öne çıkan özellikleri:
- Sıkıştırma hızı: Tipik donanımda saniyede 500 MB ile 700 MB arasında
- Açma hızı: Saniyede 2 GB ile 3 GB arasında, bu neredeyse RAM bant genişliğiyle yarışır
- Düşük bellek kullanımı: Hem sıkıştırma hem açma sırasında minimal RAM tüketir
- Çok iş parçacıklı destek:
lz4komutu tek thread kullanır amaplz4ile paralel işlem yapılabilir
lz4 Kurulumu
Çoğu modern Linux dağıtımında lz4 ya kurulu gelir ya da paket deposunda hazır bekler.
# Debian/Ubuntu
sudo apt install lz4
# RHEL/CentOS/Rocky Linux
sudo dnf install lz4
# Arch Linux
sudo pacman -S lz4
# Kurulumu doğrula
lz4 --version
Temel lz4 Kullanımı
# Tek dosya sıkıştırma
lz4 dosya.log dosya.log.lz4
# Sıkıştırılmış dosyayı açma
lz4 -d dosya.log.lz4 dosya.log
# Orijinal dosyayı koruyarak sıkıştır (varsayılan orijinali siler)
lz4 --keep dosya.log
# Çıktıyı stdout'a yönlendir
lz4 -c dosya.log > dosya.log.lz4
# Mevcut dosyanın üzerine yaz
lz4 -f dosya.log dosya.log.lz4
# Sıkıştırma istatistiklerini göster
lz4 -v dosya.log dosya.log.lz4
Önemli parametreler:
- -d: Dosyayı açar (decompress)
- -k veya –keep: Orijinal dosyayı silmez
- -f: Hedef dosyanın üzerine zorla yazar
- -c: Çıktıyı standart çıkışa yazar
- -v: Ayrıntılı çıktı (verbose)
- -1: En hızlı sıkıştırma seviyesi (varsayılan)
- -9: En yüksek sıkıştırma oranı (daha yavaş ama hâlâ çok hızlı)
- –rm: İşlem başarılı olursa kaynak dosyayı sil
lz4 ile tar Kombinasyonu
tar komutunun lz4 desteği doğrudan yoktur ama pipe ile kolayca entegre edilebilir:
# Dizini lz4 ile sıkıştırılmış arşive al
tar -cf - /var/log/nginx | lz4 > nginx_logs.tar.lz4
# Arşivi aç
lz4 -d nginx_logs.tar.lz4 | tar -xf -
# Daha kısa yazım
tar -I lz4 -cf arsiv.tar.lz4 /hedef/dizin
# lz4 ile tar arşivi açma
tar -I lz4 -xf arsiv.tar.lz4
zstd: Hız ile Oranı Dengeleyen Modern Çözüm
zstd (Zstandard), Facebook tarafından 2016’da açık kaynak olarak yayınlandı. Yine Yann Collet imzasını taşıyan bu algoritma, lz4 ile gzip arasındaki boşluğu doldurmak için tasarlandı. Hem hız hem de oran açısından olağanüstü bir denge sunar ve bugün Linux çekirdeği dahil pek çok kritik projede varsayılan sıkıştırma formatı olarak benimsenmiştir.
zstd’nin öne çıkan özellikleri:
- Geniş sıkıştırma seviyesi aralığı: -1’den 22’ye kadar
- Çok iş parçacıklı sıkıştırma:
--threadsparametresi ile paralel işlem - Sözlük desteği: Küçük benzer dosyalar için muhteşem oranlar sağlar
- Akış modu: Gerçek zamanlı veri akışlarını işleyebilir
- Geniş platform desteği: Kernel, Docker, Arch Linux paketleri ve daha fazlası zstd kullanır
zstd Kurulumu
# Debian/Ubuntu
sudo apt install zstd
# RHEL/CentOS/Rocky Linux
sudo dnf install zstd
# Arch Linux
sudo pacman -S zstd
# Sürümü kontrol et
zstd --version
Temel zstd Kullanımı
# Dosya sıkıştırma (varsayılan seviye 3)
zstd dosya.log
# Belirli sıkıştırma seviyesi ile
zstd -5 dosya.log
# En yüksek sıkıştırma oranı
zstd -19 dosya.log
# Ultra mod (22. seviye, çok yavaş ama maksimum oran)
zstd --ultra -22 dosya.log
# Çok iş parçacıklı sıkıştırma
zstd -T4 dosya.log # 4 thread
zstd -T0 dosya.log # tüm CPU çekirdeklerini kullan
# Dosya açma
zstd -d dosya.log.zst
# Orijinal dosyayı koru
zstd --keep dosya.log
# İlerleme bilgisi göster
zstd --progress dosya.log
Önemli parametreler:
- -d: Dosyayı açar
- -k veya –keep: Orijinal dosyayı korur
- -T[N]: N thread kullan, 0 ise tüm çekirdekler
- -[1-19]: Sıkıştırma seviyesi, varsayılan 3
- –ultra -22: Maksimum sıkıştırma
- –fast[N]: Negatif seviyeler, son derece hızlı ama düşük oran
- -r: Dizin içindeki tüm dosyaları özyinelemeli işle
- –rm: Başarılı işlem sonrası kaynak dosyayı sil
- -c: Stdout’a yaz
- -v: Ayrıntılı çıktı
zstd ile tar Kombinasyonu
Modern tar sürümleri zstd’yi doğrudan destekler:
# zstd ile tar arşivi oluştur
tar --zstd -cf arsiv.tar.zst /hedef/dizin
# Kısa yazım (GNU tar 1.31+)
tar -acf arsiv.tar.zst /hedef/dizin
# Çok iş parçacıklı zstd ile tar
tar -cf - /hedef/dizin | zstd -T0 -o arsiv.tar.zst
# Arşivi aç
tar --zstd -xf arsiv.tar.zst
# Arşiv içeriğini listele
tar --zstd -tf arsiv.tar.zst
Gerçek Dünya Senaryoları
Senaryo 1: Log Rotasyon Sistemi
Production sunucularda log dosyaları hızla birikiyor. Geleneksel logrotate konfigürasyonunda gzip kullanılır ama yüksek hacimli sistemlerde bu ciddi CPU yükü oluşturabilir.
#!/bin/bash
# /usr/local/bin/fast_log_rotate.sh
# Nginx log dosyalarını lz4 ile hızlıca arşivle
LOG_DIR="/var/log/nginx"
ARCHIVE_DIR="/data/log_archives"
DATE=$(date +%Y%m%d)
mkdir -p "$ARCHIVE_DIR"
# Dünün loglarını bul ve lz4 ile sıkıştır
find "$LOG_DIR" -name "*.log.1" -type f | while read logfile; do
basename=$(basename "$logfile" .1)
lz4 --keep "$logfile" "$ARCHIVE_DIR/${basename}_${DATE}.lz4"
if [ $? -eq 0 ]; then
echo "Arşivlendi: $logfile -> $ARCHIVE_DIR/${basename}_${DATE}.lz4"
rm "$logfile"
fi
done
Bu script ile gzip kullanan geleneksel yaklaşıma kıyasla log rotasyon süresi büyük sistemlerde 5 kat ile 8 kat arasında kısalır.
Senaryo 2: Veritabanı Yedekleme
PostgreSQL veya MySQL dump işlemlerinde sıkıştırma ciddi yer tasarrufu sağlar. Ama büyük veritabanlarında gzip ile saatlerce beklemek yerine zstd ile hem hız hem de iyi bir oran elde edebilirsiniz:
#!/bin/bash
# Veritabanı yedekleme scripti
DB_NAME="production_db"
BACKUP_DIR="/backup/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
THREADS=$(nproc)
mkdir -p "$BACKUP_DIR"
# PostgreSQL dump ve anlık zstd sıkıştırma
echo "Yedekleme başlıyor: $DB_NAME"
pg_dump -U postgres "$DB_NAME" |
zstd -T$THREADS -5 -o "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.zst"
echo "Yedek boyutu: $(du -sh "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.zst" | cut -f1)"
# 30 günden eski yedekleri temizle
find "$BACKUP_DIR" -name "*.sql.zst" -mtime +30 -delete
echo "Eski yedekler temizlendi."
Senaryo 3: Büyük Veri Transferi
Sunucular arası büyük dosya transferlerinde bant genişliği darboğaz olabilir. Sıkıştırarak transfer etmek mantıklıdır, ama sıkıştırma CPU darboğazı yaratmamalıdır:
# Yerel sıkıştırma sonra transfer
tar -cf - /data/büyük_dizin | zstd -T0 -3 | ssh kullanici@hedef "zstd -d | tar -xf - -C /hedef/yol"
# Alternatif: Önce sıkıştır, sonra rsync ile aktar
zstd -T0 -3 --keep büyük_dosya.tar
rsync -avP büyük_dosya.tar.zst kullanici@hedef:/hedef/yol/
# Çok parçalı büyük arşivler için split ile kombinasyon
tar -cf - /data/büyük_dizin | zstd -T0 | split -b 4G - arsiv.tar.zst.part
Senaryo 4: Docker Image Optimizasyonu
Docker’ın yeni sürümleri zstd destekli image katmanlarını destekler. Containerfile veya build süreçlerinde zstd kullanmak image transfer sürelerini ciddi ölçüde kısaltabilir:
# Docker buildx ile zstd destekli image oluştur
docker buildx build --output type=oci,dest=image.tar
--compression=zstd --compression-level=3 .
# OCI image'ı zstd ile manuel sıkıştırma
docker save myapp:latest | zstd -T0 -5 -o myapp_latest.tar.zst
# Image'ı geri yükle
zstd -d myapp_latest.tar.zst -c | docker load
lz4 vs zstd: Hangisi Ne Zaman?
Bu iki araç birbirinin rakibi değil, birbirini tamamlayan araçlardır. Doğru aracı doğru senaryoda kullanmak gerekir.
lz4 tercih edin:
- Gerçek zamanlı veri akışlarında sıkıştırma gerektiğinde
- SSD performansının CPU hızından yavaş olduğu durumlarda
- Çok sık okunan ve açılması gereken arşivlerde
- Sistem belleği kısıtlıysa
- Log akışlarını anlık işlerken
zstd tercih edin:
- Uzun süreli saklama gerektiren yedeklemelerde
- Ağ transferi yapılacak ve bant genişliği kısıtlıysa
- CPU kaynakları yeterliyse ve daha iyi oran isteniyorsa
- Birbirine benzer küçük dosyaları toplu sıkıştırırken
- Veritabanı dump’larında ve büyük log arşivlerinde
Sıkıştırma Seviyesi ve Performans Dengesi
zstd’nin geniş seviye aralığı başta kafa karıştırıcı olabilir. İşte pratik bir rehber:
# Hız testi - aynı dosyayı farklı seviyelerde sıkıştır
time zstd -1 büyük_dosya.log -o /dev/null
time zstd -3 büyük_dosya.log -o /dev/null
time zstd -9 büyük_dosya.log -o /dev/null
time zstd -19 büyük_dosya.log -o /dev/null
# Sıkıştırma oranını karşılaştır
for level in 1 3 5 9 12 19; do
zstd -$level --keep büyük_dosya.log -o /tmp/test_$level.zst
echo "Seviye $level: $(du -sh /tmp/test_$level.zst | cut -f1)"
rm /tmp/test_$level.zst
done
Genel pratik önerim: Çoğu durumda zstd için seviye 3 (varsayılan) mükemmel bir başlangıç noktasıdır. Uzun vadeli arşivler için seviye 9-12 arası genellikle hız-oran dengesinin en iyi noktasıdır. Seviye 19 ve üstü sadece gerçekten kritik depolama tasarrufu gerektiğinde mantıklı olur.
Zstd ile Sözlük Kullanımı
zstd’nin en güçlü özelliklerinden biri sözlük desteğidir. Benzer yapıdaki çok sayıda küçük dosyayı sıkıştırırken sözlük oluşturmak sıkıştırma oranını dramatik biçimde artırır:
# Örnek JSON log dosyalarından sözlük oluştur
zstd --train /var/log/app/*.json -o uygulama_sozluk.dict
# Sözlük kullanarak sıkıştır
zstd -D uygulama_sozluk.dict log_dosyasi.json
# Sözlükle açma
zstd -D uygulama_sozluk.dict -d log_dosyasi.json.zst
# Sözlük boyutunu ayarla (varsayılan 112KB)
zstd --train --maxdict=64KB /var/log/app/*.json -o kucuk_sozluk.dict
Bu özellik özellikle mikro servis ortamlarında her biri küçük ama benzer yapıdaki binlerce log dosyasını arşivlerken inanılmaz sonuçlar verir.
Paralel İşlem ve Büyük Dosyalar
Çok çekirdekli sunucularda zstd’nin paralel işlem kapasitesini tam kullanmak için:
# Tüm CPU çekirdeklerini kullan
zstd -T0 -5 devasa_dosya.bin
# İlerleme çubuğu ile izle
zstd -T0 -5 --progress devasa_dosya.bin
# Pipe içinde çok iş parçacıklı kullanım
find /data -name "*.log" -print0 |
xargs -0 -P4 -I{} zstd -T2 -5 --keep {}
# Paralel açma
find /backup -name "*.zst" -print0 |
xargs -0 -P4 -I{} zstd -d -k {}
Sistem Entegrasyonu ve Otomatik Sıkıştırma
/etc/logrotate.d/ konfigürasyonlarında zstd kullanımı:
# /etc/logrotate.d/nginx dosyası
/var/log/nginx/*.log {
daily
rotate 30
compress
compresscmd /usr/bin/zstd
compressoptions -5 --rm
compressext .zst
uncompresscmd /usr/bin/unzstd
missingok
notifempty
sharedscripts
postrotate
nginx -s reopen
endscript
}
Systemd journal’ı da zstd ile sıkıştırılabilir. /etc/systemd/journald.conf dosyasında:
# journald.conf içinde zstd sıkıştırma
[Journal]
Compress=yes
# Yeni systemd sürümlerinde zstd varsayılan olarak kullanılır
Pratik Karşılaştırma Scripti
Kendi sisteminizde farklı araçları karşılaştırmak için kullanabileceğiniz bir script:
#!/bin/bash
# sıkıştırma_karsilastir.sh
# Kullanım: ./sıkıştırma_karsilastir.sh büyük_dosya.log
DOSYA="$1"
BOYUT=$(du -sh "$DOSYA" | cut -f1)
echo "Test dosyası: $DOSYA ($BOYUT)"
echo "-----------------------------------"
# gzip
echo -n "gzip -6: "
time gzip -6 --keep -c "$DOSYA" > /tmp/test.gz
echo "Boyut: $(du -sh /tmp/test.gz | cut -f1)"
# lz4
echo -n "lz4: "
time lz4 -q "$DOSYA" /tmp/test.lz4
echo "Boyut: $(du -sh /tmp/test.lz4 | cut -f1)"
# zstd varsayılan
echo -n "zstd -3: "
time zstd -3 -q --keep "$DOSYA" -o /tmp/test3.zst
echo "Boyut: $(du -sh /tmp/test3.zst | cut -f1)"
# zstd yüksek
echo -n "zstd -9: "
time zstd -9 -q --keep "$DOSYA" -o /tmp/test9.zst
echo "Boyut: $(du -sh /tmp/test9.zst | cut -f1)"
# Temizlik
rm -f /tmp/test.gz /tmp/test.lz4 /tmp/test3.zst /tmp/test9.zst
Sonuç
lz4 ve zstd, modern sistem yöneticisinin araç kutusunda mutlaka yer alması gereken iki önemli araçtır. Eski alışkanlıklarla gzip kullanmaya devam etmek yanlış değildir, ancak işin boyutu büyüdükçe bu araçların getirileri çok daha belirgin hale gelir.
Kendi deneyimlerimden konuşmak gerekirse: yüksek trafikli bir web sunucusunda log rotasyonunu lz4’e geçirdikten sonra rotasyon süresi 8 dakikadan 45 saniyeye düştü. Veritabanı yedeklemelerini zstd ile seviye 5’te yapınca hem gzip’e kıyasla yüzde 15 daha küçük dosyalar elde ettim hem de işlem süresi yarı yarıya azaldı.
Genel öneri olarak: anlık ve sık erişilen veriler için lz4, uzun vadeli saklama ve transfer için zstd kullanın. İkisi de mükemmel belgelenmiş, aktif olarak geliştirilen ve kurumsal düzeyde güvenilir araçlardır. man lz4 ve man zstd komutlarıyla detaylı dokümantasyona ulaşabilirsiniz. Kendi senaryolarınız için yukarıdaki karşılaştırma scriptini çalıştırıp hangi aracın sisteminize daha uygun olduğunu bizzat gözlemlemenizi şiddetle tavsiye ederim.