Windows üzerinde Docker ile çalışan SonarQube taramalarınızın neden bu kadar yavaş ilerlediğini hiç merak ettiniz mi? Ben de aynı sorunu yaşadığımda, çözümün aslında oldukça basit olduğunu fark ettim: WSL 2 sanal makinesinin kaynakları yetersizdi. Bu makalede, Docker Desktop’un arka planda nasıl çalıştığını, kaynak kısıtlamalarını nasıl tespit edeceğinizi ve bu sorunu birkaç satırlık yapılandırma ile nasıl çözeceğinizi adım adım anlatacağım.
Taramaların neden durduğunu anlamak: belirtiler neler?
Orta ölçekli bir kod deposunda SonarQube taraması çalıştırdığımda, sürecin ilk birkaç dakikasında ilerleme yavaşladı ve ardından tamamen durdu. Loglarda açıklayıcı bir "bellek yetersizliği" mesajı görmedim, ancak sistem genelde iyi çalışıyordu. Bu durum, Windows kaynaklarından değil, Docker’ın arka planda çalıştığı WSL 2 sanal makinesinden kaynaklanıyordu.
Kaynak kısıtlamalarını Docker’dan doğrulayın
Docker Desktop, Windows üzerinde bir WSL 2 sanal makinesi (docker-desktop) içinde çalışır. Bu makinenin sahip olduğu kaynaklar, tüm Docker konteynerleri için üst sınırı belirler. WSL 2’nin mevcut kaynaklarını sorgulamak için aşağıdaki komutları kullanabilirsiniz:
wsl -d docker-desktop -- nproc
wsl -d docker-desktop -- free -hBenim sistemimde çıkan sonuçlar oldukça endişe vericiydi:
- 1 CPU çekirdeği
- 1 GB’tan az RAM
- 4 GB swap alanı
Bu durum, Java tabanlı bir araç olan SonarQube’un analiz motorunun bile çalışabilmesi için yetersizdi. Özellikle bellek yoğun işlemler sırasında sistemin swap kullanımına geçmesi, performansı felç ediyordu.
Çözüm: .wslconfig dosyasını düzenleyin
WSL 2, sanal makine ayarlarını %UserProfile%\.wslconfig adlı bir dosyadan okur. Varsayılan olarak bu dosya mevcut değildir; siz oluşturmalısınız. Benim sistemimde kullandığım yapılandırma şu şekildeydi:
[wsl2]
memory=8GB
processors=4
swap=8GBBu üç satırlık ayar, Docker Desktop’un WSL 2 sanal makinesine 4 CPU çekirdeği, 8 GB RAM ve 8 GB swap alanı tahsis etmesini sağladı. Fakat dikkat edilmesi gereken bazı önemli noktalar var:
- Bölüm başlığı `[wsl2]` olmalıdır — büyük/küçük harfe duyarlıdır.
memoryveswapdeğerleri birim içermek zorundadır (GB, MB vb.). Örneğin,swap=4yazarsanız, bu 4 baytı temsil eder — 4 GB değil. Bu tuzağa düşmemek için dikkatli olun.- Eşitlik işaretinin (
=) etrafında boşluk bırakmayın. processorsdeğeri bir tam sayı olmalıdır.
Değişiklikleri uygulamak için adımlar
.wslconfigdosyasınıC:\Users\<KullanıcıAdı>\.wslconfigyoluna kaydedin.- PowerShell’de aşağıdaki komutu çalıştırarak WSL 2 sanal makinesini kapatın:
wsl --shutdown- Docker Desktop’u sistem tepsisinden tamamen kapatın ve yeniden başlatın.
Microsoft’un uyarısı: Değişiklikleri uygulamadan önce, sanal makinenin tamamen kapanmasını sağlamak için birkaç saniye bekleyin. Bunu doğrulamak için şu komutu kullanabilirsiniz:
wsl --list --runningEğer listede hiçbir şey görünmüyorsa, Docker Desktop’u güvenle yeniden başlatabilirsiniz.
Değişikliklerin etkisini doğrulama
Docker Desktop yeniden başlatıldıktan sonra, WSL 2 kaynaklarını tekrar kontrol edin:
PS> wsl -d docker-desktop -- nproc
4
PS> wsl -d docker-desktop -- free -h
total used free shared buff/cache available
Mem: 7.8G 485.8M 6.6G 3.1M 697.7M 7.1G
Swap: 8.0G 0 8.0GSonuçlar, yaptığımız ayarlara tam olarak uyuyordu: 4 CPU çekirdeği, 7.8 GB kullanılabilir RAM (8 GB’ın biraz altında, sistem overhead’ı nedeniyle) ve 8 GB swap alanı. Sonrasında çalıştırdığım SonarQube taraması, normal süresinde tamamlandı.
İsteğe bağlı ek ayarlar: performansı optimize etmek
WSL 2, [wsl2] bölümünde daha fazla ayar sunar. SonarQube gibi bellek yoğun uygulamalar için aşağıdaki seçenekler faydalı olabilir:
[wsl2]
memory=8GB
processors=4
swap=8GB
vmIdleTimeout=60000
[experimental]
autoMemoryReclaim=gradual
sparseVhd=true- `vmIdleTimeout`: 60 saniye boyunca kullanılmayan sanal makineyi otomatik olarak kapatır. Bu sayede Docker kullanmadığınız zamanlarda 8 GB RAM’i boşa harcamamış olursunuz.
- `autoMemoryReclaim=gradual`: Bellek kullanımındaki ani düşüşler yerine, yavaşça Windows’a geri verir. Bu, ani bellek serbest bırakmalarından kaynaklanabilecek performans darbelerini önler.
- `sparseVhd=true`: WSL sanal disklerinin (VHD) sıkıştırılabilir olmasını sağlar. Disk içinde alan boşaltıldığında, fiziksel disk kullanımı da otomatik olarak azalır.
Sık yapılan hatalardan kaçınmak
Bu ayarları uygularken karşılaşabileceğiniz yaygın hatalardan bazıları şunlardır:
- Tüm kaynakları tahsis etmeyin. Fiziksel RAM’in tamamını ya da tüm CPU çekirdeklerini Docker’a ayırmak, Windows’un kendi çalışmasını olumsuz etkileyebilir. Genellikle fiziksel RAM’in %75’i ve birkaç CPU çekirdeği yeterli olacaktır.
- `pageReporting` geçerli bir ayar değildir. Eski blog yazılarında görülen bu ayar, Microsoft’un güncel belgelerinde yer almıyor. WSL, bilinmeyen ayarları görmezden gelir, bu yüzden dosya geçerli görünse de herhangi bir etkisi olmayacaktır.
- Yol ifadelerinde geri eğik çizgileri kaçırmayın. Örneğin,
swapFileya dakerneliçin yol belirtirkenC:\Temp\swap.vhdxşeklinde yazın,C:/Temp/swap.vhdxdeğil. - Docker Desktop’un `docker-desktop` sanal makinesine odaklanın. Kaynakları doğrulamak için
wsl -d docker-desktop -- free -hkomutunu kullanın, yalnızcawsl -- free -hkomutunu değil. İkincisi, varsayılan Linux dağıtımınızın (örneğin Ubuntu) kaynaklarını sorgular ve ayrı bir sanal makinedir.
Özet: hızlı çözüm adımları
Docker Desktop’un WSL 2 üzerinde yavaş çalıştığını düşünüyorsanız, önce sanal makinenin kaynaklarını kontrol edin:
wsl -d docker-desktop -- nproc
wsl -d docker-desktop -- free -hEğer kaynaklar yetersizse, %UserProfile%\.wslconfig yoluna aşağıdaki içeriği ekleyin:
[wsl2]
memory=8GB
processors=4
swap=8GBArdından wsl --shutdown komutunu çalıştırın, Docker Desktop’u yeniden başlatın ve değişiklikleri doğrulayın. Artık SonarQube taramalarınızın normal sürede tamamlandığını göreceksiniz.
Bu basit ama etkili ayarlarla, Docker’ın Windows üzerindeki performansını önemli ölçüde artırabilirsiniz. Unutmayın: WSL 2’nin kaynaklarını doğru ayarlamak, sadece Docker değil, tüm konteyner tabanlı geliştirme süreçleriniz için kritik bir adımdır.
Yapay zeka özeti
SonarQube ve Docker taramalarınız WSL 2 üzerinde yavaş mı ilerliyor? .wslconfig dosyasıyla CPU, RAM ve swap ayarlarını optimize ederek performansı artırın.