Özet
footprint [-j path] [-f bytes|formatted|pages] [--sort column] [-p name|pid] [-x name|pid] [-t]
[-s] [-v] [-y] [-w] [--swapped] [--wired] [-a] process-name | pid | memgraph [...]
footprint --sample interval ...
footprint -h, --help
Açıklama
footprint yardımcı programı, belirtilen işlemler (processes) veya bellek grafiği (memory graph) dosyaları için bellek tüketim bilgilerini toplar ve görüntüler.
footprint, belirtilen işlemler tarafından kullanılan tüm adreslenebilir belleği görüntüler, ancak işletim sistemi çekirdeği (kernel) tarafından muhasebe (accounting) amacıyla "dirty" (kirli) olarak kabul edilen belleği vurgular. Birden fazla işlem belirtilirse, footprint çoklu eşlenmiş nesneleri tekilleştirir (de-duplicate) ve paylaşılan nesneleri özel (private) olanlardan ayrı olarak görüntüler. Ayrıca toplam tekilleştirilmiş footprint (ayak izi) özetini de yazdırır. Şu anda footprint, kernel_task adres alanı ile kullanıcı alanı (user space) işlemleri arasında paylaşılan wired (kablolu/kilitli) belleği tekilleştirmez.
footprint, geçerli kullanıcıya ait olmayan işlemler denetlenirken root olarak çalıştırılmalıdır.
İşlemler bir PID, tam işlem adı veya kısmi işlem adı kullanılarak belirtilir. Bellek bilgileri, sağlanan herhangi bir adla eşleşen tüm işlemler için görüntülenecektir.
Seçenekler
-a, --all tüm işlemleri hedefler ve sistem düzeyinde yardımcı verileri raporlar
--sysFootprint sistem düzeyinde yardımcı verileri yazdırır
-j, --json path verilerin JSON gösterimini de belirtilen yola kaydeder
-f, --format bytes|formatted|pages metin çıktısı bayt (bytes), sayfa (pages) veya insan tarafından okunabilir (formatted) biçimde olmalıdır (varsayılan)
--sort column metin çıktısı verilen sütun adına göre sıralanmalıdır, örneğin Dirty (varsayılan), Clean, Category vb.
-p, --proc name belirtilen işlemi adına göre hedefler (birden fazla kez kullanılabilir)
-p, --pid pid belirtilen işlemi PID değerine göre hedefler (birden fazla kez kullanılabilir)
-x, --exclude name/pid belirtilen işlemi adına veya PID değerine göre hariç tutar (birden fazla kez kullanılabilir) ve genellikle bazı işlemleri analizden hariç tutmak için --all ile birlikte kullanılır
-t, --targetChildren sağlanan işlemlere ek olarak, onların alt işlemlerini (children), torun işlemlerini (grandchildren) vb. hedefler
-s, --skip bekleyen XPC işlemleri olmaması nedeniyle sistemin "boşta" (idle) veya "temiz" (clean) olduğunu belirlediği işlemleri atlar.
--minFootprint MiB ayak izi (footprint) sağlanan minimum MiB değerinden az olan işlemleri atlar.
--forkCorpse orijinal işlem yerine hedef işlemin çatallanmış bir cesedini (forked corpse) analiz eder. Cesetler üzerindeki sistem kaynağı sınırları nedeniyle bu argüman --all ile veya birkaç işlemden fazı analiz edilmeye çalışıldığında uyumlu değildir.
-v: tüm bölgeleri ve adres alanı düzeninin vmmap benzeri çıktısını görüntüler. Bu bayrak olmadan, varsayılan çıktı her bir bellek kategorisi için toplamların bir özetidir.
-w, --wide tüm sütunları ve tam yolları içeren geniş çıktıyı gösterir (--swapped --wired seçeneklerini ima eder)
--swapped takas edilmiş/sıkıştırılmış (swapped/compressed) sütununu gösterir
--wired wired (kablolu/kilitli) bellek sütununu gösterir
--vmObjectDirty kirli belleği, pmap aracılığıyla yorumlayan varsayılan davranış yerine, çekirdekteki Sanal Bellek (Virtual Memory - VM) alt sistemi nesneleri tarafından görüldüğü şekliyle yorumlar. Bu mod, top(1) veya Activity Monitor.app gibi diğer araçlarda gösterilenlerle eşleşmeyen bir toplam ayak izi (footprint) hesaplayabilir. Ancak, kirli dosya destekli (file-backed) bellek veya normalde yalnızca onu oluşturan işleme yansıtılan bir işleme eşlenmiş bir VM bölgesi gibi, tasarım gereği varsayılan moda dahil edilmeyen kirli bellek hakkında içgörü sağlayabilir.
--vmObjectDirty modu, macOS 10.15 öncesi sürümlerde varsayılan moddu.
--unmapped hedef işlemlere ait olan ancak onların adres alanlarına eşlenmemiş (mapped) bellek için tüm işlemleri arar (daha fazla ayrıntı için BELLEK MUHASEBESİ [MEMORY ACCOUNTING] bölümündeki tartışmaya bakın)
--sample interval footprint'i örnekleme (sampling) modunda başlatır ve her interval saniyede bir (0.5 gibi ondalıklı olabilir) veri toplar. Metin çıktısı, normal metin çıktısı ile eklenen zaman damgalarının bir birleşimi olacaktır. JSON çıktısı, normalde üst düzeyde bulunacak olan anahtar/değerlerin birçoğunu içeren bir ‘samples’ (örnekler) dizisi barındıracaktır. Diğer tüm komut satırı seçenekleri örnekleme modunda da desteklenir.
--sample-duration duration
--sample ile birleştirildiğinde örnekleme yapılacak saniye sayısı üzerindeki zaman sınırı. Bu bayrak atlandığında veya 0 olarak ayarlandığında, örnekleme
-h, --help yardımı görüntüler ve çıkar
Sütunlar
Parantez içindeki sütun adları, parantez içinde olmayan bir veya daha fazla sütunun alt kümesi olduklarını belirtir.
Dirty Üzerine yazılmış olan ve ne bir dosya tarafından desteklenen ne de geri kazanılabilir (reclaimable) olarak işaretlenen bellek. "(Swapped)" belleği, kalıcı (non-volatile) olarak işaretlenmiş temizlenebilir (purgeable) belleği ve dolaylı olarak üzerine yazılmış (sıfırla doldurulmuş [zero-filled] gibi) belleği içerir. Bir işlemin "ayak izi" (footprint), o işlemle ilişkili tüm Dirty (kirli) belleklerin toplamına eşittir.
(Swapped) Çekirdek tarafından sıkıştırılmış veya depolama alanına takas edilmiş (swapped) Dirty belleğin bir alt kümesidir.
Clean Belirli bir işleme göre ne geri kazanılabilir (reclaimable) ne de kirli (dirty) olan yerleşik (resident) bellek. Yalnızca bir işleme fatura edilen paylaşılan kirli bellek, fatura edilmediği işlem(ler) için bu sütunda görünecektir. Bir işlemin ayak izinden kasıtlı olarak hariç tutulan kirli bellek de burada rapor edilir. Bu durumda Category sütununa ‘(nofootprint)’ eklenir ve Dirty sütunu her zaman sıfır bayt rapor eder. Aşağıdaki nofootprint Bellek bölümüne bakın.
Reclaimable Yeniden kullanım için uygun olduğu açıkça işaretlenmiş yerleşik (resident) bellek. Örneğin bellek, temizlenebilir (purgeable) olduğunda ve geçici (volatile) olarak işaretlendiğinde (temizlenebilir boş [purgeable empty] dahil) veya MADV_FREE ile madvise(2) kullanılarak geri kazanılabilir olarak işaretlenebilir. Geri kazanılabilir bellek, sistem bellek basıncına yanıt olarak herhangi bir zamanda bir işlemden geri alınabilir.
(Wired) Fiziksel RAM'de sabit bir konumda kalması gereken Dirty bellek. Örneğin, bir işlem GPU'yu kullandığında, sürücü grafik dokularını belleğe yerleştirir ve ardından bu belleği GPU ile paylaşır. GPU'nun, CPU üzerinde çalışan VM alt sistemiyle senkronize olmadan bu bellekten bağımsız olarak okuma yapabilmesi gerekir.
Regions Bu girdiye katkıda bulunan VM bölgelerinin sayısı. Görüntüleme amacıyla, paylaşılan önbellek (shared cache) bölgesindeki her bir ikili segment ayrı bir bölge olarak kabul edilir.
Category Bu girdi için açıklayıcı bir ad; örneğin bir VM_MEMORY_* etiketi için insan tarafından okunabilir bir ad, eşlenmiş bir dosyanın yolu veya yüklenmiş bir ikilinin bir segmenti.
BELLEK AYAK İZİNİN ARAŞTIRILMASI
footprint, bir işlemin bellek üzerindeki etkisinin verimli bir şekilde hesaplanmasını ve bu ayak izine katkıda bulunan çeşitli bellek kategorilerinin üst düzey bir özetini sağlar. Sağladığı ayrıntılar, bir incelemede başlangıç noktası olarak kullanılabilir.
Kirli (dirty) belleği azaltmaya öncelik verin. Kirli bellek çekirdek tarafından otomatik olarak geri kazanamaz ve bunun muhasebesi (aşağıda açıklanmıştır), bir işlemin sistem bellek basıncına katkısının bir ölçüsü olarak işletim sisteminin çeşitli bölümleri tarafından doğrudan kullanılır.
Ardından Geri Kazanılabilir (Reclaimable) belleği azaltmaya odaklanın; özellikle kalıcı (non-volatile) olarak işaretlendiğinde kirli hale gelecek olan geçici (volatile) olarak işaretlenmiş temizlenebilir (purgeable) belleğe bakın. Bu bellek çekirdek tarafından düşük maliyetle geri kazanılabilse de, geçici olarak işaretlenmiş temizlenebilir bellek, genellikle bir kullanıcı işleminin yeniden oluşturması pahalı olabilecek verilerin önbelleği (cache) olarak kullanılır: örneğin kodu çözülmüş görüntü verileri.
Clean (temiz) bellek de çekirdek tarafından düşük maliyetle geri kazanılabilir, ancak geri kazanılabilir bellekten farklı olarak genellikle otomatik olarak geri yüklenebilir. Örneğin, dosya destekli (file-backed) bellek kirli olsa bile bellekten otomatik olarak çıkarılabilir (evicted) ve talep üzerine diskten yeniden okunabilir. Çok fazla temiz belleğe sahip olmak yine de bir performans sorunu olabilir, çünkü büyük çalışma kümeleri (working sets), depolamak için hazırda yeterli fiziksel bellek olmadığında bir işlem büyük miktarlarda temiz belleğe erişirken sanal bellek çırpınmasına (thrashing) neden olabilir.
Wired (kilitli) bellek kullanmaktan mümkün olduğunca kaçının: sayfalar halinde dışarı aktarılamaz (paged out), sıkıştırılamaz veya başka bir şekilde geri kazanılamaz.
Bellek Kategorileri
malloc(3) belleği
malloc(3) tarafından ayrılan bellek, genellikle "yığın" (heap) olarak adlandırılan yapıyı oluşturan en yaygın bellek biçimlerinden biridir. Bu belleğin kategorisinin başında ‘MALLOC_’ ön eki bulunacaktır. malloc(3), bir işlem adına VM bölgeleri ayırır; bu bölgelerin içeriği, bir işlemdeki nesneleri ve verileri temsil eden bireysel ayırmalar (allocations) olacaktır. Bir malloc bellek bölgesinde bulunan nesneleri daha ayrıntılı kategorize etmek için heap(1) aracına başvurun veya artık erişilemeyen yığın (heap) belleğinin bir alt kümesini tespit etmek için leaks(1) aracını kullanın.
İkili (binary) segmentler
Yüklenen ikili dosyalar (binaries), çoğunlukla __TEXT, __DATA veya __LINKEDIT segmentleri olmak üzere, hem segment türünü hem de ikili dosyanın yolunu içeren bir girdi olarak görünür. Paylaşılmayan önbellek ikilileri ve __DATA segmentindeki sayfalar (değiştirilmiş genel değişkenleri [global variables] içerenler gibi) sıklıkla kirli (dirty) belleğe sahip olabilir.
Eşlenmiş dosyalar
mmap(2) kullanılarak ayrılan dosya destekli (file-backed) bellek, dosyanın yoluyla birlikte ‘mapped file’ (eşlenmiş dosya) olarak görünecektir.
VM ayırmaları
Diğer birçok bellek türü, bölgeyi hangi alt sistemin ayırdığını belirten bir adla etiketlenebilir (daha fazla bilgi için mmap(2) sayfasına bakın). Örneğin Foundation.framework belleği ayırıp VM_MEMORY_FOUNDATION olarak etiketleyebilir; bu etiket footprint çıktısında ‘Foundation’ olarak görünür. İşlemler, VM_MEMORY_APPLICATION_SPECIFIC_1 - VM_MEMORY_APPLICATION_SPECIFIC_16 aralığında uygun bir etiket kullanarak kendi etiketleriyle bellek ayırabilirler. Önceki kategorilerden birine girmeyen ve açıkça etiketlenmemiş olan bellek, ‘untagged (VM_ALLOCATE)’ (etiketlenmemiş) olarak işaretlenecektir.
malloc ve VM tarafından ayrılan bellek için, belleğin ne zaman ve nerede ayrıldığına ilişkin ayrıntılar genellikle MallocStackLogging etkinleştirilerek ve her ayırma sırasındaki geri izlemeyi (backtrace) görüntülemek için malloc_history(1) kullanılarak elde edilebilir. Xcode.app ve Instruments.app da Xcode'un Memory Graph Debugger'ı (Bellek Grafiği Hata Ayıklayıcısı) gibi bellek hata ayıklaması için görsel araçlar sunar.
vmmap(1), footprint'e benzer bir görünüm sağlar, ancak footprint'in basitleştirilmiş ve daha fazla işlenmiş görünümü yerine çekirdek tarafından döndürülen ham metrikleri görüntülemeye vurgu yapar. Önemli bir fark, vmmap(1) aracının "DIRTY" sütununun, "SWAPPED" sütununda bulunan sıkıştırılmış veya takas edilmiş (swapped) belleği içermemesidir. Ayrıca vmmap(1) yalnızca tek bir işlem üzerinde çalışabilir ve bir malloc bölgesi (zone) özeti gibi ek bilgiler içerir.
Bellek Muhasebesi
Hangi kirli belleğin bir işleme yansıtılması (muhasebeleştirilmesi) gerektiğinin belirlenmesi zor bir sorundur. Bellek, işlemler arasında paylaşılabilir. Bazen bir işlem tarafından diğeri adına ayrılır. Muhasebe nasıl yapılırsa yapılsın, doğruluk genellikle maliyetlidir.
Tarihsel olarak birçok işletim sistemi; sanal boyut (VSIZE) ve yerleşik boyut (RSIZE/RPRVT/RSS/vb.) gibi bellek metriklerini sunmuştur. Bu metrikler kullanışlıdır ancak bir işlemin ihtiyaç duyduğu fiziksel bellek (RAM) miktarının harika göstergeleri değildir. Örneğin, sanal boyut fiziksel bellek gerektirmeyebilecek ayırmaları da içerir ve yerleşik boyut, çekirdek tarafından geri kazanılabilen temiz (clean) ve geçici (volatile) temizlenebilir belleği barındırır (bkz. BELLEK AYAK İZİNİN ARAŞTIRILMASI).
Bir işleme eşlenmiş VM nesneleriyle ilişkili kirli belleği ölçmek daha doğru olabilir. Bu, --vmObjectDirty tarafından benimsenen yaklaşımdır, ancak maliyetlidir ve gerçek zamanlı olarak yapılamaz.
Fiziksel Ayak İzi
Her bir işlemin herhangi bir anda ne kadar RAM kullandığını tahmin etmek için Apple platformları, işlem başına bir çekirdek defteri (ledger) kullanarak "fiziksel ayak izini" (physical footprint) takip eder. Çekirdek, kirli sayfalar işlem adres alanlarına girip çıktıkça (faulted into/removed) bu değeri günceller. Bu defteri sorgulamak düşük maliyetlidir, yeterince doğrudur ve sistem bellek politikalarının uygulanmasına yardımcı olan özellikler sağlar. Tepe bellek miktarını izler, bir işlem bellek sınırını aştığında eylemleri tetikler ve bir işlemi kendisine eşlenmemiş bellek için de ücretlendirebilir (yansıtabilir). top(1) içindeki ‘MEM’ sütunu, Activity Monitor.app içindeki ‘Bellek’ sütunu ve Xcode.app içindeki Bellek Hata Ayıklama Göstergesi (Memory Debug Gauge) gibi diğer teşhis araçlarının çoğu, işlem ayak izi defterindeki değerleri rapor eder.
footprint'in varsayılan çıktısı, defter (ledger) tarafından bildirilen değerle eşleşen kirli belleğin doğru bir dökümünü sağlamaya çalışır. Defter değerinin kendisi de her bir işlem için "Auxiliary data" (Yardımcı veriler) altında phys_footprint olarak rapor edilir.
Ayak izi defterinin tanımı karmaşıktır ve değişebilir. Ağ belleği, grafik belleği vb. gibi birden fazla alt defterden (sub-ledgers) gelen değerleri içerir. Bir bellek ayırma bu alt defterlerden birine kaydedildiğinde footprint, adını Category sütununa ekleyecektir. Örneğin, ‘IOKit (graphics)’ veya ‘Owned physical footprint (unmapped) (media)’.
Sahiplenilmiş Eşlenmemiş Bellek
Atanan ayak izinin bir kısmı bir işlemin adres alanına eşlenmediğinde, footprint bu belleği yalnızca ‘Owned physical footprint (unmapped)’ (Sahiplenilmiş fiziksel ayak izi (eşlenmemiş)) olarak rapor edebilir. Bu bellek başka bir işleme eşlenmişse, aynı VM nesnesinin/nesnelerinin eşlemesi için tüm işlemleri aramak üzere --unmapped bağımsız değişkeni kullanılabilir. Bu diğer işlemleri ve eşlemelerini incelemek genellikle bellek hakkında daha fazla bilgi sağlayacaktır. --all tüm işlemler arasında paylaşılan belleği rapor ettiğinden, dolaylı olarak aynı işlevi gerçekleştirir. --unmapped (veya --all) kullandıktan sonra hala ‘(unmapped)’ olarak listelenen herhangi bir belleğin herhangi bir işleme eşlenmiş olması pek olası değildir ve muhtemelen yalnızca çekirdek veya sürücüler tarafından referans verilmektedir.
nofootprint Belleği
Bazen bir işlem adına kirletilen (dirtied) bellek, kasıtlı olarak onun ayak izinden hariç tutulur. Bunun bir nedeni, bir sistem bileşeninin (belki bir donanım sürücüsünün) bir işlem adına bellek ayırması gerekmesi, ancak işlemin ayırma boyutunu doğrudan kontrol etmemesidir. Bu politika, işlemlerin kendi kontrolleri dışındaki faktörler nedeniyle bellek sınırlarına ulaşmasını önler. Bu bellek hala kirlidir ve kategori adındaki ‘(nofootprint)’ ifadesiyle tanımlanabilir.
kernel_task Belleği
footprint, çekirdek VM etiketine göre dökümü yapılan sistem wired belleğini rapor ederek kernel_task belleğini yaklaşık olarak hesaplar. Bu, footprint'in ‘VM_KERN_MEMORY_MLOCK’ belleğini kernel_task'in tahmini ayak izine dahil etmemesi dışında, zprint(1) tarafından sağlanan bilgiyle aynıdır. Bu yaklaşımın ilk sınırlaması, footprint'in kernel_task'e özel olan hiçbir unwired belleği rapor etmemesidir.
mlock(2) dışı wired bellek bir işlemin ayak izine dahil edildiğinde, footprint bunu hem o işlemde hem de kernel_task'te kirli olarak rapor edecektir. Bu durum ikinci sınırlamaya yol açar: footprint aynı anda bir kullanıcı alanı işlemi ve kernel_task üzerinde raporlama yapıyorsa, rapor edilen Summary (Özet) değeri, VM_KERN_MEMORY_MLOCK dışı wired belleği yanlışlıkla iki kez sayacaktır: bir kez işlem için ve bir kez kernel_task ile ilişkili wired bellek dökümünün bir parçası olarak.
Bu iki sınırlama bir araya geldiğinde, footprint --all ile rapor edilen Summary TOTAL (Özet Toplam) değerini, gerçek toplam kirli belleğe kıyasla oldukça güvenilmez hale getirir. Aşağıda açıklanan "Sistem yardımcı verileri" (System auxiliary data), toplam sistem ayak izinin daha iyi bir ölçüsüdür.
Yardımcı Veriler
footprint, işlemler için aşağıdaki "Yardımcı verileri" (Auxiliary data) rapor eder:
phys_footprint - bir işlemin sahip olduğkin olduğu kirli bellek miktarını izleyen çekirdek defterinin (ledger) mevcut değeri
phys_footprint_peak - işlem başlatıldığından beri phys_footprint'in ulaştığı maksimum değer
‘footprint -a’ aşağıdaki "Sistem yardımcı verilerini" (System auxiliary data) rapor eder:
boot_carveout - çekirdek başlatılmadan önce ayrılan bellek
sys_wired - toplam sistem wired belleği
sys_unwired - toplam kirli unwired bellek
sys_footprint - yukarıdakilerin toplamı
Ayrıca Bakınız
vmmap(1), heap(1), leaks(1), malloc_history(1), vm_stat(1), zprint(1)
OS X 15 Nisan 2022 OS X