VDS (Sanal Özel Sunucu) üzerinde Node.js ile geliştirilen web uygulamaları genellikle hafif ve hızlı çalışırken, belirli koşullarda CPU yüksek olmasına rağmen uygulama donup kalıyor, API yanıt süresi birden artıyor ya da istemciler timeout hatası alıyorlar. Bu sorunun temel sebebi çoğu zaman Event Loop'un bloke olmasıdır. Event Loop, Node.js'in asenkron işlemleri yönettiği mekanizmanın kalbini oluşturur; eğer bu bloke olursa, tüm uygulama tepki vermemeye başlar.

Event Loop Nedir ve Neden Bloke Olur?

Node.js tek bir thread üzerinde çalışır ve bütün istekleri Event Loop aracılığıyla işler. Eğer bir işlem (dosya okuma, matematiksel hesaplama ya da senkron kod) uzun süre CPU kaynağını kilitlerse, Event Loop bu süre boyunca diğer istekleri işleyemez. Örneğin, bir forEach döngüsünde 10 milyon elementi işlemek, sorgulamak ya da büyük bir dosyayı senkron şekilde okumak Event Loop'u bloke edebilir. Bağlantı havuzunda bekleme süresi artar ve tüm sistem yavaşlar.

Event Loop Tıkanmasının Belirtileri Nelerdir?

VDS'de Node.js uygulaması çalıştıkken şu davranışları gözlemlerseniz Event Loop blokeler ile karşı karşıyasınız olabilirsiniz:

  • API isteklerine normal zamanda cevap veriyorken, birdenbire 5-10 saniye gecikmeler yaşanması
  • CPU kullanımı %80-100 seviyesinde kalması, RAM ise normalken uygulama hala yavaş çalışması
  • Uygulamayı yeniden başlattıktan hemen sonra sorun çözülüyor, ancak birkaç saat sonra tekrar başlaması
  • pm2 loglarında ya da stdout'da dönemez durum hatası (hanging) olması
  • Veritabanı sorgularının zamanında tamamlanmasına rağmen web yanıtı geç gelmesi

Event Loop Tıkanmasını Nasıl Tanılarsınız?

clinic.js ya da node --prof aracını kullanarak Event Loop gecikmeleri ölçebilirsiniz. En pratik yöntem toobusy-js kütüphanesini uygulamaya entegre etmektir. Bu kütüphane Event Loop kaç milisaniye bloke olduğunu raporlar.

Alternatif olarak, basit bir middleware yazabilirsiniz:

const start = Date.now(); setImmediate(() => { const delay = Date.now() - start; if (delay > 50) console.warn(`Event Loop gecikmesi: ${delay}ms`); });

Bu kod her döngüde Event Loop'u kontrol eder ve 50ms'den fazla gecikme varsa uyarır. VDS'de pm2 ile çalıştırıyorsanız, bu mesajları pm2 logs ile takip edebilirsiniz.

Event Loop Tıkanmasını Çözmek için Pratik Çözümler

1. Ağır İşlemleri Worker Thread'e Taşıyın
Node.js 10.5+ sürümlerinde Worker Threads mevcuttur. CPU-yoğun işlemleri ana thread'den ayırın:

const { Worker } = require('worker_threads'); const worker = new Worker('./heavy-task.js'); worker.on('message', result => console.log(result));

2. Senkron Kodları Asenkron Hale Getirin
Tüm dosya işlemleri, veritabanı sorguları ve harici API çağrılarında await ve Promise kullanın. fs.readFileSync yerine fs.promises.readFile kullanın.

3. Veritabanı Bağlantı Havuzunu Doğru Yapılandırın
MySQL, PostgreSQL vb. için bağlantı havuzu boyutunu uygulamanızın ihtiyacına göre ayarlayın. Çok küçük bir havuz Event Loop'u bloke edebilir çünkü istekler sıraya girer.

4. Başarısız İsteklere Timeout Ayarlayın
Her API isteğine timeout değeri verin. Asılı kalacak istekler Event Loop'u uzun süre bağlayabilir.

VDS'de Node.js Uygulaması İçin Optimal Ayarlar

pm2 ile uygulamayı başlatırken şu parametreleri kullanın:

pm2 start app.js -i max --max-memory-restart 512M --node-args="--max-old-space-size=1024"

Bu, CPU core sayısı kadar instance başlatır (cluster mode), bellek sınırı 512MB'a gelirse yeniden başlatır ve Node.js heap boyutunu artırır. Bu ayarlar Event Loop'u daha iyi yönetir.

Monitoring ve Proaktif İzleme

VDS'de clinic.js doctor ya da 0x profiler kullanarak gerçek senaryolarda uygulamanızı profile alın. Böylece hangi kod satırında Event Loop blokası yaşandığını tespit edebilirsiniz. Grafana ya da Prometheus ile Event Loop gecikmeleri uzun vadede izleyin.

Node.js uygulamalarınız VDS ortamında maksimum performansla çalışması için Event Loop'u bloke eden kod parçalarını belirlemek ve asenkron yapıya geçmek zorunludur. Özellikle üretim ortamında bu denetim hayati önem taşır. Bogahost'un yönetilen VDS çözümleri, Node.js uygulamalarınızı en iyi performans ile çalıştırabilmek için gerekli kaynak ve destek sağlar.