24 Yıllık Linux Çekirdek TCP Hatası: rsync Aktarımları Neden Donuyordu
Skroutz mühendisleri, rsync donmalarını araştırırken Linux çekirdeğinin TCP uygulamasında 24 yıllık bir hatayı ortaya çıkardı.
Skroutz mühendisleri, geliştiricilere günlük olarak güncellenen yazılabilir veritabanı anlık görüntüleri sağlamak için LVM, rsync ve ZFS'e dayanan bir boru hattı kullanıyor. Bu hat yıllardır 15'ten 150 geliştiriciye sorunsuz ölçeklenmişti; ancak zaman zaman rsync aktarımları görünürde hiçbir sebep olmadan sonsuza dek donuyordu ve sorun kolay tekrarlanamıyordu.
Ekip önce ağ donanımını, NIC offloading hatalarını ve anahtar seviyesindeki paket kayıplarını inceledi, ardından strace ve gdb ile süreçleri izledi. Gerçek ipucu ss(8) çıktısında bulundu: bağlantı durumu 'persist' zamanlayıcısını gösteriyordu, yani karşı taraf sıfır pencere (zero window) bildirmiş ve alıcı tarafın alım tamponunun (Recv-Q) boş olmasına rağmen veri akışı durmuştu.
Bu davranış, TCP akış kontrolünün ve sıfır pencere problarının (zero window probes) beklenen çalışma şeklinin ötesine geçen, çekirdeğin TCP uygulamasında 24 yıldır var olan bir hatayı gün yüzüne çıkardı. Vaka, düşük seviyeli ağ hata ayıklamasının (ss, strace, tcpdump) üretim sistemlerindeki gizemli donmaları nasıl çözebileceğinin iyi bir örneğini sunuyor ve TCP pencere mekanizmasının derinlemesine anlaşılmasının neden hâlâ kritik olduğunu gösteriyor.