Container’larımın ne zaman yavaşladığını anlamak için bir rehber hazırladım. Bu yazıda, kendi VPS’imde Docker container’larının performansını nasıl izlediğimi adım adım anlatacağım. Kimi zaman basit bir ayar değişikliği, kimi zaman da altta yatan sistem kaynaklarının yetersizliği performansı ciddi şekilde etkileyebiliyor. Bu süreci sistemli bir şekilde yönetmek, olası sorunları erkenden tespit etmek ve çözmek için kritik.
Özellikle kendi sunucularımda çalışan uygulamaların performans takibi benim için önemli. Docker’ın sunduğu izolasyon ve taşınabilirlik harika olsa da, bu container’ların altında yatan sistem kaynaklarını doğru yönetmek ve izlemek gerekiyor. Bu rehberde, bu süreci nasıl yönettiğimi ve karşılaştığım tipik sorunları nasıl çözdüğümü paylaşacağım.
Container Performansını İzleme Temelleri
Bir Docker container’ının yavaşlamasının birçok nedeni olabilir. Bunlar arasında CPU kullanımı, bellek tüketimi, I/O darboğazları veya ağ gecikmeleri gibi faktörler yer alır. İlk adım, bu temel metrikleri sistemli bir şekilde toplamak ve analiz etmektir. Kendi VPS’imde bu izlemeyi yaparken genellikle systemd, cgroup ve journald gibi araçlardan faydalanıyorum.
Bu araçlar, container’ların ve altında çalıştıkları ana sistemin kaynak kullanımlarını anlamak için güçlü bir temel sunar. Özellikle cgroup’lar, container’ların ne kadar CPU, bellek ve diğer kaynakları kullanabileceğini sınırlamak ve izlemek için kullanılır. journald ise sistem ve servis loglarını merkezi bir yerde toplar, bu da hata ayıklama sürecini inanılmaz derecede kolaylaştırır.
Systemd Unit’leri ve Container Yönetimi
Docker servisleri genellikle systemd tarafından yönetilir. Bu, container’larınızın başlatılması, durdurulması ve yeniden başlatılması gibi işlemlerin systemd üzerinden kontrol edilebileceği anlamına gelir. Container’larınızı tek tek izlemek yerine, ana servislerini ve onların kaynak kullanımlarını takip etmek daha verimli olabilir.
systemd unit dosyalarını inceleyerek, servislerin nasıl başlatıldığını, hangi bağımlılıklara sahip olduğunu ve hangi kaynak limitlerinin uygulandığını görebilirsiniz. Bu, özellikle container’larınızın beklenen şekilde çalışmadığı durumlarda sorunun kaynağını bulmak için iyi bir başlangıç noktasıdır.
systemctl status docker
systemctl status containerd
Bu komutlar, Docker daemon’unun ve container runtime’ının durumunu gösterir. Eğer bu servisler düzgün çalışmıyorsa, altında çalışan container’lar da etkilenecektir.
Cgroup ile Kaynak Limitlerini Anlama
Container’ların performansını anlamanın en önemli yollarından biri, cgroup (control groups) aracılığıyla kaynak kullanımlarını izlemektir. Docker, container’ları izole etmek ve kaynaklarını yönetmek için cgroup’ları kullanır. Her container için ayrı bir cgroup oluşturulur ve bu sayede CPU, bellek, disk I/O gibi kaynaklar üzerinde ince ayar yapabilirsiniz.
cgroup’ları doğrudan incelemek biraz karmaşık olabilir, ancak docker stats komutu bu bilgiyi daha anlaşılır bir şekilde sunar. Bu komut, çalışan container’larınızın gerçek zamanlı CPU, bellek, ağ G/Ç ve disk G/Ç istatistiklerini gösterir.
docker stats
Bu komutun çıktısını düzenli olarak kontrol etmek, hangi container’ın en fazla kaynağı tükettiğini anlamanıza yardımcı olur. Eğer bir container sürekli olarak CPU’nun yüksek bir yüzdesini kullanıyorsa veya bellek kullanımında ani artışlar gözlemliyorsanız, bu o container’da bir performans sorunu olduğuna işaret edebilir.
Journald ile Log Analizi
Container’larınızın veya altında çalışan servislerin davranışını anlamak için loglar kritik öneme sahiptir. journald, Linux sistemlerinde logları toplamak ve yönetmek için kullanılan merkezi bir servistir. Docker container’ları da loglarını journald üzerinden üretebilir. Bu sayede, sadece container’ın kendi loglarını değil, aynı zamanda host sistemindeki ilgili servislerin loglarını da tek bir yerden inceleyebilirsiniz.
journalctl komutu, journald tarafından toplanan logları sorgulamak ve filtrelemek için kullanılır. Belirli bir container’ın loglarını görmek veya belirli bir zaman aralığındaki hata mesajlarını incelemek için bu komutu kullanabilirsiniz.
journalctl -u docker.service -f
journalctl -u container-your-container-name.service -f
journalctl --since "2026-05-12 00:00:00" --until "2026-05-13 00:00:00"
İlk komut Docker servisinin canlı loglarını gösterirken, ikincisi belirli bir container servisi için aynı işlevi görür (eğer container’ı systemd servisi olarak yönetiyorsanız). Üçüncü komut ise belirli bir tarih aralığındaki tüm sistem loglarını getirir. Bu loglar, yavaşlamanın nedenini anlamak için ipuçları sunabilir. Örneğin, sık sık tekrar eden hata mesajları veya beklenmedik uyarılar performans sorunlarına işaret edebilir.
Yaygın Yavaşlama Nedenleri ve Çözümleri
Şimdiye kadar temel izleme araçlarını ve yöntemlerini ele aldık. Şimdi, kendi VPS’imde karşılaştığım ve sıkça rastlanan bazı yavaşlama nedenlerine ve bunların nasıl çözüldüğüne odaklanalım. Bu senaryolar, genel bir rehber olmanın ötesinde, pratik uygulamalar sunmayı amaçlıyor.
CPU Darboğazları
Eğer docker stats çıktısında bir container’ın sürekli olarak yüksek CPU kullanımına sahip olduğunu görüyorsanız, bu durum birkaç nedenden kaynaklanabilir. Uygulamanın kendisi yoğun işlem gücü gerektirebilir veya sonsuz bir döngüye girmiş olabilir. Bazen de, container’a ayrılan CPU kaynağı yetersiz kalmış olabilir.
Bu durumda ilk yapılması gereken, o container’ın içinde çalışan uygulamanın ne kadar CPU kullandığını anlamaktır. Gerekirse, daha detaylı bir analiz için top veya htop gibi araçları container içinde çalıştırabilirsiniz. Eğer sorun uygulamanın kendisindeyse, optimizasyon gerekebilir. Eğer sorun kaynak yetersizliğiyse, container’a daha fazla CPU kaynağı ayırmanız gerekebilir.
Bellek Sızıntıları (Memory Leaks)
Bellek sızıntıları, bir uygulamanın kullandığı belleği işlem tamamlandıktan sonra geri bırakmaması durumudur. Zamanla bu durum, container’ın belleğini tamamen doldurabilir ve sistemin genel performansını düşürebilir. docker stats komutu, bellek kullanımındaki sürekli artışı fark etmenizi sağlar.
Eğer bir bellek sızıntisinden şüpheleniyorsanız, sorunu tespit etmek için container içindeki uygulamanın bellek kullanımını izlemeniz gerekir. Çoğu programlama dili için bellek profilleme araçları mevcuttur. Bu araçlar, hangi kod parçalarının en çok bellek kullandığını ve belleğin neden geri bırakılmadığını anlamanıza yardımcı olur.
Disk I/O Darboğazları
Yoğun disk okuma/yazma işlemleri de container’ların yavaşlamasına neden olabilir. Özellikle veritabanı işlemleri, loglama veya büyük dosyaların işlenmesi gibi operasyonlar disk I/O’sunu artırabilir. docker stats komutu, disk G/Ç metriklerini de gösterir.
Eğer disk I/O’su yüksekse, sorunun kaynağını bulmak için hangi işlemlerin bu yoğunluğa neden olduğunu belirlemeniz gerekir. Bu, veritabanı sorgularını optimize etmek, loglama seviyelerini ayarlamak veya daha hızlı depolama çözümlerine geçmek gibi adımları içerebilir. Kendi VPS’imde, özellikle yoğun veritabanı operasyonları sırasında disk I/O’sunun arttığını gözlemledim. Bu durumlarda, iotop gibi araçlarla hangi işlemlerin en çok disk kullandığını tespit etmek faydalı oldu.
Ağ Gecikmeleri ve Konfigürasyon Sorunları
Container’lar arasındaki veya container ile dış dünya arasındaki ağ iletişimi de performans sorunlarına yol açabilir. DNS çözümleme sorunları, MTU (Maximum Transmission Unit) uyuşmazlıkları veya yanlış yapılandırılmış ağ köprüleri (bridge networks) gecikmelere neden olabilir.
Ağ sorunlarını teşhis etmek için ping, traceroute gibi standart ağ araçlarını kullanabilirsiniz. Container’ların ağ ayarlarını ve IP adresi çakışmalarını kontrol etmek de önemlidir. Özellikle birden fazla container’ın aynı ağ üzerinde çalıştığı durumlarda, ağ yapılandırmasının doğru yapıldığından emin olmak gerekir.
Kendi VPS’imde Uyguladığım İzleme Stratejileri
Kendi VPS’imde çalıştırdığım container’ların performansını yönetirken, birkaç temel stratejiyi benimsedim. Bu stratejiler, proaktif bir yaklaşım benimsememi ve sorunları erkenden tespit etmemi sağlıyor.
1. Temel Metriklerin Düzenli Takibi
Her gün, docker stats komutunu çalıştırarak çalışan tüm container’larımın temel metriklerini kontrol ederim. CPU, bellek, ağ G/Ç ve disk G/Ç değerlerindeki anormal artışlar veya düşüşler hemen dikkatimi çeker. Bu basit ama etkili yöntem, potansiyel sorunları daha büyümeden fark etmemi sağlıyor.
Ayrıca, systemd servislerinin durumunu da düzenli olarak kontrol ederim. systemctl status <service-name> komutu, servislerin aktif olup olmadığını ve herhangi bir hata mesajı olup olmadığını gösterir.
2. Loglama ve Hata Ayıklama
journald’yi aktif olarak kullanıyorum. Tüm servislerim ve container’larım için detaylı loglama ayarladım. Özellikle kritik servisler için journalctl komutu ile belirli anahtar kelimeleri veya hata kodlarını arayarak logları incelerim. Bu, sorunun kök nedenini bulmak için genellikle en hızlı yoldur.
3. Kaynak Limitlerinin Ayarlanması
Container’larıma uygun kaynak limitleri belirlemek, hem diğer container’ların performansını korumak hem de ana sunucunun kararlılığını sağlamak için önemlidir. --cpus ve --memory gibi parametreleri docker run komutunda veya docker-compose.yml dosyasında dikkatlice ayarlıyorum. Bu limitleri belirlerken, uygulamanın gerçek ihtiyaçlarını göz önünde bulunduruyorum.
4. Otomatik Uyarı Sistemleri
Daha karmaşık sistemler için, Prometheus ve Grafana gibi araçlarla entegre edilmiş otomatik uyarı sistemleri kurmak faydalı olabilir. Bu sistemler, belirli metrikler belirli eşikleri aştığında beni e-posta veya başka bildirim kanallarıyla uyarır. Kendi VPS’imde bu tür bir sistem henüz kurmamış olsam da, daha büyük ölçekli projelerde kesinlikle tercih ettiğim bir yöntemdir.
Sonuç ve Sonraki Adımlar
Kendi VPS’imde Docker container’larının performansını izlemek, sürekli öğrenme ve ayarlama gerektiren bir süreçtir. Bu rehberde paylaştığım yöntemler, temel metrikleri izlemekten logları analiz etmeye ve kaynak limitlerini ayarlamaya kadar geniş bir yelpazeyi kapsıyor.
Bu adımları takip ederek, container’larınızın neden yavaşladığını daha kolay anlayabilir ve performansı optimize edebilirsiniz. Unutmayın ki her sistem benzersizdir ve sizin özel ihtiyaçlarınıza göre bu yöntemleri adapte etmeniz gerekebilir.
Bir sonraki adım, bu izleme verilerini kullanarak uygulamalarınızı daha da optimize etmek ve proaktif olarak performans sorunlarını önlemektir.