Ders 11 / 11
Maliyet ve Küme Boyutlandırma
Bir kümenin kaç işçiyle kurulacağı kararının süre ile toplam iş arasında verildiğinin ve iki sayının ters yönlere gittiğinin sayılması: aynı 2200 satırlık iş bir, iki, dört, sekiz ve on altı işçide süre 2250, 3691, 3179, 2610 ve 1398, toplam iş 2200, 5830, 7414, 8074 ve 8635 verir; süre inerken toplam iş çıkar ve hangisinin ödendiği yazılmadan boyutlandırma kararı verilemez. İkinci işçinin süreyi 2250'den 3691'e çıkarması karıştırmanın doğmasından gelir ve çarpıklığı 1,00 olan iyi bir anahtarda bile 2250'den 2800'e çıkış görülür. İşçi ile sürenin çarpımı 2250'den 22368'e tek yönlü tırmanır, sabit bedel işçi başına sayıldığında on altı işçinin kazancı 852'den 102'ye iner ve ağ bedeli 12'ye çıktığında en kısa süreyi veren kurulum tek işçiye döner. Ders kursun kapanışıdır ve on bir dersin sayılarını tek tabloda toplar.
İçindekiler
Bir önceki ders bedelin beşinci adını yazdı: yeniden hesaplanan satır. Ondan önce taşınan satır, kopya, çarpıklık ve tutulan satır gelmişti. Beş adın altında hep aynı iki sayı duruyordu — bir işin ne kadar sürdüğü ve toplamda ne kadar iş yaptığı. Geriye kursun en sık sorulan sorusu kalıyor: bu küme kaç işçiyle kurulmalı.
Soru masum görünür ve yanıtı yoktur, çünkü eksiktir. Bir kümeyi büyütmek iki sayıyı aynı anda değiştirir ve bunlar ters yönlere gider. Bu ders işçi sayısını birden on altıya süpürür, her adımda ikisini de yazar ve kararın hangi ölçüte, hangi seçime ve hangi bölüşüm anahtarına asılı olduğunu sayar.
- DB53. Kaynak, hat ve dağıtık kurulum kurgudur ve ders içinde üretilir. Hiçbir dağıtık işleme çatısı, küme yöneticisi ya da bulut servisi çağrılmaz. Tohum 20260218.
- DB54. Maliyet muhasebesi yordamı Bulut Bilişim müfredatındaki Bulut Yönetişimi, Güvenlik ve Maliyet kursunda ve Yapay Zekâ Mühendisliği müfredatındaki Model API’leri ile Uygulama Geliştirme kursunda ölçüldü; tekrarlanmaz. Burada maliyet yalnız süre ve toplam iş olarak yazılır; hiçbir para birimi ya da fiyat kullanılmaz.
- DB55. Süre en yüklü işçinin işidir ve bu modelin kendi birimidir, ham milisaniye değildir. Toplam iş bütün işçilerin yaptığı işin toplamıdır.
- DB56.
AG_BEDELI = 3veGOREV_SABIT = 50birer seçimdir; bu dersin sonucu ikisine de duyarlıdır ve aşağıda ikisi de değerleriyle birlikte ele alınır. - DB57.
maliyetsabit bedeli iş başına bir kez sayar; Kaynak Yöneticileri dersi aynı bedeli işçi başına sayar. İki sayım burada yan yana iki sütun olarak yazılır. - DB58. Taban çizgisi tek işçidir: karıştırma yok, çarpıklık 1,00, süre 2250, toplam iş 2200.
İşçi Süpürmesi
İlk blok kaynağı, hattın tüketime kadarki üç aşamasını ve bölüşüm ile maliyet ölçülerini kurar.
Ölçülen iş kursun boyunca kullanılan iştir: satırlar bolge anahtarıyla bölüşülmüş, sonra abone
anahtarına karıştırılıyor.
# KURGUDUR. Olcum aginin sayac okumalari , hattin ilk uc asamasi ve dagitik # kurulum ders icinde uretilir; hicbir dagitik isleme catisi , kume yoneticisi # ya da bulut servisi cagrilmaz. Tohum 20260218. TOHUM, M32 = 20260218, 0xFFFFFFFF def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"] TIP = ["mesken", "isyeri"] DONEM = [f"2026-{a:02d}" for a in range(1, 13)] ABONE = {} for i in range(200): r = uretec(TOHUM + 37 * i) ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)], "baslangic": 10000 + int(r() * 60000)} def kaynak_uret(): kayit = [] for i, (ab, a) in enumerate(ABONE.items()): e = a["baslangic"] for d in DONEM: r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d)) e += 4 + int(r() * 46) kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"], "endeks": e, "birim": "m3"}) return kayit def a1_ayikla(kayit): ZOR = ("abone", "donem", "bolge", "endeks", "birim") tut = [k for k in kayit if all(a in k for a in ZOR)] return tut, len(kayit) - len(tut) def a2_tekille(kayit): gor, tut = set(), [] for k in kayit: ad = (k["abone"], k["donem"]) if ad in gor: continue gor.add(ad) tut.append(k) return tut, len(kayit) - len(tut) def a3_tuketim(kayit): tablo = {(k["abone"], k["donem"]): k for k in kayit} cikti, dusen = [], 0 for k in kayit: i = DONEM.index(k["donem"]) if i == 0: continue onceki = tablo.get((k["abone"], DONEM[i - 1])) if onceki is None: dusen += 1 continue cikti.append(dict(k, m3=int(k["endeks"]) - int(onceki["endeks"]))) return cikti, dusen ISCI, AG_BEDELI, GOREV_SABIT = 4, 3, 50 def satirlar(): v, _ = a1_ayikla(kaynak_uret()) v, _ = a2_tekille(v) v, _ = a3_tuketim(v) return v def izno(m): h = 2166136261 for c in str(m): h = ((h ^ ord(c)) * 16777619) & 0xFFFFFFFF return h def dagit(kayitlar, anahtar, isci=ISCI): kova = {i: [] for i in range(isci)} for k in kayitlar: kova[izno(k[anahtar]) % isci].append(k) return kova def yuk(kova): n = [len(v) for v in kova.values()] return {"toplam": sum(n), "en_yuklu": max(n), "en_az": min(n), "carpiklik": round(max(n) / (sum(n) / len(n)), 4)} def karistir(kova, yeni_anahtar, isci=ISCI): yeni = {i: [] for i in range(isci)} tasinan = 0 for eski, kayitlar in kova.items(): for k in kayitlar: hedef = izno(k[yeni_anahtar]) % isci if hedef != eski: tasinan += 1 yeni[hedef].append(k) return yeni, tasinan def maliyet(kova, tasinan=0, isci=ISCI, ag=AG_BEDELI, sabit=GOREV_SABIT): """Sure = en yuklu iscinin isi (paralel). Toplam is ayrica sayilir.""" n = [len(v) for v in kova.values()] return {"sure": max(n) + tasinan * ag // isci + sabit, "toplam_is": sum(n) + tasinan * ag, "tasinan": tasinan} TUM = satirlar() SAYI = (1, 2, 4, 8, 16) print(f"is {len(TUM)} satir , bolusum anahtari bolge , karistirma aboneye") print("isci carpiklik tasinan sure toplam is isci x sure sure (sabit isci basina)") for i in SAYI: kv = dagit(TUM, "bolge", i) _, t = karistir(kv, "abone", i) m = maliyet(kv, t, i) mb = maliyet(kv, t, i, sabit=i * GOREV_SABIT) print(f"{i:>4} {yuk(kv)['carpiklik']:>9} {t:>7} {m['sure']:>4} {m['toplam_is']:>9}" f" {i * m['sure']:>11} {mb['sure']:>23}")
is 2200 satir , bolusum anahtari bolge , karistirma aboneye isci carpiklik tasinan sure toplam is isci x sure sure (sabit isci basina) 1 1.0 0 2250 2200 2250 2250 2 1.66 1210 3691 5830 7382 3741 4 3.32 1738 3179 7414 12716 3329 8 6.64 1958 2610 8074 20880 2960 16 6.88 2145 1398 8635 22368 2148
Süre sütunu düz inmez: 2250’den 3691’e çıkar, sonra 3179, 2610 ve 1398’e iner. Tek işçinin altına ancak dörtten sonra düşer. Toplam iş sütunu ise hiç geri dönmez: 2200’den 5830’a, 7414’e, 8074’e ve 8635’e tek yönlü tırmanır. Aynı satır kümesi, aynı sonuç, dört kat toplam iş.
İkinci satır kursun ikinci iddiasının en net örneğidir. Tek işçide karıştırma yoktur; ikinci işçi eklendiği anda 1210 satır ağdan geçmek zorunda kalır, toplam iş 2200’den 5830’a sıçrar ve en yüklü işçinin payı hâlâ büyük olduğu için süre de yükselir. Paralellik bedava değildir ve ilk adımı negatiftir.
Son iki sütun kararın nasıl döndüğünü gösterir. İşçi ile sürenin çarpımı — kümeyi iş boyunca
kiralamanın karşılığı — 2250’den 22368‘e hiç inmeden tırmanır; bu ölçüte göre en iyi kurulum tek
işçidir. Sabit bedel işçi başına sayıldığında on altı işçinin süresi 1398’den 2148’e çıkar ve tek
işçiye olan üstünlüğü 852 birimden 102 birime iner. GOREV_SABIT = 50 gibi küçük bir seçim, on
altı katlık bir kurulumun kazancını neredeyse siler.
Karar Neye Asılı
Üç ölçüt üç ayrı yanıt verdi. Sıradaki soru bu yanıtların modeldeki iki seçime ve bölüşüm anahtarına ne kadar bağlı olduğudur. İkinci blok ağ bedelini süpürür, sonra aynı süpürmeyi çarpıklığı olmayan bir anahtarla tekrarlar.
# Bu blok ilk bloktaki TUM , SAYI , dagit , yuk , karistir ve maliyet tanimlarini surdurur. print("ag bedeli " + " ".join(f"{i:>5}" for i in SAYI) + " en kisa sure") for ag in (1, 3, 6, 12): s = [] for i in SAYI: kv = dagit(TUM, "bolge", i) _, t = karistir(kv, "abone", i) s.append(maliyet(kv, t, i, ag=ag)["sure"]) print(f"{ag:>9} " + " ".join(f"{v:>5}" for v in s) + f" {SAYI[s.index(min(s))]:>13}") print("\nbolusum anahtari abone , karistirma doneme") print("isci carpiklik tasinan sure toplam is") for i in SAYI: kv = dagit(TUM, "abone", i) _, t = karistir(kv, "donem", i) m = maliyet(kv, t, i) print(f"{i:>4} {yuk(kv)['carpiklik']:>9} {t:>7} {m['sure']:>4} {m['toplam_is']:>9}")
ag bedeli 1 2 4 8 16 en kisa sure
1 2250 2481 2310 2120 1130 16
3 2250 3691 3179 2610 1398 16
6 2250 5506 4483 3344 1800 16
12 2250 9136 7090 4813 2604 1
bolusum anahtari abone , karistirma doneme
isci carpiklik tasinan sure toplam is
1 1.0 0 2250 2200
2 1.0 1100 2800 5500
4 1.02 1651 1849 7153
8 1.04 1927 1058 7981
16 1.2 2066 602 8398
İlk tablo AG_BEDELI‘nin bir seçim olmasının ne demek olduğunu gösterir. Bedel 1, 3 ve 6’da en kısa
süreyi on altı işçi verir; bedel 12’de kazanan tek işçiye döner, çünkü 2604 sayısı 2250’nin
üstündedir. Ağın yerel işleme oranı bir kez değişince, on altı katlık bir kümenin gerekçesi ortadan
kalkar. Boyutlandırma kararı ölçülen işin değil, ağ ile hesap arasındaki oranın kararıdır ve o
oran yazılmadan sonuç taşınamaz.
İkinci tablo çarpıklığın payını ayırır. abone anahtarında çarpıklık on altı işçiye kadar 1,20’yi
geçmez ve süre 602’ye iner — bolge anahtarındaki 1398’in çok altına. Buna karşılık ikinci
işçinin süreyi yükseltmesi burada da olur: 2250’den 2800’e. Karıştırma iyi bir anahtarla bile
doğar ve ilk adımda kazancından büyüktür. Kursun ikinci iddiası çarpıklığın sonucu değildir;
çarpıklık onu yalnız derinleştirir.
Özet
- Aynı 2200 satırlık iş bir, iki, dört, sekiz ve on altı işçide süre 2250, 3691, 3179, 2610, 1398 ve toplam iş 2200, 5830, 7414, 8074, 8635 verir; süre inerken toplam iş çıkar.
- İkinci işçi süreyi 2250’den 3691’e çıkarır: karıştırma doğar, 1210 satır ağdan geçer ve toplam iş 5830’a sıçrar. Süre tek işçinin altına ancak dört işçiden sonra iner.
- Üç ölçüt üç ayrı kurulum seçer: süre on altı işçiyi, toplam iş tek işçiyi, işçi ile sürenin çarpımı (2250’den 22368’e) yine tek işçiyi. Hangi ölçütün ödendiği yazılmadan karar verilemez.
GOREV_SABIT = 50işçi başına sayıldığında on altı işçinin süresi 2148 olur ve kazanç 852’den 102‘ye iner;AG_BEDELI12’ye çıktığında en kısa süreyi veren kurulum tek işçiye döner.- Çarpıklığı olmayan
aboneanahtarında süre 602’ye kadar iner, ama ikinci işçinin süreyi 2250’den 2800’e çıkarması orada da olur; karıştırmanın ilk adımdaki bedeli çarpıklıktan bağımsızdır.
Kurs Kapanışı
Satırlar ortak birim taşımaz; her satırın hangi ölçütle okunduğu ders adının yanındadır. Parantezdeki fark dağıtık kurulum eksi tek işçilik tabandır; işaretin yönü ölçüt adından okunur.
| Ders | Tek işçilik taban | Dağıtık kurulum | Bedel |
|---|---|---|---|
dagitik-hesaplama/01 — süre ve toplam iş |
tek işçi süre 2250, toplam iş 2200 | dört işçi abone süre 611 (−1639), toplam iş 2200 (0) |
toplam iş dört kurulumda da 2200’dür ve onları birbirinden ayırmaz |
dagitik-hesaplama/02 — yerel okunan blok ve süre |
tek kopya 5/22 yerel, süre 1850 | çoğaltma 3 ile 22/22 (+17), süre 650 (−1200) | saklanan blok 22’den 66’ya çıkar, dördüncü kopya yerelliğe hiçbir şey katmaz |
dagitik-hesaplama/03 — taşınan satır ve toplam iş |
eşleme taşınan 0, toplam iş 2200 | doğrudan indirgeme taşınan 1738 (+1738), toplam iş 7414 (+5214) | ön-indirgeme aynı sonucu 20 ara satır ve 2245 toplam işle verir |
dagitik-hesaplama/04 — okunan satır ve açılan bölüm |
istekli plan 6556 satır, 44 bölüm | tembel plan 200 satır (−6356), 1 bölüm (−43) | plandaki tür hatası ancak ilk eylemde ve 200 satır okunduktan sonra görünür |
dagitik-hesaplama/05 — süre ve ödenen sabit bedel |
tek yuva süre 3000, sabit bedel 800 | on altı yuva süre 215 (−2785), sabit bedel 800 (0) | her göreve bir yuva verilince sekizden on altıya kazanç 121’de kalıp eklenen 400’e yenilir |
dagitik-basarim/01 — taşınan satır ve süre |
abone düzeninde taşınan 0, süre 611 |
bolge’ye karıştırınca taşınan 1738 (+1738), süre 1914 (+1303) |
toplam iş 2200’den 7414’e çıkar; 5214 birimi hiçbir hesap yapmayan saf harekettir |
dagitik-basarim/02 — birleştirme süresi, 4000 satırlık boyut |
yayınlı 5876 | bölümlü 5429 (−447) | kesişme noktası 2980‘dir ve ağ bedeli 6 ile 12’de bölümlü hiçbir boyutta öne geçemez |
dagitik-basarim/03 — çarpıklık ve süre |
tek işçi çarpıklık 1,00, süre 2250 | bolge ile iki işçi çarpıklık 1,66 (+0,66), süre 3691 (+1441) |
on altı işçide çarpıklık 6,88, boş işçi 13; süre 589’un altına hiçbir sayıda inemez |
dagitik-basarim/04 — iki sorgunun toplamı |
önbelleksiz 5500 | önbellekli 3300 (−2200) | önbellek tutulmazsa toplam yine 5500’dür ve tek sorguda kazanç 0’dır |
dagitik-basarim/05 — yeniden hesaplanan satır |
denetim noktası yok 1600 | aralık 3 ile 400 (−1200) | kesin bedel 0’dan 800’e çıkar, oysa aralık 6 da aynı 400’ü verir |
dagitik-basarim/06 — süre ve toplam iş |
tek işçi süre 2250, toplam iş 2200 | on altı işçi süre 1398 (−852), toplam iş 8635 (+6435) | ikinci işçi süreyi 3691’e çıkarır; sabit bedel işçi başına sayılınca kazanç 102’ye iner |
Tablo tek bir kuralın on bir kez yazılmasıdır. Dağıtık bir işin sayısı tek bir sayı değildir: süre
ile toplam iş ayrı ölçülür ve hangisinin ölçüldüğü yazılmayan bir hızlanma iddiası eksiktir. İki
sütunun aynı satırda ters yöne gittiği yerler kuralın kendisidir: dagitik-hesaplama/03‘te süre
düşerken toplam iş 2200’den 7414’e çıkar, bu derste süre 852 birim inerken toplam iş 6435 birim
tırmanır. dagitik-hesaplama/01 bunun aynasını gösterir: dört kurulumun süresi 611 ile 2250
arasında değişirken toplam iş dördünde de 2200’dür, yani yalnız toplam işi yazan bir rapor bu
kurulumların hiçbirini ayırt edemez.
İkinci iddia aynı tablodan okunur: işçi eklemek işi kötüleştirir. dagitik-basarim/03‘te ikinci
işçi süreyi 2250’den 3691’e çıkarır ve toplam işi 5830’a taşır; bu derste aynı adım çarpıklığı 1,00
olan abone anahtarında bile süreyi 2800’e çıkarır. dagitik-hesaplama/05’te sekizden on altı
göreve geçişte kazanılan 121 birim, eklenen 400 birimlik sabit bedele yenilir.
dagitik-hesaplama/02‘de dördüncü kopya saklanan bloğu 88’e çıkarıp yerelliğe hiçbir şey katmaz.
dagitik-basarim/04‘te tek sorgulu bir işte önbellek 2200 satır tutar ve 0 kazandırır,
dagitik-basarim/05‘te aralığı altıdan üçe indirmek kesin bedeli 400’den 800’e çıkarıp kurtarmayı
hiç değiştirmez. Altı derste eklenen kaynak ödenmiş, karşılığı alınmamıştır.
Üçüncü iddia daha sessizdir: sonuç her kurulumda aynıdır. dagitik-hesaplama/03‘te üç kurulumun
sunduğu beş bölge toplamı birebir aynıdır, oysa biri 7414 öbürü 2245 toplam iş harcar.
dagitik-basarim/01‘de süre 611’den 1914’e çıkarken çıktı değişmez, dagitik-basarim/02’de iki
birleştirme stratejisi her boyutta aynı satırları eşleştirir, dagitik-basarim/03’te üç bölüşüm de
bölge toplamlarının aynısını üretir, dagitik-basarim/04’te tutulmayan önbellek sonucu değil yalnız
bedeli değiştirir, dagitik-basarim/05’te tam bir kez sağlandığı sürece dört aralık da aynı sonucu
verir. Doğruluğu sınayan hiçbir denetim yanlış bölüşümü göstermez; yanlış bölüşüm ancak
sayıldığında görünür ve sayılmadığı sürece fatura sessizce büyür.
On bir derste veri bölündü, taşındı, dengelendi, saklandı ve kurtarıldı; yirmi yedi derste ise alındı, dönüştürüldü, depolandı ve sıraya kondu. Bu verinin gittiği yer hiç sorulmadı. Onu besleyen modelin kendisi, aynı veriyle aynı modelin yeniden üretilip üretilemeyeceği ve eğitilen bir modelin üretime nasıl çıkacağı hiçbir derste ölçülmedi. Sonraki kurs hattın çıktısını girdi kabul eder ve bir eğitim koşumunun tekrarlanabilirliğini, sürümlenebilirliğini ve dağıtımını sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.