Tek VPS'te altı site: RAM'i nereye harcıyorum?
- coolify
- django
- gunicorn
- vps
Projelerimin hepsi tek bir VPS'te, Coolify üzerinde çalışıyor: 1 vCPU, 4 GB RAM ve 48 GB disk. Bir gün baktım, kullanılabilir RAM 750 MB'a düşmüş ve swap de yok. Bellek biraz daha sıkışsa çekirdek bir konteyneri öldürecekti.
Önce ölç
Tahmin yürütmek yerine iki komutla neyin ne kadar yer kapladığına baktım:
docker stats --no-stream --format '{{.Name}}\t{{.MemUsage}}'
ps -eo rss,cmd --sort=-rss | head -20
Çıkan tablo beklediğim gibi değildi. En büyük kalemler şunlardı:
- Arka planda unutulmuş araç oturumları: ~1.1 GB
- 4 gunicorn worker'lı bir Django uygulaması: ~580 MB
- Coolify'ın kendisi: ~440 MB
- Domain'i bile olmayan bir test projesi (web + celery + beat + redis): ~330 MB
Yaptıklarım
1. Worker sayısını CPU'ya göre ayarladım. Gunicorn'un klasik formülü 2 × çekirdek + 1, ama bu formül çekirdek başına yeterli RAM olduğunu varsayıyor. Tek çekirdekli ve RAM'i kısıtlı bir sunucuda, trafiği düşük bir uygulama için 2 worker yeterli. Sayıyı koda gömmek yerine ortam değişkenine bağladım:
exec gunicorn --workers ${GUNICORN_WORKERS:-2} --threads 2 ...
Uygulamanın RAM kullanımı 581 MB'tan 194 MB'a indi.
2. Kullanılmayanı durdurdum. Test aşamasındaki proje Coolify'dan tek tıkla durdu, istediğimde yine tek tıkla açılıyor.
3. Statik olabilecek her şeyi statik yaptım. Bu site önceden Django ile çalışıyordu: veritabanı, admin paneli, 3 worker. İçeriği yılda birkaç kez değişen bir kişisel site için bu fazlaydı. Şimdi Markdown dosyalarından HTML üretiliyor ve nginx ile sunuluyor.
Sonuç
| Önce | Sonra | |
|---|---|---|
| Kullanılan RAM | 3166 MB | ~1900 MB |
| Kullanılabilir RAM | 748 MB | ~2000 MB |
Tek kuruş harcamadan sunucunun nefes alanını ikiye katladım. Sıradaki adım, beklenmedik bir yükte sistemin çökmemesi için küçük bir swap alanı eklemek.