irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 183
- Tepkime puanı
- 2
- Puanları
- 18
Go ile derlenen binary dosyaları, tüm bağımlılıkları ve çalışma zamanını (runtime) içinde barındırdığı için ("statically linked") başlangıçta büyük görünebilir. Ancak, birkaç basit bayrak ve teknikle bu boyutu %50 ile %80 arasında küçültmek mümkündür.
İşte Go binary boyutunu optimize etmenin en etkili yolları:
Bash
Kullanım:
Bash
Bash
Örnek Dockerfile:
Dockerfile
İşte Go binary boyutunu optimize etmenin en etkili yolları:
1. Sembol Tablolarını ve Hata Ayıklama Bilgilerini Silme
Go derleyicisi, varsayılan olarak panik durumlarında anlamlı hata mesajları verebilmek için hata ayıklama (debug) bilgilerini ve sembol tablolarını binary içine ekler. Production ortamında bunlara genellikle ihtiyacınız olmaz.-s(Omit Symbols): Sembol tablosunu siler.-w(Omit DWARF): DWARF hata ayıklama bilgilerini siler.
Bash
Kod:
go build -ldflags="-s -w" main.go
Sonuç: Bu işlem tek başına binary boyutunu yaklaşık %20-30 oranında azaltır.
2. UPX ile Sıkıştırma (Ultimate Packer for eXecutables)
Binary dosyanız derlendikten sonra, onu UPX gibi bir araçla sıkıştırabilirsiniz. UPX, binary'yi paketler ve çalıştırıldığı anda bellekte açar.Kullanım:
Bash
Kod:
upx --brute uygulamam
- Avantajı: Boyutu inanılmaz derecede (bazen 10MB'tan 2MB'a) düşürür.
- Dezavantajı: Çalışma anında (startup) çok küçük bir gecikme yaratabilir ve bazı antivirüs yazılımları tarafından yanlış alarm (false positive) olarak algılanabilir.
3. Bağımlılık Analizi ve Gereksiz Paketler
Kullandığınız kütüphaneler binary boyutunu doğrudan etkiler. Özelliklenet/http veya reflect gibi ağır paketler boyutu artırır.reflectvefmt: Bu paketler büyük meta-veri tabloları ekler. Çok kritik yerlerdefmt.Printfyerineos.Stdout.Writekullanmak boyutu düşürebilir (ancak bu uç bir örnektir).- CGO: Eğer uygulamanız C kütüphanelerine bağımlı değilse, CGO'yu kapatmak hem taşınabilirliği artırır hem de boyutu küçültür.
Bash
Kod:
CGO_ENABLED=0 go build -ldflags="-s -w" main.go
4. Docker İmaj Boyutunu Küçültme (Multi-Stage Builds)
Eğer uygulamanızı Dockerize ediyorsanız, asıl hedef binary'den ziyade toplam imaj boyutudur. Multi-stage build kullanarak 800MB'lık bir imajı 10MB'ın altına düşürebilirsiniz.Örnek Dockerfile:
Dockerfile
Kod:
# İnşa aşaması
FROM golang:1.24-alpine AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o main .
# Çalıştırma aşaması (En küçük taban)
FROM scratch
COPY --from=builder /app/main /main
ENTRYPOINT ["/main"]
5. Optimizasyon Özeti ve Karşılaştırma
Aşağıdaki tablo, basit bir "Hello World" sunucusunun farklı yöntemlerle elde edilen yaklaşık boyutlarını gösterir:| Yöntem | Yaklaşık Boyut | Değişim |
Standart go build | 6.5 MB | %100 |
-ldflags="-s -w" | 4.2 MB | %65 |
| UPX Sıkıştırma | 1.2 MB | %18 |
| Docker (Scratch + Flags) | 4.2 MB (Toplam İmaj) | Çok Düşük |