Linux TCP Backlog Ayarları

Celal

Yarbay
Admin
Katılım
23 Kasım 2025
Mesajlar
1,103
Reaksiyon puanı
46
Linux işletim sistemlerinde TCP backlog, sunucuların gelen bağlantıları ne kadar verimli yönetebildiğini belirleyen kritik bir ayardır. Bir web sunucusu veya veritabanı gibi yüksek trafik alan bir uygulama çalıştırırken, anlık bağlantı yoğunluklarını sorunsuz bir şekilde karşılamak için bu ayarların doğru yapılması büyük önem taşır. Backlog, temelde, uygulamanın henüz işleme almadığı ancak işletim sisteminin kabul ettiği bağlantı isteklerini tuttuğu bir kuyruk görevi görür. Bu kuyruğun boyutu, uygulamanın yük altında bağlantı kaybetmeden ne kadar esnek olabileceğini doğrudan etkiler. Bu nedenle, sunucu performansını optimize etmek ve hizmet kesintilerini önlemek adına TCP backlog mekanizmasını anlamak ve doğru şekilde yapılandırmak kaçınılmazdır.

## TCP Backlog Nedir?

TCP backlog, bir sunucu uygulamasının aynı anda işleyemediği ancak işletim sistemi tarafından kabul edilen bekleyen bağlantı isteklerinin saklandığı bir kuyruktur. Uygulama, `listen()` sistem çağrısını kullanarak işletim sistemine dinlemeye başlayacağını bildirirken, bu kuyruğun maksimum boyutunu da belirtir. Gelen her yeni bağlantı isteği, bu kuyruğa eklenir ve uygulama `accept()` sistem çağrısıyla bu kuyruktan bağlantıları alıp işler. Örneğin, bir web sunucusu anlık olarak yüzlerce yeni bağlantı isteği aldığında, bunların hepsini anında işleyemeyebilir. Bu durumda, işletim sistemi bu istekleri backlog kuyruğunda tutar ve uygulama uygun olduğunda sırayla işleme alır. Bu mekanizma, yoğun yük altında dahi sunucunun yeni bağlantı isteklerini reddetmesini engelleyerek kesintisiz bir hizmet sunar.

## accept() ve listen() Kuyrukları

Linux TCP backlog mekanizması aslında iki ayrı kuyruktan oluşur. Birincisi, "SYN kuyruğu" veya "incomplete connection queue" olarak bilinen, üç yollu el sıkışmanın henüz tamamlanmadığı (SYN_RECV durumundaki) bağlantı isteklerini barındırır. İkincisi ise "accept kuyruğu" veya "completed connection queue" olarak adlandırılır; burada üç yollu el sıkışma tamamlanmış (ESTABLISHED durumunda) ve uygulamanın `accept()` çağrısı ile almayı bekleyen bağlantılar bulunur. `listen()` sistem çağrısının `backlog` parametresi, genellikle bu iki kuyruğun toplam boyutunu veya bazı kernel sürümlerinde sadece `accept` kuyruğunun boyutunu belirler. Bu nedenle, işletim sistemi ve kernel sürümüne bağlı olarak davranış farklılıkları gösterebilir. Her iki kuyruğun da yeterli boyutta olması, bağlantı kurulum sürecinin sorunsuz işlemesi için kritik önem taşır.

## backlog Parametresinin Önemi

`backlog` parametresinin doğru yapılandırılması, özellikle yüksek trafikli sunucular için hayati öneme sahiptir. Yetersiz bir backlog kuyruğu, yoğun bağlantı istekleri sırasında yeni bağlantıların düşmesine neden olabilir. Başka bir deyişle, uygulama kuyruğu dolu olduğu için işletim sistemi gelen SYN paketlerine cevap veremez veya onları reddeder. Bu durum, istemcilerin "Connection refused" (Bağlantı reddedildi) hatası almasına yol açar ve kullanıcı deneyimini olumsuz etkiler. Sonuç olarak, hizmet kesintileri yaşanabilir ve sunucunun genel performansı düşer. Ek olarak, DoS (Hizmet Reddi) saldırılarına karşı da sunucuyu daha savunmasız hale getirir. Bu nedenle, sunucunun beklenen yükünü göz önünde bulundurarak yeterli bir backlog boyutu belirlemek, sistem kararlılığı ve erişilebilirliği için vazgeçilmezdir.

## net.core.somaxconn Ayarı

`net.core.somaxconn`, Linux çekirdeğindeki sistem genelinde geçerli olan bir ayardır ve bir uygulamanın `listen()` çağrısıyla talep edebileceği maksimum backlog boyutunu belirler. Başka bir deyişle, bir uygulama `listen(sockfd, 1024)` diyerek 1024 boyutunda bir backlog istese bile, eğer `net.core.somaxconn` 128 olarak ayarlıysa, efektif backlog boyutu 128 olacaktır. Bu parametre, genellikle `/proc/sys/net/core/somaxconn` üzerinden okunur ve `sysctl` komutu ile değiştirilir. Örneğin, `sudo sysctl -w net.core.somaxconn=65535` komutu ile değer yükseltilebilir. Ancak, bu değişiklik yalnızca geçicidir. Kalıcı olması için `sysctl.conf` dosyasına eklenmesi gerekir. Varsayılan değeri çoğu zaman düşük kalabilir, bu nedenle yoğun yük altında çalışan sunucular için artırılması önerilir.

## net.ipv4.tcp_max_syn_backlog Ayarı

`net.ipv4.tcp_max_syn_backlog` ise SYN kuyruğunun maksimum boyutunu belirleyen çekirdek parametresidir. Bu ayar, henüz üç yollu el sıkışması tamamlanmamış (SYN_RECV durumunda) bağlantı isteklerinin tutulduğu kuyruğun kapasitesini yönetir. SYN saldırılarına karşı bir koruma katmanı sağlar; çünkü bu saldırılar genellikle çok sayıda SYN paketi göndererek sunucunun SYN kuyruğunu doldurmayı amaçlar. Bu kuyruğun yeterli boyutta olması, meşru bağlantı isteklerinin dahi SYN saldırıları sırasında düşmesini engellemeye yardımcı olur. `net.ipv4.tcp_max_syn_backlog` değeri de `sysctl` komutu ile değiştirilebilir ve `sysctl.conf` dosyasına eklenerek kalıcı hale getirilebilir. Çoğu zaman `net.core.somaxconn` ile birlikte ayarlanması tavsiye edilir, çünkü ikisi birbiriyle etkileşim halindedir.

## Uygulama Seviyesinde Backlog Yönetimi

Linux çekirdek seviyesindeki ayarlar önemli olsa da, birçok uygulama kendi `listen()` çağrısında özel bir backlog değeri belirtir. Örneğin, Nginx, Apache HTTP Server, Node.js veya Java uygulamaları gibi sunucu yazılımları, genellikle yapılandırma dosyalarında veya kodlarında bu değeri ayarlama seçeneği sunar. Uygulamanın belirttiği backlog değeri, `net.core.somaxconn` ayarını aşamaz; çekirdek tarafından belirlenen bu üst sınırın altında kalmak zorundadır. Başka bir deyişle, `net.core.somaxconn` bir tavan görevi görür. Bu nedenle, hem çekirdek seviyesindeki `somaxconn` değerinin hem de uygulamanın kendi içinde belirlediği değerin sunucunun beklenen yükünü karşılayacak şekilde optimize edilmesi gerekir. Doğru bir yapılandırma, uygulamanın bağlantı yönetimi yeteneğini önemli ölçüde artırır.

## Optimize Edilmiş Backlog Ayarlarının Faydaları

Optimize edilmiş TCP backlog ayarları, bir Linux sunucusunun performansını ve güvenilirliğini ciddi ölçüde artırır. En belirgin faydası, yoğun bağlantı trafiği altında dahi sunucunun yeni bağlantı isteklerini reddetme olasılığının azalmasıdır. Bu durum, kullanıcıların "Connection refused" hatalarıyla karşılaşmasını engeller ve daha akıcı bir kullanıcı deneyimi sunar. Ek olarak, sunucu daha kararlı hale gelir, çünkü ani trafik artışlarını daha iyi yönetebilir ve hizmet kesintileri riski minimize edilir. DoS (Hizmet Reddi) saldırılarına karşı da daha dirençli bir yapıya kavuşur. Sonuç olarak, kaynakların daha verimli kullanılması sağlanır ve sunucunun genel erişilebilirliği ile performansı önemli ölçüde iyileşir. Bu nedenle, bu ayarların doğru bir şekilde yapılandırılması, her yüksek performanslı sistem için temel bir adımdır.
 
Geri
Üst Alt