Merhaba arkadaşlar, bugün sizlere Nginx performans tuning'inin bel kemiği sayılabilecek `worker_processes` ve `worker_connections` ayarlarını nasıl optimize edeceğimizi anlatacağım. Doğru ayarlanmadığında sunucunuz ya kaynakları boşa harcar ya da yük altında "connection limit" hataları vermeye başlar. Bu rehberle, kendi sunucunuzun CPU ve RAM kapasitesine göre en uygun değerleri nasıl hesaplayacağınızı öğreneceksiniz.
Neden Bu Ayarlar Önemli?
Basitçe açıklamak gerekirse, `worker_processes` Nginx'in kaç tane işçi (worker) proses başlatacağını belirler. Her bir worker, bağımsız olarak gelen bağlantıları işler. `worker_connections` ise tek bir worker'ın aynı anda işleyebileceği maksimum bağlantı sayısıdır. Bu iki değerin çarpımı, Nginx'in teorik olarak yönetebileceği maksimum eşzamanlı bağlantıyı verir. Yanlış ayar, CPU bağlam değişimlerinden dolayı performans kaybına veya yetersiz bellekten dolayı çökmelere yol açabilir.
Adım 1: CPU Çekirdek Sayınızı Öğrenin
İlk iş, sunucunuzdaki fiziksel çekirdek sayısını bulmak. `worker_processes` değeri genellikle bu sayıya veya katlarına ayarlanır. Benim sunucularda genelde kullandığım yöntem şu:
Çıktı şuna benzer olacak:
CPU(s): 8
Core(s) per socket: 4
Burada önemli olan toplam fiziksel çekirdek sayısıdır. Eğer sunucunuzda Hyper-Threading (HT) varsa, iş parçacığı (thread) sayısını değil, çekirdek sayısını baz almalısınız. Yukarıdaki örnekte, 2 soket ve her sokette 4 çekirdek var, toplam 8 fiziksel çekirdek demektir.
Adım 2: worker_processes Değerini Belirleyin
En yaygın ve güvenli yöntem, `worker_processes` değerini bulduğunuz fiziksel çekirdek sayısına eşitlemektir. Bu, her çekirdeğin bir worker'ı verimli bir şekilde işlemesini sağlar.
Ancak, sunucunuz sadece Nginx'e özel değilse ve başka servisler (örn: veritabanı) de çalıştırıyorsanız, 1-2 çekirdeği bu servislere ayırmak için değeri biraz düşürebilirsiniz. Örneğin 8 çekirdekli bir sunucuda MySQL de varsa:
Şu ayara çok dikkat etmelisiniz: Eğer `auto` değerini kullanırsanız, Nginx işlemci çekirdeği sayısını (HT dahil) otomatik algılar. Bu, genelde iyi çalışır ama dediğim gibi, HT'li sistemlerde fiziksel çekirdek sayısından fazla worker oluşturabilir. Bu yüzden manuel ayarlamanızı öneririm.
Adım 3: worker_connections ve Sistem Limitlerini Kontrol Edin
`worker_connections` için sihirli bir sayı yok. Varsayılan değer 512'dir ama modern sunucular için bu çok düşük kalır. Bu değeri belirlerken iki kritik sistem limitini bilmelisiniz:
1. İşletim sistemi bağlantı limiti.
2. Kullanılabilir bellek.
Öncelikle, mevcut sistem bağlantı limitinizi kontrol edin:
Bu komut, bir prosesin açabileceği maksimum dosya tanıtıcısı (file descriptor) sayısını gösterir. Her socket bağlantısı bir dosya tanıtıcısı kullanır. Çıkan değer (örneğin 1024) sizin üst sınırınızdır. Bu limiti geçici olarak artırmak için:
Kalıcı yapmak için ise /etc/security/limits.conf dosyasını düzenlemeniz gerekir. Bu dosyaya şu satırları ekleyin:
(Burada `www-data` Nginx'in çalıştığı kullanıcı adıdır, dağıtımınıza göre `nginx` veya `httpd` olabilir.)
Adım 4: Bellek Kullanımını Hesaplayın
Her bağlantı bellek tüketir. Tüketilen bellek miktarı, bağlantının durumuna (idle, aktif) ve buffer ayarlarına göre değişir. Kabaca bir hesaplama yapalım. Diyelim ki:
`worker_processes: 8`
`worker_connections: 4096`
Maksimum Bağlantı: 8 4096 = 32,768 eşzamanlı bağlantı.
Her bir bağlantının ortalama 16KB bellek tükettiğini varsayalım (bu, buffer boyutlarınıza bağlı olarak 8KB ile 64KB arasında değişebilir).
Toplam Tahmini Bellek: 32,768 16KB = 524,288KB yani yaklaşık 512MB.
Bu sadece Nginx'in bağlantılar için kullanacağı ek bellektir. Sunucunuzda bu miktarda boş RAM olduğundan emin olun. Aksi takdirde swap kullanımı başlar ve performans çakılır. Bu nedenle, worker_connections değerini belirlerken mevcut RAM'inizi de göz önünde bulundurun.
Adım 5: Nginx Konfigürasyonunu Yapın
Tüm hesaplamaları yaptıktan sonra, ana Nginx konfigürasyon dosyasını (/etc/nginx/nginx.conf) açın ve `events` bloğunun içindeki ayarları güncelleyin.
Değişiklikleri kaydettikten sonra, yapılandırmayı test edin ve Nginx'i yeniden başlatın:
Sonuç ve Test
Artık Nginx'iniz daha optimize bir şekilde çalışıyor. Ayarlarınızın etkisini görmek için `nginx -V` ile derleme parametrelerine bakıp `--with-http_stub_status_module` modülünün olup olmadığını kontrol edin. Varsa, bir `location` ekleyip `stub_status`'u aktif ederek gerçek zamanlı bağlantı sayılarınızı izleyebilirsiniz.
Unutmayın, bu ayarlar "one size fits all" değildir. Sunucunuzdaki trafik pattern'ine, uygulamanızın davranışına ve donanımınıza göre ince ayar yapmanız gerekebilir. Ben genelde yük testi araçları (örneğin `wrk` veya `siege`) ile farklı değerleri deneyip en iyi sonucu vereni seçerim.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yaklaşımınız veya eklemek istediğiniz bir püf noktası var mı? Aşağıya yorumlarınızı bekliyorum. Sorusu olan arkadaşlar da çekinmeden yazsın, yardımcı olmaya çalışırım.
Basitçe açıklamak gerekirse, `worker_processes` Nginx'in kaç tane işçi (worker) proses başlatacağını belirler. Her bir worker, bağımsız olarak gelen bağlantıları işler. `worker_connections` ise tek bir worker'ın aynı anda işleyebileceği maksimum bağlantı sayısıdır. Bu iki değerin çarpımı, Nginx'in teorik olarak yönetebileceği maksimum eşzamanlı bağlantıyı verir. Yanlış ayar, CPU bağlam değişimlerinden dolayı performans kaybına veya yetersiz bellekten dolayı çökmelere yol açabilir.
İlk iş, sunucunuzdaki fiziksel çekirdek sayısını bulmak. `worker_processes` değeri genellikle bu sayıya veya katlarına ayarlanır. Benim sunucularda genelde kullandığım yöntem şu:
Bash:
lscpu | grep -E "^CPU\(s\):|^Core\(s\) per socket:"
Çıktı şuna benzer olacak:
CPU(s): 8
Core(s) per socket: 4
Burada önemli olan toplam fiziksel çekirdek sayısıdır. Eğer sunucunuzda Hyper-Threading (HT) varsa, iş parçacığı (thread) sayısını değil, çekirdek sayısını baz almalısınız. Yukarıdaki örnekte, 2 soket ve her sokette 4 çekirdek var, toplam 8 fiziksel çekirdek demektir.
En yaygın ve güvenli yöntem, `worker_processes` değerini bulduğunuz fiziksel çekirdek sayısına eşitlemektir. Bu, her çekirdeğin bir worker'ı verimli bir şekilde işlemesini sağlar.
NGINX:
worker_processes 8;
Ancak, sunucunuz sadece Nginx'e özel değilse ve başka servisler (örn: veritabanı) de çalıştırıyorsanız, 1-2 çekirdeği bu servislere ayırmak için değeri biraz düşürebilirsiniz. Örneğin 8 çekirdekli bir sunucuda MySQL de varsa:
NGINX:
worker_processes 6; # 2 çekirdek diğer servislere ayrıldı
Şu ayara çok dikkat etmelisiniz: Eğer `auto` değerini kullanırsanız, Nginx işlemci çekirdeği sayısını (HT dahil) otomatik algılar. Bu, genelde iyi çalışır ama dediğim gibi, HT'li sistemlerde fiziksel çekirdek sayısından fazla worker oluşturabilir. Bu yüzden manuel ayarlamanızı öneririm.
`worker_connections` için sihirli bir sayı yok. Varsayılan değer 512'dir ama modern sunucular için bu çok düşük kalır. Bu değeri belirlerken iki kritik sistem limitini bilmelisiniz:
1. İşletim sistemi bağlantı limiti.
2. Kullanılabilir bellek.
Öncelikle, mevcut sistem bağlantı limitinizi kontrol edin:
Bash:
ulimit -n
Bu komut, bir prosesin açabileceği maksimum dosya tanıtıcısı (file descriptor) sayısını gösterir. Her socket bağlantısı bir dosya tanıtıcısı kullanır. Çıkan değer (örneğin 1024) sizin üst sınırınızdır. Bu limiti geçici olarak artırmak için:
Bash:
ulimit -n 65536
Kalıcı yapmak için ise /etc/security/limits.conf dosyasını düzenlemeniz gerekir. Bu dosyaya şu satırları ekleyin:
Kod:
www-data soft nofile 65536
www-data hard nofile 65536
(Burada `www-data` Nginx'in çalıştığı kullanıcı adıdır, dağıtımınıza göre `nginx` veya `httpd` olabilir.)
Her bağlantı bellek tüketir. Tüketilen bellek miktarı, bağlantının durumuna (idle, aktif) ve buffer ayarlarına göre değişir. Kabaca bir hesaplama yapalım. Diyelim ki:
`worker_processes: 8`
`worker_connections: 4096`
Maksimum Bağlantı: 8 4096 = 32,768 eşzamanlı bağlantı.
Her bir bağlantının ortalama 16KB bellek tükettiğini varsayalım (bu, buffer boyutlarınıza bağlı olarak 8KB ile 64KB arasında değişebilir).
Toplam Tahmini Bellek: 32,768 16KB = 524,288KB yani yaklaşık 512MB.
Bu sadece Nginx'in bağlantılar için kullanacağı ek bellektir. Sunucunuzda bu miktarda boş RAM olduğundan emin olun. Aksi takdirde swap kullanımı başlar ve performans çakılır. Bu nedenle, worker_connections değerini belirlerken mevcut RAM'inizi de göz önünde bulundurun.
Tüm hesaplamaları yaptıktan sonra, ana Nginx konfigürasyon dosyasını (/etc/nginx/nginx.conf) açın ve `events` bloğunun içindeki ayarları güncelleyin.
NGINX:
user www-data;
worker_processes 8; # Fiziksel çekirdek sayınıza göre ayarlayın
pid /run/nginx.pid;
events {
worker_connections 4096; # Sistem limitinize ve RAM'inize göre ayarlayın
multi_accept on; # Birden fazla bağlantıyı aynı anda kabul et
use epoll; # Linux sistemler için en verimli yöntem (varsayılan)
}
http {
# ... diğer http ayarlarınız
}
Değişiklikleri kaydettikten sonra, yapılandırmayı test edin ve Nginx'i yeniden başlatın:
Bash:
sudo nginx -t
sudo systemctl reload nginx # veya restart
Artık Nginx'iniz daha optimize bir şekilde çalışıyor. Ayarlarınızın etkisini görmek için `nginx -V` ile derleme parametrelerine bakıp `--with-http_stub_status_module` modülünün olup olmadığını kontrol edin. Varsa, bir `location` ekleyip `stub_status`'u aktif ederek gerçek zamanlı bağlantı sayılarınızı izleyebilirsiniz.
Unutmayın, bu ayarlar "one size fits all" değildir. Sunucunuzdaki trafik pattern'ine, uygulamanızın davranışına ve donanımınıza göre ince ayar yapmanız gerekebilir. Ben genelde yük testi araçları (örneğin `wrk` veya `siege`) ile farklı değerleri deneyip en iyi sonucu vereni seçerim.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yaklaşımınız veya eklemek istediğiniz bir püf noktası var mı? Aşağıya yorumlarınızı bekliyorum. Sorusu olan arkadaşlar da çekinmeden yazsın, yardımcı olmaya çalışırım.