Ders 07 / 22
Servis Durumu ve Denetimi
Başlatma, durdurma ve etkinleştirmenin ayrı eksenler olduğu kurulur; arıza döngüsündeki bir birimin durum sözcüğü ile gerçek durumu karşılaştırılır ve altmış çöküşün kaç yoklamada görüldüğü sayılır.
İçindekiler
Önceki ders birim grafiğini kurdu ve grafiğin birim listesinde görünmediğini saydı. Listede görünen tek bilgi vardı: her satırın karşısındaki durum sözcüğü. Altı satırın altısında “çalışıyor” yazıyordu ve bu, listeye bakan için rahatlatıcı bir görüntüydü. Bu ders o sözcüğün ne söylediğini ve neyi söylemediğini ölçer.
Cevap kısa biçimiyle şudur: durum sözcüğü, yöneticinin şu anda birimin sürecini ayakta gördüğünü söyler. Bu bilgi doğrudur ve yanıltıcıdır. Doğrudur, çünkü yönetici gerçekten bir süreç görüyor. Yanıltıcıdır, çünkü gördüğü süreç on saniye önce doğmuş, ondan öncekinin cesedi çoktan kaldırılmış olabilir. Ölçülen şey, “çalışıyor” sözcüğünden çıkarılan sağlıklı tanısının kaç kez yanlış olduğudur.
Etkinleştirme ile Başlatma Ayrı Eksenlerdir
Servis yöneticisinin en çok karıştırılan iki eylemi başlatma ile etkinleştirmedir ve aralarındaki fark bir eksen farkıdır. Başlatma şimdiyi değiştirir: birimin süreci hemen ayağa kaldırılır, sistem yeniden açıldığında bu kararın izi kalmaz. Etkinleştirme geleceği değiştirir: birim bir hedefin altına bağlanır ve o hedefe her ulaşıldığında başlatılır, ama etkinleştirmenin kendisi hiçbir süreç başlatmaz. Durdurma ile etkisizleştirme de aynı biçimde ayrılır.
İki eksen dört bileşim üretir ve dördü de gerçekte görülür. Bir birim etkin ve çalışıyor olabilir: beklenen hâl. Etkin ama çalışmıyor olabilir: açılışta başlatılacak, şu an duruyor. Etkin değil ama çalışıyor olabilir: elle başlatılmış, sistem yeniden açıldığında geri gelmez. Etkin değil ve çalışmıyor olabilir: kapalı. Üçüncü bileşim en pahalı olanıdır, çünkü bugün sorunsuz görünen bir sunucu ilk yeniden açılışta o birimi kaybeder ve kaybın nedeni aylar önce verilmiş bir karardır.
Bu iki ekseni tek satırda gösteren komut, birim durumunu birkaç ayrı alanla basar. Aşağıdaki döküm çalıştırılmamıştır; alanların ne anlattığını göstermek için yazılmış bir örnektir:
$ systemctl status veri-alma.service
* veri-alma.service - Veri alma birimi
Loaded: loaded (/etc/systemd/system/veri-alma.service; enabled)
Active: active (running)
Main PID: <surec numarasi>
Tasks: 3
Loaded alanı birim dosyasının bulunup okunduğunu söyler ve parantez içindeki sözcük
etkinleştirme eksenini taşır. Active alanı şimdiki hâli söyler; parantez içindeki ikinci sözcük
daha ince bir alt durumdur ve servisin kendi yaşam döngüsünden gelir. Bu iki alan birbirinden
bağımsızdır. Birinin değeri diğerini belirlemez, aynı çıktı satırında yan yana durmaları
belirlediklerini düşündürür.
Etkinleştirmenin nasıl çalıştığı bu bağımsızlığı açıklar. Yönetici bir birimi etkinleştirdiğinde yaptığı şey, birim dosyasını bir hedefin “istenenler” dizinine bağlamaktır. Ortada yeni bir süreç yoktur, çalışan hiçbir şey değişmez; yalnız diskte bir bağ oluşur. Bu yüzden etkinleştirme komutu çalışan bir birimi durdurmaz, etkisizleştirme komutu da onu öldürmez. İkisini aynı anda yapmak isteyen operatör iki ayrı komut vermek zorundadır ve bu iki komuttan birini unutmak, üçüncü bileşimin en yaygın üretim yoludur.
Denetim eylemlerinin listesi bu ikisiyle bitmiyor. Yeniden başlatma birimi durdurup başlatır ve süreç kimliği değişir. Yeniden yükleme, süreci öldürmeden yapılandırmayı yeniden okumasını ister; bunu yapabilmek birimin desteklemesine bağlıdır ve desteklemeyen bir birimde komut sessizce yeniden başlatmaya dönüşebilir ya da hiçbir şey yapmaz. Maskeleme ise en sert olanıdır: birim adı boş bir tanıma bağlanır ve birim artık ne elle ne de bir bağımlılık üzerinden başlatılabilir. Maskelenmiş bir birimi başlatmayı deneyen başka bir birim başarısız olur ve hata iletisi maskeyi değil, “birim başlatılamadı”yı söyler. Maskeleme unutulduğunda haftalar sonra anlaşılan bir arıza bırakır.
Komutun Dönmesi Hazır Olmak Değildir
Süreç yönetimi konusunda sonlandırma sinyali için kurulan cümle burada da geçerlidir: komutun dönmesi işin bittiği anlamına gelmez. Başlatma komutu verildiğinde yöneticinin beklediği şey, birimin türüne göre değişir. En yalın birim türünde yönetici programı çalıştırır ve çalıştırma çağrısı başarılı döndüğü anda birimi “başlatıldı” sayar. O anda süreç henüz yapılandırmasını okumamış, dinleme yuvasını açmamış, veritabanı bağlantısını kurmamış olabilir. Komut başarıyla döner, durum “çalışıyor” olur ve servis birkaç saniye daha isteğe cevap veremez.
Bu boşluğu kapatmanın yolu, birimin hazır olduğunu yöneticiye kendisinin bildirmesidir; bildirim
destekleyen birim türlerinde yönetici “başlatıldı” demeden önce bildirimi bekler ve bağımlılık
zincirindeki sonraki birim de o ana kadar başlatılmaz. Bildirim yoksa zincir erken ilerler:
kuyruk, veri-alma daha hazır değilken başlatılır ve ilk denemesinde bağlanamaz. Görünen tabloda
iki birim de “çalışıyor” yazar. Bu boşluk bu derste ölçülmüyor; ölçülen şey arızanın kendisinin
görünmezliği. İkisinin ortak kökü aynı: yöneticinin bildiği tek şey sürecin var olduğudur.
Ölçüm: Arıza Döngüsündeki Birim
Kurgu sunucunun altı birimi, altısı da arızalı hâle sokuluyor: her biri düzenli aralıklarla
çöküyor. Farklı olan tek şey birimlerin yeniden başlatma politikası. veri-alma, kuyruk ve
olcum için politika “her zaman”, isleme için “arızada”, rapor ve yedek için “hayır”.
Gözlem penceresi 600 saniye, çöküş aralığı 10 saniye.
SV11 — gözlem penceresi 600 saniyedir ve bütün süreler modeldeki saniyedir. SV12 — altı birimin altısı da bu pencerede arızalıdır; kâhin bunu bilir. SV13 — yeniden başlatma anlıktır ve başarısız olmaz. SV14 — “hayır” politikalı birim ilk çöküşten sonra durur ve durumu “arızalı” olur. SV15 — yeniden başlatılan birimin durumu “çalışıyor” kalır. SV16 — durum sözcüğünden çıkarılan tanı yalnız iki değer alır: “çalışıyor” görülürse sağlıklı, “arızalı” görülürse arızalı. SV17 — birim her çöküşte 2 saniye ayakta değildir, çöküş anı her dönemde tohumlu üreteçle seçilir. SV18 — yoklama anlıktır ve yoklandığı saniyedeki hâli görür. SV19 — yoklamanın maliyeti yoktur; sistemi yavaşlatmaz ve ölçtüğü şeyi değiştirmez. SV20 — durum sorgusu gecikmesizdir; sorulan saniyedeki gerçek hâli döndürür, araç kendisi yanılmaz.
Son iki varsayım kasıtlı olarak aracın lehinedir. Gerçek bir sistemde yoklamanın kendi maliyeti vardır ve durum sorgusu bir önceki taramanın önbelleğinden dönebilir. Model bunları sıfırlıyor; dolayısıyla aşağıdaki yanlış tanı sayıları, aracın en iyi hâlinde ürettiği alt sınırdır.
TOHUM = 20260218 DONEM = 600 BIRIM = { "veri-alma": {"gerektirir": [], "yeniden": "her zaman"}, "kuyruk": {"gerektirir": ["veri-alma"], "yeniden": "her zaman"}, "isleme": {"gerektirir": ["kuyruk"], "yeniden": "arizada"}, "rapor": {"gerektirir": ["isleme"], "yeniden": "hayir"}, "olcum": {"gerektirir": ["veri-alma"], "yeniden": "her zaman"}, "yedek": {"gerektirir": [], "yeniden": "hayir"}, } def uretec(tohum): d = tohum def sonraki(n): nonlocal d d = (d * 1103515245 + 12345) % 2147483648 return d % n return sonraki def ariza_dongusu(birim, sure=DONEM, aralik=10, birimler=None): """`her zaman` politikasi arizayi gizler: servis hep 'calisiyor' gorunur.""" birimler = BIRIM if birimler is None else birimler p = birimler[birim]["yeniden"] if p == "hayir": return {"politika": p, "yeniden_baslatma": 0, "gorunen_durum": "arizali", "gorunmez_sure": 0} if p == "arizada": return {"politika": p, "yeniden_baslatma": sure // aralik, "gorunen_durum": "calisiyor", "gorunmez_sure": sure} return {"politika": p, "yeniden_baslatma": sure // aralik, "gorunen_durum": "calisiyor", "gorunmez_sure": sure} def olu_araliklar(tohum=TOHUM, sure=DONEM, donem=10, olu=2): """Birim her donemde bir kez cokuyor ve `olu` saniye ayakta degil.""" r = uretec(tohum) return [(t + r(donem - olu + 1), olu) for t in range(0, sure, donem)] def yoklama(araliklar, adim, sure=DONEM): """`adim` saniyede bir durum soran operator.""" bakis = gordu = 0 for t in range(0, sure, adim): bakis += 1 if any(b <= t < b + u for b, u in araliklar): gordu += 1 return {"bakis": bakis, "gordu": gordu, "yanlis": bakis - gordu} print("birim politika yeniden gorunen durum gorunmez sure tani") yanlis_tani = 0 for b in BIRIM: a = ariza_dongusu(b) dogru = a["gorunen_durum"] == "arizali" yanlis_tani += 0 if dogru else 1 print(f" {b:10s} {a['politika']:10s} {a['yeniden_baslatma']:8d}" f" {a['gorunen_durum']:13s} {a['gorunmez_sure']:13d}" f" {'dogru' if dogru else 'YANLIS'}") print(" kahin: 6 birimin 6'si arizali | yanlis tani:", yanlis_tani) print() A = olu_araliklar() print("gercek cokme:", len(A), "| toplam olu saniye:", sum(u for _, u in A)) print("yoklama araligi bakis arizali goren yanlis tani") for adim in (1, 5, 15, 30, 60): y = yoklama(A, adim) print(f" {adim:14d} {y['bakis']:5d} {y['gordu']:13d} {y['yanlis']:11d}")
birim politika yeniden gorunen durum gorunmez sure tani
veri-alma her zaman 60 calisiyor 600 YANLIS
kuyruk her zaman 60 calisiyor 600 YANLIS
isleme arizada 60 calisiyor 600 YANLIS
rapor hayir 0 arizali 0 dogru
olcum her zaman 60 calisiyor 600 YANLIS
yedek hayir 0 arizali 0 dogru
kahin: 6 birimin 6'si arizali | yanlis tani: 4
gercek cokme: 60 | toplam olu saniye: 120
yoklama araligi bakis arizali goren yanlis tani
1 600 120 480
5 120 21 99
15 40 7 33
30 20 2 18
60 10 0 10
Üç Sayı
Kâhin: altı birimin altısı arızalı; “her zaman” politikalı bir birim 600 saniyede 60 kez yeniden başlıyor ve toplam 120 saniye ayakta değil. Araç çıktısı: dört birimin karşısında “çalışıyor”, iki birimin karşısında “arızalı” yazıyor; en sık yoklamada bile arızalı hâl 120 bakışta görülüyor, en seyrek yoklamada 0 bakışta. Yanlış tanı: durum sözcüğünden çıkarılan sağlık tanısı altı birimin 4’ünde yanlış; saniyede bir bakan operatör 480, altmış saniyede bir bakan operatör 10 kez yanlış tanı koyuyor.
Ortak tanımın dördüncü okuması bu tablodadır: yeniden başlatma politikası arızayı gizliyor. “Her zaman” politikalı birim altmış kez ölüp altmış kez dirildiği hâlde durumu hiç değişmiyor; arıza 600 saniye boyunca görünmez kalıyor. Politikası “hayır” olan birim ise ilk çöküşte “arızalı” oluyor ve doğru tanı veriyor. Sonuç ters yönde okunmalı: daha dayanıklı yapılandırılmış birim daha az görünür arıza üretiyor, çünkü dayanıklılık burada görünürlüğün pahasına satın alınmış.
Tablonun en rahatsız edici satırı isleme satırıdır. Politikası “her zaman” değil, “arızada”;
yani sözde daha ölçülü bir seçim yapılmış. Sonuç aynı: 60 yeniden başlatma, “çalışıyor”
durumu, 600 saniye görünmezlik. İki politika arasındaki fark bu koşumda hiç görünmüyor, çünkü
birim hep hatayla çıkıyor. Farkın nerede ortaya çıktığı ve hangi arıza türünün hangi politikada
kaybolduğu bir sonraki dersin ölçüsüdür.
Daha Sık Bakmak Yetmiyor
Yoklama taraması ikinci iddiayı ödüyor. Saniyede bir bakan operatör 600 bakış yapıyor ve bunun 120’sinde arızalı hâli yakalıyor; beş saniyede bir bakan 120 bakışta 21, on beş saniyede bir bakan 40 bakışta 7, otuz saniyede bir bakan 20 bakışta 2, altmış saniyede bir bakan 10 bakışta 0 yakalıyor. Bakış sayısı altmış kat arttığında yakalanan arıza sayısı da artıyor; oranı ise düşüyor. Yakalanan oran saniyelik yoklamada beşte bir, altmış saniyelik yoklamada sıfır.
Sayının böyle davranmasının nedeni, arızanın dar bir pencerede olması. Birim her on saniyede bir çöküyor ve yalnız 2 saniye ayakta değil; geri kalan 8 saniyede yönetici gerçekten çalışan bir süreç görüyor. Yoklama bu 2 saniyelik pencereye rastlamak zorunda. Seyrek bakan operatör yalnız “az görmüyor”, çoğu koşumda hiç görmüyor ve elindeki bütün kanıt “çalışıyor” diyor. Geç bakan az görür.
Buradan çıkan sonuç, yoklama aralığını kısaltmak değildir. Saniyede bir bakmak bile 480 yanlış tanı bırakıyor. Durum sözcüğü, kaç kez sorulursa sorulsun, yeniden başlatma sayısını taşımıyor; taşıyan alan başka. Bir birimin kaç kez yeniden başlatıldığı ve en son ne zaman başladığı yöneticinin ayrı alanlarında durur ve doğru soru budur: “çalışıyor mu” değil, “ne zamandan beri çalışıyor”. Altmış saniyeden kısa bir çalışma süresi, altmış kez yeniden başlamış bir birimin tek görünür izidir.
Aynı komutun tam çıktısı bu alanları zaten basıyor; sorun alanların olmaması değil, gözün ilk satıra takılması. Aşağıdaki döküm çalıştırılmamıştır; arıza döngüsündeki bir birimin çıktısında kanıtın nerede durduğunu göstermek için yazılmıştır:
* kuyruk.service - Kuyruk birimi
Loaded: loaded (/etc/systemd/system/kuyruk.service; enabled)
Active: active (running) since <cok kisa sure once>
Main PID: <surec numarasi>
Status: "hazir"
<zaman damgasi> sunucu systemd[1]: kuyruk.service: Main process exited
<zaman damgasi> sunucu systemd[1]: kuyruk.service: Scheduled restart job
Birinci satır “çalışıyor” diyor, üçüncü satır o çalışmanın ne zamandan beri sürdüğünü söylüyor ve son iki satır sürecin çıktığını, yeniden başlatmanın çizelgelendiğini söylüyor. Üçü aynı çıktıda, üçü de doğru. Yanlış tanı, çıktının eksikliğinden değil, hangi satırın okunduğundan doğuyor. Bir birimin sağlığını “çalışıyor” sözcüğüyle değil çalışma süresiyle okumak, bu dersteki 480 yanlış tanının hepsini ortadan kaldırır; çünkü altmış kez yeniden başlayan bir birimin çalışma süresi hiçbir bakışta on saniyeyi geçmez.
Bu, kursun ikinci iddiasının ters yüzüdür ve iki cümlede toplanabilir. Daha çok çıktı tanıyı düzeltmiyor, çünkü ayırt eden şey satır sayısı değil. Daha az ama doğru alan okumak tanıyı düzeltiyor, çünkü ayırt eden şey ölçünün kendisi.
İkinci Tohum
Çöküş anları tohumlu seçildiği için tablo tohuma bağlı olabilir. Ölçü ikinci tohumla
(20260219) tekrarlandığında yakalanan arıza sayıları şöyle çıkıyor: saniyelik yoklamada iki
tohumda da 120, beş saniyede iki tohumda da 21, on beş saniyede 7 ve 8, otuz
saniyede 2 ve 3, altmış saniyede 0 ve 3. Sık yoklama iki tohumda aynı; seyrek
yoklamada sonuç kurguya bağlıdır ve öyle yazılmalıdır. Altmış saniyelik yoklamanın sıfır
çıkması bu koşuma özgüdür, üç çıkması da öyle. Tohumdan bağımsız olan şey oranın yönü: bakış
seyrekleştikçe yakalanan pay düşüyor ve hiçbir tohumda 120’yi geçmiyor.
Özet
- Etkinleştirme geleceği, başlatma şimdiyi değiştirir; iki eksen dört bileşim üretir ve “etkin değil ama çalışıyor” bileşimi ilk yeniden açılışta kaybedilir.
- Durum çıktısındaki yüklenme, etkinleştirme ve etkinlik alanları birbirinden bağımsızdır; yan yana basılmaları birbirini belirlediklerini düşündürür.
- Arıza döngüsündeki altı birimin altısı arızalıyken 4’ü “çalışıyor” görünüyor: yeniden başlatma politikası arızayı gizliyor.
- “Her zaman” politikalı birim 600 saniyede 60 kez yeniden başlıyor, toplam 120 saniye ayakta değil ve arıza 600 saniye görünmez kalıyor.
- Yoklama sıklaştıkça yakalanan arıza artıyor ama yakalanan oran düşüyor: 1 saniyede 120/600, 60 saniyede 0/10. Saniyelik yoklama bile 480 yanlış tanı bırakıyor.
- Doğru soru “çalışıyor mu” değil “ne zamandan beri çalışıyor”; yeniden başlatma sayısı durum sözcüğünde değil ayrı alanlarda durur.
Sonraki Adım
Bu ders politikanın gizlediğini saydı ama politikayı kimin koyduğuna bakmadı. Politika birim dosyasında tek satırdır ve o satırı yazan kişi genellikle “servis hep ayakta olsun” diye düşünmüştür. Sonraki ders birim dosyasını baştan yazar ve üç politikanın — “hayır”, “arızada”, “her zaman” — hangi arıza türünü gizlediğini dokuz bileşim üzerinde sayar. Aynı derste, gizlemeyi kırmanın yolu olan başlatma sınırı ölçülür: görünmez sürenin 600 saniyeden kaça indiği tablo hâlinde çıkar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.