Binary Size: Go Derleme Boyutunu Optimize Etme Yolları

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ı:

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.
Komut:
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. Özellikle net/http veya reflect gibi ağır paketler boyutu artırır.
  • reflect ve fmt: Bu paketler büyük meta-veri tabloları ekler. Çok kritik yerlerde fmt.Printf yerine os.Stdout.Write kullanmak 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.
Komut:
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öntemYaklaşık BoyutDeğişim
Standart go build6.5 MB%100
-ldflags="-s -w"4.2 MB%65
UPX Sıkıştırma1.2 MB%18
Docker (Scratch + Flags)4.2 MB (Toplam İmaj)Çok Düşük

Profesyonel İpucu:​

Hangi paketlerin ne kadar yer kapladığını görmek için şu komutu kullanabilirsiniz:go tool nm -size uygulamam | sort -rn | head -n 20
 
Geri
Üst