📊 ixtif.com Performans Analizi

📅 Tarih: 2025-11-30 03:38 | 🎯 Tenant: ixtif.com | 👤 Talep: Aşırı yavaşlık için detaylı kök neden ve aksiyon planı

🚦 Detaylı Durum Özeti

CPU & Süreç Yoğunluğu

  • Load average: 16.95 / 15.14 / 14.92 (çok yüksek).
  • Aktif Horizon worker sayısı: 14 adet (ek olarak birden fazla master).
  • En yüksek CPU kullananlar: artisan horizon:work süreçleri %10-16 arası; üst sıralar tamamen queue worker'lar.

Horizon Çoğalma Sorunu

  • ps çıktısı birden çok master seti gösteriyor (ZkT3, yZ59, rwGp, 6KJ6, heML, HKPJ, OLr0 ve daha fazlası).
  • queue:health-check komutu her dakika çalışıyor, QueueHealthService içinde nohup ile Horizon başlatıyor → süreçler kapanmadan katlanıyor.
  • AutoQueueHealthCheck middleware admin trafiğinde dispatch ediyor; queue:ensure-workers (docker) de cron’dan çalışıyor.

Veritabanı

  • tenant-resource-tracking.log: SQLSTATE[HY000] [1040] Too many connections (tenants tablosu okurken).
  • Slow queries: module_tenants join 145 ms (tenant_id + is_active filtreli), Pulse insert batch 111 ms.

Debug / İzleme Araçları

  • APP_DEBUG = true, APP_DEBUG_TOOLS = true (prod'da açık).
  • Debugbar aktif ve storage/debugbar = 1.6 GB.
  • Pulse & Telescope env üzerinden açık; Pulse her istekte pulse_entries'e yazıyor.

🔍 Kök Neden Analizi

Horizon süreç fırtınası Yüksek

Belirti: 6+ Horizon master, 14+ worker; her biri ~%10-16 CPU. Load 15+ seviyesinde.

Neden: queue:health-check komutu her dakika runInBackground; QueueHealthService içinde nohup php artisan horizon & çağrısı var. AutoQueueHealthCheck middleware admin sayfalarında 5 dakikada bir job dispatch ediyor. queue:ensure-workers cron'u docker container kontrolü yapıyor. Terminate edilmeden yeni Horizon setleri açılıyor.

Etkisi: CPU tüketimi + MySQL bağlantı şişmesi (1040 hatası); PHP-FPM kaynakları kısıtlanıyor, yanıt süresi artıyor.

Debug/izleme üretimde açık Yüksek

Belirti: Debugbar kayıtları 1.6 GB; Pulse slow request ve query kayıtları logda görünüyor; APP_DEBUG/APP_DEBUG_TOOLS true.

Neden: Prod ortamında debug flag'leri kapatılmamış; Debugbar tüm kolektörlerle çalışıyor, Pulse/Telescope kayıt yazıyor.

Etkisi: Her istekte ekstra disk I/O ve DB yazımı; response time ve disk kullanımını artırıyor.

Veritabanı bağlantı satürasyonu Orta

Belirti: Too many connections hatası; tenant sorguları ve Pulse insert'leri görüldü.

Neden: Horizon çoğalması + debug kayıtlarının yoğun DB yazımı; MySQL max_connections ile PHP/Horizon süreç sayısı uyumsuz.

Etkisi: 500/1040 riskleri, geciken sorgular, kuyrukların yavaşlaması.

🎯 Aksiyon Planı (Önceliklendirilmiş)

1) Horizon tekilleştirme ve süreç temizliği Yüksek

queue:health-check içindeki Horizon auto-start'ı devre dışı bırak; AutoQueueHealthCheck middleware'in queue health tetiklemesini kapat veya admin dışına al; queue:ensure-workers (docker) cron'unu prod’da durdur.

Ardından tek seferlik horizon:terminate (ve gerekirse ps ile kalan worker'ları sonlandır) + Supervisor/systemd ile tek master setini çalışır bırak.

Hedef: Tek Horizon master + limitli worker (config/horizon.php prod: maxProcesses 2/1/1) → CPU ve bağlantı tüketimi düşer.

2) Prod'da debug/izleme kapatma Yüksek

APP_DEBUG=false, APP_DEBUG_TOOLS=false yap; Debugbar/Telescope/Pulse'ı prod için kapat; storage/debugbar içeriğini temizle; Pulse/Telescope tablolarını trim et.

Hedef: İstek başına I/O'yu düşürmek, disk alanını geri kazanmak.

3) DB bağlantı hizalaması Orta

Horizon süreç sayısını azalttıktan sonra MySQL max_connections değerini PHP-FPM + Horizon toplamına göre ayarla; uzun süren queue işleri için timeout ve maxJobs limitlerini takip et.

Hedef: 1040 hatalarını ortadan kaldırmak, kuyruk stabilitesini sağlamak.

4) Cron sadeleşmesi Orta

queue:health-check periyodunu düşür veya kapat; docker tabanlı ensure-workers komutunu dev ortamına taşı; AutoQueueHealthCheck rate limit'ini yükselt veya tamamen devre dışı bırak.

Hedef: Gereksiz süreç yaratımını ve log gürültüsünü azaltmak.

5) İzleme sonrası ince ayar Düşük

Altyapı sakinleştikten sonra module_tenants sorgusuna uygun index (tenant_id, is_active, module_id) kontrolü; Pulse örnekleme oranını düşür veya tamamen kapat.

Hedef: DB yanıt süresini iyileştirmek, responsecache kazancını artırmak.

🧭 Uygulama Sırası

  1. queue:health-check auto Horizon start kapat; AutoQueueHealthCheck ve queue:ensure-workers cron'u devre dışı bırak.
  2. horizon:terminate ile fazla setleri sonlandır; Supervisor/systemd ile tek set başlat.
  3. APP_DEBUG/APP_DEBUG_TOOLS=false; Debugbar/Telescope/Pulse kapat, kayıtları temizle.
  4. MySQL bağlantı limitleri ve PHP-FPM/Horizon süreç sayısını hizala; uzayan job'lar için timeout kontrolü.
  5. İzleme: load average, MySQL connections, queue latency; ardından query/index iyileştirmeleri.