GNU/Linux >> Znalost Linux >  >> Linux

Existuje způsob, jak získat poměry Hit/Miss mezipaměti pro bloková zařízení v Linuxu?

Řešení 1:

Můžete si vyvinout svůj vlastní skript SystemTap. Musíte počítat s následujícími dvěma podsystémy:

  • VFS:představuje všechny I/O požadavky před mezipamětí (tj. absolutně každý I/O požadavek); zkontrolujte sondy "vfs.read", "vfs.write" a "kernel.function("vfs_*")"; musíte odfiltrovat bloková zařízení, která chcete monitorovat, podle jejich příslušných hlavních a vedlejších čísel.
  • Blokovat:představuje všechny I/O požadavky odeslané blokovým zařízením před I/O plánovačem (který také sloučí + změní pořadí I/O požadavků); zde víme, které požadavky byly vyrovnávací paměti vynechány; zkontrolujte sondu „ioblock.request“.

Vývoj SystemTap nějakou dobu trvá, než se to naučíte. Pokud jste umírněný vývojář a máte dobré znalosti Linuxu, měli byste mít hotovo za 3–4 dny. Ano, učení vyžaduje čas, ale s výsledky budete velmi spokojeni – SystemTap vám dává možnost (bezpečně) umístit sondy téměř na jakékoli místo v jádře Linuxu.

Všimněte si, že vaše jádro musí podporovat načítání a vyjímání modulů jádra. Většina akciových jader to dnes podporuje. Budete také muset nainstalovat ladicí symboly pro vaše jádro. Pro můj systém Ubuntu to bylo stejně snadné jako stažení souboru .deb o několika stech MB, který pro mě zkompiloval vývojový tým jádra Ubuntu. To je vysvětleno například na stránce Wiki SystemtapOnUbuntu.

P.S. Použijte přístup SystemTap, pouze pokud nemáte žádné jiné řešení, protože je to zcela nový rámec, který se musíte naučit, a to stojí čas/peníze a někdy i frustraci.

Řešení 2:

Pokračoval jsem a napsal k tomu stap skript. Na wiki systemtap je jeden, ale nezdá se, že by byl správný. V základním testování to vypadá docela přesně, ale YMMV.

#! /usr/bin/env stap
global total_bytes, disk_bytes, counter

probe vfs.read.return {
  if (bytes_read>0) {
    if (devname=="N/A") {
    } else {
      total_bytes += bytes_read
    }
  }
}
probe ioblock.request
{
    if (rw == 0 && size > 0)
    {
        if (devname=="N/A") { 
        } else {
          disk_bytes += size
        }
    }

}

# print VFS hits and misses every 5 second, plus the hit rate in %
probe timer.s(5) {
    if (counter%15 == 0) {
        printf ("\n%18s %18s %10s %10s\n", 
            "Cache Reads (KB)", "Disk Reads (KB)", "Miss Rate", "Hit Rate")
    }
    cache_bytes = total_bytes - disk_bytes
    if (cache_bytes < 0)
      cache_bytes = 0
    counter++
    hitrate =  10000 * cache_bytes / (cache_bytes+disk_bytes)
    missrate = 10000 * disk_bytes / (cache_bytes+disk_bytes)
    printf ("%18d %18d %6d.%02d%% %6d.%02d%%\n",
        cache_bytes/1024, disk_bytes/1024,
        missrate/100, missrate%100, hitrate/100, hitrate%100)
    total_bytes = 0
    disk_bytes = 0
}

Řešení 3:

/proc/slabinfo je dobrý začátek, ale neposkytne vám úplně informace, které hledáte (nenechte se zmást procenty hit/miss na systémech s více jádry a povolenými statistikami, to je něco jiného). Pokud vím, neexistuje způsob, jak vytáhnout tyto konkrétní informace z jádra, i když by nemělo být příliš obtížné napsat trochu kódu, který to udělá.

Upravit:http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html

Řešení 4:

Nyní je tu nástroj cachestat z balíčku perf-tools.

Autor také uvádí některé (možná hrubší) alternativy, které lidé používají:

A) Prostudujte míru vynechání mezipaměti stránek pomocí iostat(1) ke sledování čtení disku a předpokládejte, že se jedná o vynechání mezipaměti a ne například O_DIRECT. Míra chyb je obvykle důležitější metrikou než poměr, protože chyby jsou úměrné bolesti při aplikaci. Pro zobrazení velikosti mezipaměti použijte také free(1).

B) Zrušte mezipaměť stránek (echo 1> /proc/sys/vm/drop_caches) a změřte, o kolik se výkon zhorší! Líbí se mi použití negativního experimentu, ale je to samozřejmě bolestivý způsob, jak osvětlit používání mezipaměti.

C) Použijte sar(1) a prostudujte menší a větší chyby. Nemyslím si, že to funguje (např. běžné I/O).

D) Použijte skript cache-hit-rate.stp SystemTap, který je číslo dvě v internetovém hledání poměru přístupů mezipaměti stránek Linuxu. Zajišťuje přístup do mezipaměti vysoko v zásobníku, v rozhraní VFS, takže lze vidět čtení do jakéhokoli souborového systému nebo úložného zařízení. Chyby v mezipaměti jsou měřeny prostřednictvím jejich diskových I/O. To také postrádá některé typy zátěže (některé jsou uvedeny v části „Lekce“ na této stránce) a poměry nazýváme „sazby“.


Linux
  1. Linux – nástroj pro měření kvality entropie?

  2. Získejte zdrojový kód pro jakýkoli příkaz Linux

  3. Existuje způsob, jak se procesy, které nejsou rootem, vázat na privilegované porty v Linuxu?

  1. Existuje způsob, jak získat UID uživatele na počítači se systémem Linux pomocí javy?

  2. Proč neexistuje rozhraní DirectX API pro Linux?

  3. Existuje nějaký způsob, jak získat 64bitový time_t v 32bitových programech v Linuxu?

  1. Existuje způsob, jak zkontrolovat aktuální rpath v Linuxu?

  2. Existuje samostatný Flash Player pro Linux?

  3. Existuje způsob, jak restartovat špatné bloky?