🚨 Homepage Performans Krizi

📅 Tarih: 2025-11-30 16:55 | 🎯 Tenant: ixtif.com (Tenant 2) | 👤 Kaynak: a-html.txt debug çıktısı | 🌐 URL: /

⚠️ KRİTİK DURUM

Homepage 23.3 saniyede yükleniyor! Hedef 2-3 saniye olmalıydı. Bu 10 kat daha yavaş demektir. Sorun acilen çözülmeli!

📊 Performans Metrikleri

23.3s
Toplam Yükleme Süresi
21.8s
Query Süresi (Total)
%93
Query Oranı
6
Query Sayısı

🔍 Sorun Analizi

1. Session Delete Sorunu KRİTİK

Session garbage collection (Eski oturum kayıtlarını temizleme işlemi) her request'te çalışıyor!

delete from sessions where last_activity <= 1764503683 Duration: 16806.76ms (16.8 saniye!)
  • Süre: 16.8 saniye (toplam sürenin %72'si)
  • Sebep: Sessions tablosu çok büyük ve index yok
  • Sorun: Her sayfa yüklenişinde temizleme çalışıyor
  • Etki: Kullanıcı bekliyor, site donuyor

2. Session Update Sorunu YÜKSEK

Her request'te session verisi güncelleniyor ama çok yavaş.

update sessions set payload = ... Duration: 4965.75ms (5 saniye!)
  • Süre: 5 saniye (toplam sürenin %21'i)
  • Sebep: Payload çok büyük veya tablo index'siz
  • Sorun: Database session driver yavaş

3. Diğer Query'ler Normal ✅

  • Tenant sorgusu: 24.07ms ✅
  • Domain sorgusu: 0.59ms ✅
  • Schema kontrolü: 2.26ms ✅

Tenant ve domain sorguları gayet hızlı. Sorun sadece session sisteminde.

💡 Kök Neden

Laravel Session Garbage Collection Mekanizması

Laravel, session garbage collection (eski session kayıtlarını temizleme) işlemini varsayılan olarak lottery sistemi ile yapar:

'lottery' => [2, 100] // %2 ihtimalle temizle

Ancak bu ayar yetersiz kalabilir:

  • Sessions tablosu çok büyüdüğünde temizleme çok uzun sürer
  • Lottery her request'te kontrol edilir (overhead)
  • Database session driver Redis'e göre 10-20x daha yavaş
  • Index yoksa DELETE sorgusu tüm tabloyu tarar

✅ Çözüm Önerileri

1. Session Driver Değiştir (Redis) KRİTİK

Database driver yerine Redis driver kullan. Redis bellekte çalıştığı için 10-20x daha hızlıdır.

Avantajlar:

  • Session okuma/yazma milisaniye seviyesine iner
  • Redis otomatik expire ile eski session'ları temizler
  • Database'e yük binmez
  • Garbage collection sorunu ortadan kalkar

Yapılacaklar:

  • config/session.php → driver = 'redis' yap
  • Redis bağlantısını test et
  • Cache temizle ve test et

Beklenen Sonuç:

❌ ŞİMDİ (Database):
Session update: 5s
Session delete: 16.8s
Total: 21.8s
✅ SONRA (Redis):
Session update: ~5ms
Session delete: 0ms
Total: ~5ms

2. Session Garbage Collection Devre Dışı YÜKSEK

Eğer database driver kullanmaya devam edeceksen, garbage collection'ı request-time'dan çıkar, scheduled task (zamanlanmış görev) yap.

Yapılacaklar:

  • config/session.php → lottery = [0, 100] (devre dışı)
  • app/Console/Kernel.php → Gece 3'te session temizleme task'ı ekle
  • Cron ile otomatik temizleme

Avantaj:

  • Kullanıcı request'leri hızlı olur (temizleme yok)
  • Temizleme gece yapılır (site trafiği azken)

Dezavantaj:

  • Session tablosu gece temizlenene kadar büyür
  • Database hala session için kullanılır (Redis kadar hızlı değil)

3. Session Tablosu Index Ekle YÜKSEK

Eğer database driver kullanmaya devam edeceksen, session tablosuna index ekle. DELETE sorgusu çok daha hızlı olur.

Yapılacaklar:

  • sessions tablosuna last_activity index'i ekle
  • Migration oluştur
  • Test et

Beklenen Sonuç:

  • DELETE sorgusu 16.8s → ~100-500ms (30-150x hızlanma)
  • Yine de Redis kadar hızlı olmaz

4. Session Lifetime Azalt ORTA

Session ömrünü azaltarak session tablosunun şişmesini önle.

Yapılacaklar:

  • config/session.php → lifetime = 120 (2 saat)
  • Eski session'lar daha erken expire olur
  • Tablo daha küçük kalır

🎯 Önerilen Strateji

Çözüm 1: Redis Driver (EN İYİ) ⭐⭐⭐⭐⭐

Neden en iyi:

  • Kalıcı çözüm (sorun kökten hallolur)
  • Çok hızlı (Redis bellekte çalışır)
  • Database'e yük bindirmez
  • Garbage collection otomatik (Redis expire)
  • Uygulama kolay (sadece config değişikliği)

Risk: Yok (Redis zaten sistemde var, kullanılıyor)

Tavsiye: ✅ HEMEN UYGULA!

Çözüm 2: Garbage Collection + Index (YEDEK) ⭐⭐⭐

Ne zaman kullanılır:

  • Redis kullanmak istemiyorsan
  • Database session zorunluysa

Dezavantaj: Redis kadar hızlı olmaz

📈 Beklenen Sonuç

❌ ŞİMDİ

  • Toplam: 23.3s
  • Query: 21.8s
  • Session delete: 16.8s
  • Session update: 5s

✅ REDIS SONRASI

  • Toplam: ~2-3s
  • Query: ~50ms
  • Session delete: 0ms
  • Session update: ~5ms
8-10x
Hızlanma Beklentisi
~21.8s
Kazanılan Süre
%93
İyileşme Oranı

⚡ Uygulama Adımları

Adım 1: Redis Session Driver Aktif Et

  • config/session.php dosyasını aç
  • 'driver' => 'database' → 'redis' değiştir
  • Redis bağlantı ayarlarını kontrol et

Adım 2: Cache Temizle

  • php artisan config:clear
  • php artisan cache:clear
  • php artisan view:clear

Adım 3: Test Et

  • Homepage'i yenile
  • a-html.txt çıktısını kontrol et
  • Session query'lerinin kaybolduğunu doğrula
  • Yükleme süresinin 2-3s'ye düştüğünü onayla

Adım 4: Eski Session Kayıtlarını Temizle (Opsiyonel)

  • Artık database session kullanmıyorsun
  • Eski kayıtlar silinebilir (boş disk kazanırsın)
  • TRUNCATE sessions (dikkatli ol!)