Ders 06 / 22
Servis Yöneticisi Modeli
Birim, hedef ve bağımlılık kavramları kurulur; birim listesinin verdiği tanı ile bağımlılık çizgesinin verdiği tanı dört ayrıntı düzeyinde karşılaştırılır ve yanlış tanı sayılır.
İçindekiler
Süreç yönetimi konusu tek tek süreçlere baktı: hangisi gerçekten ağır, hangisi sonlandırma isteğine yanıt veriyor, hangisi konulan kaynak sınırına takılıyor. Bir sunucudaki süreçlerin çoğunu ise operatör başlatmaz. Makine açılır, başında kimse yokken onlarca program ayağa kalkar, biri çökerse yerine yenisi konur, sabah bakıldığında her şey yerli yerinde görünür. Bunu yapan şey bir servis yöneticisidir ve yönettiği nesne sürecin kendisi değil, sürecin tanımıdır.
Bu ders o tanımı ve tanımların arasındaki grafiği kurar. Sorusu şudur: yöneticinin bastığı liste, sistemin gerçek yapısını ne kadarıyla gösterir? Liste altı satır basar ve altı satırın hepsi doğrudur. Ölçülen şey, o altı doğru satırdan çıkarılan tanının kaç kez yanlış olduğudur.
Birim, Hedef ve İki Tür Kenar
Servis yöneticisinin yönettiği nesneye birim (service unit) denir. Birim bir metin dosyasıdır: hangi programın hangi kullanıcıyla çalıştırılacağını, çalışmazsa ne yapılacağını ve hangi başka birimlere ihtiyaç duyduğunu söyler. Yönetici bu dosyaları okur, aralarındaki ilişkiyi bir grafiğe çevirir ve grafiği izleyerek süreçleri başlatır. Bu ayrım kursun geri kalanını taşır: birim dosyası diskte durur, süreç bellekte koşar. Dosyayı değiştirmek koşan süreci değiştirmez, süreci öldürmek dosyayı silmez, birim “yüklü” olup hiç çalışmamış olabilir.
Servis dışında başka birim türleri de vardır ve hepsi aynı grafikte durur: takma noktasını temsil eden birim, ağ yuvası dinleyip gelen bağlantıda bir servisi uyandıran birim, zamanlanmış görevi taşıyan birim, bir dosya yolunu gözleyen birim. Bu konu yalnız servis birimlerini ölçer; diğer türler adlandırılır ve geçilir.
Birimleri tek tek saymak yerine öbek olarak anmak gerektiğinde hedef (target) kullanılır. Hedef kendisi bir iş yapmaz, bir süreç başlatmaz; bir isimdir ve altında toplanmış birimleri temsil eder. “Ağ hazır”, “çok kullanıcılı sistem hazır”, “kapanış” gibi aşamalar hedeflerle adlandırılır. Bir hedefe geçmek, altındaki birimleri etkinleştirmek demektir. Hedefin iş yapmaması, bir hedefe “ulaşıldı” bildiriminin ne kadar bilgi taşıdığı sorusunu doğurur; bu soru önyükleme dersinde ölçülür.
Grafikteki kenarlar iki türlüdür ve karıştırılmaları bu dersin ölçtüğü hatadır. Gerektirme kenarı, bir birimin başka bir birim olmadan işe yaramayacağını söyler: gereken birim durursa gerektiren birim de durur. Sıralama kenarı ise yalnız zaman söyler: bu birim şundan sonra başlasın. Sıralama kenarı bağımlılık kurmaz. İki birim arasında sıralama olup gerektirme olmayabilir, gerektirme olup sıralama olmayabilir. Komut adları ve birim dosyası sözdizimi servis yöneticisine ve dağıtıma göre değişir; buradaki model yaygın davranışı anlatır.
Gerektirmenin bir de zayıf biçimi vardır ve adı istemedir: istenen birim başlatılmaya çalışılır, başlatılamazsa isteyen birim yine de çalışmaya devam eder. Zayıf kenar, çökme yayılmasını durdurduğu için yaygın olarak tercih edilir; karşılığında grafikteki bir kenarın kırılmasını sessizleştirir. Kurgu sunucunun grafiğinde zayıf kenar yoktur, çünkü bu dersin ölçtüğü karıştırma sıralama ile gerektirme arasındadır. Üç kenar türünün de aynı ağaçta, aynı biçimde basılması bir sonraki bölümün konusudur.
Süreçlerin birbirinden yalıtılması, kaynak muhasebesinin çekirdek tarafında nasıl tutulduğu ve denetim grubu ile ad alanı mekanizmaları bu kursta anlatılmaz; bunlar M03/K05 Çekirdek Arayüzleri ve İzolasyon kursuna bırakılmıştır. Burada birim, yöneticinin muhasebe defterindeki bir kayıttır.
Yöneticinin grafiğe ihtiyaç duymasının nedeni yalnız muhasebe değildir. Grafik olmadan birimleri
sırayla, birbirini bekleterek başlatmak gerekir; grafikle birlikte, aralarında kenar bulunmayan
birimler aynı anda başlatılabilir. Bu ayrım önyükleme süresini belirler ve 04 dersinde katman
katman sayılır.
Kurgu Sunucunun Birim Grafiği
Kurs boyunca aynı kurgu sunucu kullanılır. Altı birimi vardır: veri-alma dışarıdan veri alır,
kuyruk aldığı veriyi biriktirir, isleme kuyruktan okur, rapor işlenmiş veriden çıktı üretir,
olcum veri alma hattının sayaçlarını toplar, yedek ise kimseye bağlı olmadan çalışır.
SV1 — birim bir tanımdır, çalışan sürecin kendisi değil. SV2 — gerektirme kenarı geçişlidir:
rapor isleme’yi gerektiriyor ve isleme kuyruk’u gerektiriyorsa rapor dolaylı olarak
kuyruk’a da bağlıdır. SV3 — sıralama kenarı geçişli sayılmaz ve bağımlılık üretmez. SV4 —
rapor yalnız yedek’ten sonra başlar ama onu gerektirmez; SV5 — olcum yalnız kuyruk’tan
sonra başlar ama onu gerektirmez. SV6 — grafik döngüsüzdür. SV7 — bir birimi durdurmak,
onu gerektiren bütün birimleri durdurur. SV8 — grafikte zayıf isteme kenarı yoktur; yalnız
gerektirme ve sıralama vardır. SV9 — bütün birimler aynı yöneticiye aittir ve tek makinededir;
uzaktaki bir düğüme uzanan kenar yoktur. SV10 — ölçüm boyunca grafik değişmez; birim dosyası
eklenmez, silinmez ve yeniden okunmaz.
Bu varsayımların sonuncusu gerçek bir sistemde her zaman tutmaz ve tutmadığında ne olduğu ileride ayrıca ele alınır. Ölçünün geri kalanı sabit bir grafiğe dayanır: kâhin, bu grafiğin kendisidir.
Yöneticinin birim listesi grafiği göstermez; birimleri alfabetik sırayla, her birini tek satırda basar. Aşağıdaki döküm bu makinede çalıştırılmamıştır, biçimi göstermek için yazılmış bir örnektir:
UNIT LOAD ACTIVE SUB DESCRIPTION isleme.service loaded active running Isleme birimi kuyruk.service loaded active running Kuyruk birimi olcum.service loaded active running Olcum toplayici rapor.service loaded active running Rapor ureteci veri-alma.service loaded active running Veri alma birimi yedek.service loaded active running Yedek gorevi
Altı satır, altı birim, sıfır kenar. Bu listeye bakan operatörün elindeki tek bilgi hangi birimlerin var olduğudur. “Şu birimi durdurursam ne olur” sorusunun cevabı listede yoktur ve listeden çıkarılamaz.
Grafiği Basan Komut ve Bastığı Yön
Servis yöneticileri bağımlılıkları ağaç biçiminde basan bir komut sunar. Bu komutun iki yönü vardır ve ikisi farklı soruyu cevaplar. Öntanımlı yön aşağı doğrudur: bir birimin çalışmak için neye ihtiyaç duyduğunu gösterir. Ters yön ise yukarı doğrudur: o birime kimlerin ihtiyaç duyduğunu gösterir. Operatörün “bunu durdurursam ne kırılır” sorusunun cevabı yalnız ters yöndedir, oysa parametresiz çağrı aşağı yönü basar. Aşağıdaki iki döküm çalıştırılmamıştır; komutun iki yönünün ne bastığını göstermek için yazılmıştır:
$ systemctl list-dependencies rapor.service rapor.service * +-isleme.service * +-kuyruk.service * +-veri-alma.service $ systemctl list-dependencies --reverse veri-alma.service veri-alma.service * +-kuyruk.service * | +-isleme.service * | +-rapor.service * +-olcum.service
İkinci döküm dört birim listeliyor ve doğru sayı bu. Ama ağaç, gerektirme kenarı ile sıralama kenarını ve zayıf isteme kenarını aynı biçimde basar; hangi satırın hangi tür kenardan geldiği ağacın kendisinden okunmaz. Ağaçta görünen bir birim durduğunda gerçekten duracak mıdır, yoksa yalnız sonra mı başlayacaktır — bunun cevabı birim dosyalarına bakmayı gerektirir. Bir sonraki bölümün ölçtüğü şey tam olarak bu belirsizliğin bedelidir.
Dört Okuma, Dört Tanı
Aynı grafik dört ayrıntı düzeyinde okunabilir. Düz liste yalnız birimleri verir. Doğrudan okuma, her birim için onu doğrudan gerektiren birimleri sayar. Geçişli grafik zinciri sonuna kadar izler. Sıralama dahil okuma ise sıralama kenarlarını da gerektirme sayar. Kâhin, gerektirme kenarları üzerinden hesaplanan geçişli sonuçtur; ölçü, her okumanın kaç birimde bu sonuçtan ayrıldığıdır.
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"}, } SONRA = {"rapor": ["yedek"], "olcum": ["kuyruk"]} # yalniz siralama def bagimli_olanlar(birim, birimler=None): birimler = BIRIM if birimler is None else birimler dogrudan = [a for a, v in birimler.items() if birim in v["gerektirir"]] hepsi = set(dogrudan) for d in dogrudan: hepsi |= bagimli_olanlar(d, birimler) return hepsi def siralamayla(birim): """Siralama kenarini da bagimlilik sayan okuma.""" dogrudan = [a for a, v in BIRIM.items() if birim in v["gerektirir"] or birim in SONRA.get(a, [])] hepsi = set(dogrudan) for d in dogrudan: hepsi |= siralamayla(d) return hepsi kahin = {b: len(bagimli_olanlar(b)) for b in BIRIM} tanilar = { "duz liste": {b: 0 for b in BIRIM}, "dogrudan": {b: sum(1 for v in BIRIM.values() if b in v["gerektirir"]) for b in BIRIM}, "gecisli grafik": dict(kahin), "siralama dahil": {b: len(siralamayla(b)) for b in BIRIM}, } print("birim kahin dogrudan duz liste") for b in BIRIM: print(f" {b:10s} {kahin[b]:5d} {tanilar['dogrudan'][b]:8d}" f" {tanilar['duz liste'][b]:9d}") print(" kahin toplami:", sum(kahin.values())) print() print("okuma cikti satiri yanlis tani") for ad, t in tanilar.items(): yanlis = sum(1 for b in kahin if t[b] != kahin[b]) print(f" {ad:14s} {sum(t.values()):12d} {yanlis:11d}")
birim kahin dogrudan duz liste veri-alma 4 2 0 kuyruk 2 1 0 isleme 1 1 0 rapor 0 0 0 olcum 0 0 0 yedek 0 0 0 kahin toplami: 7 okuma cikti satiri yanlis tani duz liste 0 3 dogrudan 4 2 gecisli grafik 7 0 siralama dahil 9 2
Üç Sayı ve İkinci İddia
Üç sayı yan yana duruyor. Kâhin: grafiğin gerçek durumu, altı birim üzerinden 7 bağımlılık
ilişkisi; veri-alma durursa dördü birden durur. Araç çıktısı: düz liste 0 satır kenar
basıyor, doğrudan okuma 4, geçişli grafik 7, sıralama dahil okuma 9. Yanlış tanı:
düz listede 3, doğrudan okumada 2, geçişli grafikte 0, sıralama dahil okumada yine
2.
Sıralama dahil okuma en çok satırı basıyor ve tanısı geçişli grafikten kötü. Fazladan iki satır,
kuyruk durduğunda olcum’un da duracağını ve yedek durduğunda rapor’un da duracağını
söylüyor; ikisi de yanlış. Bu, kursun ikinci iddiasının ilk ödemesidir: daha çok çıktı daha iyi
tanı demek değildir. Doğru sayıya götüren şey satır sayısı değil, hangi kenar türünün sayıldığı.
Düz listeden çıkan 3 yanlış tanı da aynı yerden geliyor. Liste hiçbir kenar göstermediği için
her birim için “durdurursam yalnız o durur” cevabı üretiliyor; bu cevap veri-alma, kuyruk ve
isleme için yanlış, kalan üçü için tesadüfen doğru. Tesadüf sözcüğü burada gevşek kullanılmıyor:
rapor, olcum ve yedek için cevabın tutmasının nedeni okumanın iyi olması değil, o birimlerin
grafiğin ucunda durmasıdır. Aynı okuma, uçları daha az olan bir grafikte daha çok yanılır.
Tanısı sınanmayan çıktı ölçülmemiş sayılır; liste doğru, listeden çıkarılan sonuç değil.
Doğrudan okumanın 2 yanlışı ise farklı bir kusurdan geliyor. Bu okuma kenarları görüyor ama
zinciri bir adımda kesiyor: veri-alma için 2, gerçek değer 4; kuyruk için 1, gerçek
değer 2. Yanlış yön burada hep aynı, hep eksik sayma. Sıralama dahil okumanın yanlış yönü
ise hep fazla sayma. İki hata türü aynı sütunda toplandığı için sayı eşitlenebiliyor, oysa
işletim sonuçları birbirinin tersi: eksik sayan operatör hazırlıksız yakalanır, fazla sayan
operatör gereksiz iş yapar.
Buradan çıkan çalışma alışkanlığı tek cümleyle yazılabilir: bir birimi durdurmadan önce ters yönlü bağımlılık ağacı okunur ve ağaçtaki her satırın gerektirme mi sıralama mı olduğu birim dosyasından doğrulanır. İki adımdan biri atlandığında hata yönü bellidir. Ağaç okunmazsa eksik sayılır ve beklenmedik birimler durur; ağaç okunup kenar türü doğrulanmazsa fazla sayılır ve gereksiz bakım penceresi açılır. Ölçüde ikisi de yanlış tanı olarak aynı sütuna düşüyor.
Grafik Bir Anlık Kopyadır
Birim dosyaları diskte tek bir dizinde durmaz. Paketin kurduğu tanım bir dizinde, yerel olarak yazılan tanım başka bir dizinde, çalışma zamanında üretilen tanım üçüncü bir dizindedir ve aynı adlı dosya bu dizinler arasında birbirini gölgeler. Gölgelemenin yanında bir de ek parça dosyaları vardır: bunlar dosyanın tamamının yerine geçmez, yalnız birkaç satır ekler ya da tek bir ayarı değiştirir. Sonuçta bir birimin etkin tanımı tek bir dosyada değil, birkaç dosyanın birleşimindedir; hangi satırın nereden geldiğini ancak birleşik tanımı basan komut söyler. Bir birimin dosyasını açıp okumak, o birimin gerçekte hangi ayarlarla çalıştığını görmek anlamına gelmez.
Bundan daha çok tuzağa düşüren ikinci bir gerçek var: yönetici bu dosyaları her komutta yeniden okumaz. Açılışta okur, grafiği belleğe kurar ve o kopyayla çalışır. Diskteki dosyayı değiştirmek bellekteki grafiği değiştirmez; değişiklik ancak yöneticiye yeniden okuması söylendiğinde grafiğe girer. Bu yüzden “dosyayı düzelttim ama davranış değişmedi” gözlemi bir arıza değil, beklenen sonuçtur. Durum çıktısı da bu iki hâli ayırmaz: diskteki dosya ile bellekteki tanım birbirinden farklıyken de birim “çalışıyor” görünür. Kâhin ile araç çıktısı arasındaki fark burada kenar sayısında değil zamanda açılıyor; grafik, diskin bir anlık kopyasıdır ve kopyanın ne zaman alındığı çıktıda yazmaz.
İkinci Tohum
Sayılar tek bir grafiğe bağlı olabilir. Aynı ölçü, tohumlu bir üreteçle kurulan yirmi rastgele altı birimlik grafik üzerinde iki tohumla tekrarlandığında toplam yanlış tanı düz listede 60 ve 69, doğrudan okumada 16 ve 21, geçişli grafikte 0 ve 0, sıralama dahil okumada 52 ve 36 çıkıyor. Büyüklük düzeni korunuyor: geçişli grafik iki tohumda da hatasız, sıralamayı bağımlılık sayan okuma iki tohumda da düz listeye yakın bir hata üretiyor. Tek tek sayılar kurguya bağlıdır; sıralama gerektirme değildir sonucu değildir.
Bir noktanın altı çizilmeye değer. Geçişli grafik okuması iki tohumda da sıfır yanlış tanı veriyor ve bu, kurgunun bir özelliği değil tanımın bir sonucudur: kâhin zaten geçişli kapanışla tanımlanmıştı. Ölçünün anlamı, doğru okumanın hatasız çıkmasında değil, yanlış okumaların büyüklüğünde yatıyor. Kırk grafiğin toplamında yalnız kenar türünü karıştırmanın bedeli seksen sekiz yanlış tanı; aynı kırk grafikte hiç kenar okumamanın bedeli yüz yirmi dokuz. İki sayının birbirine bu kadar yakın olması, sıralama kenarını bağımlılık saymanın grafiği hiç okumamaktan çok daha iyi olmadığını söylüyor.
Özet
- Servis yöneticisinin nesnesi birimdir; birim çalışan süreç değil, sürecin tanımıdır. Hedef birimleri öbekleyen bir addır ve kendisi iş yapmaz.
- Grafikte iki tür kenar vardır: gerektirme kenarı bağımlılık kurar ve geçişlidir, sıralama kenarı yalnız zaman söyler ve bağımlılık kurmaz.
- Kurgu sunucuda altı birim ve 7 bağımlılık ilişkisi var;
veri-almadurursa dört birim daha durur. - Düz birim listesi 0 kenar gösterir ve altı birimin 3’ünde yanlış tanı üretir; doğrudan bağımlılık sütunu bunu 2’ye indirir, geçişli grafik 0’a indirir.
- Sıralama kenarlarını bağımlılık sayan okuma 9 satır basıp yine 2 yanlış tanı verir: en çok çıktıyı basan okuma en iyi tanıyı vermiyor.
- Ad alanı ve denetim grubu bu kursta anlatılmaz; M03/K05 Çekirdek Arayüzleri ve İzolasyon kursuna bırakılmıştır.
Sonraki Adım
Bu ders grafiği kurdu ve grafiğin listede görünmediğini saydı. Sıradaki soru daha da rahatsız edicidir: listede görünen tek şey olan durum sözcüğü ne kadar güvenilir? Bir birimin karşısında “çalışıyor” yazması, o birimin çalıştığı anlamına gelir; sağlıklı olduğu anlamına gelmez. Sonraki ders aynı kurgu sunucuda arıza döngüsüne giren bir birimin durum sözcüğünü ölçer ve altmış çöküşün kaçının hangi bakış aralığında görüldüğünü sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.