• 29.10.2026 11:20:31
  • İbrahim Gökyar

Bu makale, yazılım eğitimi alan geliştiriciler için CPU, bellek ve I/O darboğazlarını tespit edip düzeltmek için gerçek araçlar, komutlar ve kod değişiklikleri sunar. Py-spy, perf, pprof ve CI entegrasyonu örnekleri içerir.

Profiling, ölçüm ve somut optimizasyon adımları - yazılım eğitimi için pratik

Başlangıç: stabil yük, metrikler ve temel araçlar - yazılım eğitimi

Her performans çalışmasının temeli tekrarlanabilir bir yük senaryosu ve ölçütlerin tanımlanmasıdır. Kullanacağınız araçlar: wrk veya hey (HTTP yükü), perf + FlameGraph (native CPU), py-spy veya scalene (Python), clinic.js (Node). Ölçü akışı: 1) 'baseline' çalışma seti oluşturun, 2) profilleyin, 3) değişiklik yapın, 4) tekrar ölçün ve farkı raporlayın. Örnek baz ölçüm komutları:

wrk -t4 -c200 -d30s http://localhost:8080/path
# Linux native CPU sampling -> flamegraph
perf record -F 99 -g -- ./bin/myserver --config prod.yaml
perf script | ./stackcollapse-perf.pl > out.folded
./flamegraph.pl out.folded > baseline.svg
Bu adımda kesinlikle aynı workload ve aynı veri seti kullanın; p95, p99, throughput ve RSS gibi metrikleri kaydedin.

CPU hotspot izolasyonu: Python örneği, py-spy ve kod değişikliği

Örnek problem: bir HTTP handler içinde her istek için regex derlemek ve veriyi gereksizce kopyalamak CPU maliyetini artırır. Ölçüm aracı: py-spy ile örnekleyici profiler alıp SVG flamegraph üretin ve cProfile ile karşılaştırın. Baseline almak için:

py-spy record -o baseline.svg -- python server.py --port 8080
# Alternatif cProfile run
python -m cProfile -o baseline.prof server.py
Kötü örnek (her istekte regex derleme):
import re
from flask import Flask, request
app = Flask(__name__)
@app.route('/u')
def u():
    pattern = re.compile(r"[A-Z]{3}")
    m = pattern.search(request.args.get('s', ''))
    return m.group(0) if m else 'no'
Düzeltme: regex derlemesini modül seviyesine taşıyın ve hesaplamayı cache'leyin:
import re
from functools import lru_cache
PAT = re.compile(r"[A-Z]{3}")
@lru_cache(maxsize=10000)
def normalize(s):
    # örnek ağır dönüşüm
    return s.strip().lower()
@app.route('/u')
def u():
    s = normalize(request.args.get('s', ''))
    m = PAT.search(s)
    return m.group(0) if m else 'no'
Neden işe yarar: regex derleme CPU ve bellek-allokasyon maliyeti yaratır; lru_cache ile tekrarlı input'larda Python fonksiyon çağrı maliyeti amortize edilir. Değişiklik sonrası yeniden py-spy ile ölçün ve baseline.svg ile yeni.svg'i karşılaştırın; ideal olarak CPU örnek oranları hotspot'ta belirgin düşüş göstermeli.

I/O ve concurrency: Node için backpressure, batch'leme ve clinic.js ile profil

I/O darboğazlarında çözüm genellikle concurrency kontrolü ve batch'leme ile gelir. Node için ölçüm aracı: clinic.js (clinic doctor + flame), ayrıca 0x. Klinik komut örneği:

clinic doctor -- node server.js --port 3000
# sonuçları incelemek için
clinic flame -- node server.js
Örnek değişiklik - sınırlı concurrency promise pool:
function pLimit(concurrency){
  const queue = []
  let active = 0
  const next = () => {
    if(active >= concurrency || queue.length === 0) return
    active++
    const {fn, resolve, reject} = queue.shift()
    fn().then(v => { resolve(v); active--; next(); }).catch(e => { reject(e); active--; next(); })
  }
  return (fn) => new Promise((res, rej) => { queue.push({fn, resolve: res, reject: rej}); next(); })
}
// kullanım
const limit = pLimit(50)
await Promise.all(tasks.map(t => limit(() => fetchUpstream(t))))
Batch'leme örneği: tek tek DB çağrıları yerine 100'lü paketlerle select/insert yapmak I/O tur sayısını düşürür. Ölçüm: clinic ile latency p95/p99 değişimini ve throughput'u karşılaştırın; ayrıca Node'un event loop lag'ini process.hrtime ile ölçün.

Bellek sızıntıları ve heap profili: Go pprof ve Java async-profiler uygulaması

Bellek izleri için Go ve Java tarafında örnek uygulamalar verin. Go: uygulamaya pprof handler ekleyin ve go tool pprof ile heap profili alın. Komutlar:

// main.go içinde
import _ "net/http/pprof"
import "net/http"
func init(){
  go func(){ http.ListenAndServe(":6060", nil) }()
}
# Çalıştırıp profil alma
curl http://localhost:6060/debug/pprof/heap > heap.prof
go tool pprof -http=:8081 ./bin/myapp heap.prof
Java tarafı için async-profiler ile allocation sampling örneği:
# async-profiler dizinindeyken
./profiler.sh -d 30 -e alloc -f heap.svg 
# CPU sampled flame
./profiler.sh -d 30 -e cpu -f cpu.svg 
Sızıntı tespiti: heap.svg veya pprof arayüzünde en çok bellek hold eden tipleri ve stackleri bulun; örnek düzeltme, uzun yaşayan global map'leri slab pool ile değiştirip nesne yeniden kullanımı eklemektir. Ölçüm mantığı: aynı yükle 'RSS ve heap in use' metriklerini baseline ve patched versiyonda karşılaştırın; Go için 'go tool pprof -top' çıktısını kayıt altına alın.

CI entegrasyonu: otomatik perf regresyonu, artefaktlar ve kabul kriterleri

Performans testlerini CI'ye sokarken amaç: deterministik regressiyon uyarısı. GitHub Actions örneği: benchmark çalıştır, p95/p99 hesapla, eğer %10'dan fazla kötüleşme varsa job'u fail et. Basit bir step örneği:

# .github/workflows/perf.yml snippet
- name: Run wrk baseline
  run: wrk -t2 -c50 -d20s http://localhost:8080/endpoint > wrk.baseline.txt
- name: Parse p95
  run: grep 'Latency' wrk.baseline.txt | awk '{print $3}' > p95.baseline
# Yeni commit sonrası
- name: Run wrk current
  run: wrk -t2 -c50 -d20s http://localhost:8080/endpoint > wrk.current.txt
- name: Compare
  run: |
    b=$(cat p95.baseline)
    c=$(grep 'Latency' wrk.current.txt | awk '{print $3}')
    awk -v b=$b -v c=$c 'BEGIN{ if(c/b > 1.1) exit 1 }'
Ayrıca profil artefaktlarını (flamegraph.svg, heap.prof) CI artefaktı olarak upload edin ve PR şablonunda performans değişikliğini belgeleyin. Neden: manuel gönderim hatalarını ve çevresel farklılıkları azaltmak için aynı container görüntüsü ve sabit veritabanı snapshot'u kullanın.

Sık Sorulan Sorular

yazılım eğitimi için Python profilleme nasıl başlatılır?

Hedef metriklerinizi tanımlayın (p95, throughput, RSS). Baseline için py-spy kullanın: py-spy record -o baseline.svg -- python app.py. Ardından optimize edeceğiniz kodu değiştirip tekrar py-spy ile ölçün. Farkı SVG'ler üzerinde görsel olarak karşılaştırın ve cProfile ile doğrulama yapın: python -m cProfile -o out.prof app.py; snakeviz out.prof ile detay inceleyin.

yazılım eğitimi bağlamında CI'de performans regresyon testi nasıl kurulur?

CI job'unda sabit yükü wrk ile çalıştırın, p95 ve throughput'u kaydedin, sonra karşılaştırma yapın. Örnek: wrk -t2 -c50 -d20s http://localhost:8080/endpoint > wrk.out. Eşik belirlemek için geçmiş artifact'lerden ortalama p95'i alın; yeni değerin bu eşiği %10 aşması durumunda job'u fail ettirecek shell kontrolü ekleyin.

yazılım eğitimi sırasında native CPU hotspot'larını nasıl doğrularım?

Linux için perf + FlameGraph en hızlı yoldur. Adımlar: perf record -F99 -g -- ./bin/app; perf script | ./stackcollapse-perf.pl > out.folded; ./flamegraph.pl out.folded > flame.svg. Flamegraph üzerinde en geniş bloklar gerçek CPU tüketen yolları gösterir; bu stack'leri optimize edip tekrar aynı komutlarla karşılaştırma yapın.

AI / LLM Discovery

Bu makale Opendart Akademi Yapay Zeka eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.

Opendart Akademi llms.txt