GNU/Linux >> Znalost Linux >  >> Linux

Je možné vypsat seznam souborů, které jsou v mezipaměti?

Řešení 1:

No, je jednoduchý způsob, jak se podívat na mezipaměť stránek jádra, pokud náhodou máte ftools - "fincore" vám poskytuje souhrnné informace o tom, jaké stránky souborů jsou obsahem mezipaměti.

Budete muset poskytnout seznam názvů souborů, abyste zkontrolovali jejich přítomnost v mezipaměti stránek. Je to proto, že informace uložené v tabulkách mezipaměti stránek jádra budou obsahovat pouze odkazy na datové bloky, nikoli názvy souborů. fincore by vyřešil datové bloky daného souboru prostřednictvím dat inodů a vyhledával příslušné položky v tabulkách mezipaměti stránek.

Neexistuje žádný účinný vyhledávací mechanismus pro opakování – získání názvu souboru náležejícího k datovému bloku by vyžadovalo čtení všech inodů a nepřímých bloků v systému souborů. Pokud potřebujete vědět o blocích každého jednotlivého souboru uloženého v mezipaměti stránek, budete muset zadat seznam všech souborů ve vašem souborovém systému (systémech) do fincore . Ale to opět pravděpodobně zkazí měření, protože velké množství dat by bylo načteno procházením adresářů a získáváním všech inodů a nepřímých bloků – jejich vložením do mezipaměti stránek a vyřazením právě těch dat z mezipaměti stránek, která jste se snažili prozkoumat.

Řešení 2:

Chcete-li zjistit, zda je pojmenovaný soubor nebo adresář v mezipaměti, můžete použít obslužný program vmtouch. Tento nástroj můžete také použít k vynucení položek do mezipaměti nebo k jejich zamknutí do mezipaměti.

[[email protected] ~]# vmtouch -v /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[     ] 0/5

           Files: 1
     Directories: 0
  Resident Pages: 0/5  0/20K  0%
         Elapsed: 0.000215 seconds

Nyní si to mohu „osahat“ do mezipaměti.

[[email protected] ~]# vmtouch -vt /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[OOOOO] 5/5

           Files: 1
     Directories: 0
   Touched Pages: 5 (20K)
         Elapsed: 0.005313 seconds

Nyní se podívejte, kolik je uloženo v mezipaměti...

[[email protected] ~]# vmtouch -v /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[OOOOO] 5/5

           Files: 1
     Directories: 0
  Resident Pages: 5/5  20K/20K  100%
         Elapsed: 0.000241 seconds

Řešení 3:

Píšu velmi jednoduchý skript Shell, který zobrazí soubory uložené v mezipaměti pomocí linux-fincore. Vzhledem k tomu, že mezipaměť je jedna část paměti, můj kód je najít 10 nejlepších využití procesu RSZ a použít lsof ke zjištění souborů, které zpracovávají otevřete, nakonec použijte linux-fincore, abyste zjistili, zda jsou tyto soubory uloženy v mezipaměti nebo ne.

Prosím, opravte mě, pokud se mýlím.

#!/bin/bash
#Author: Shanker
#Time: 2016/06/08

#set -e
#set -u
#you have to install linux-fincore
if [ ! -f /usr/local/bin/linux-fincore ]
then
    echo "You haven't installed linux-fincore yet"
    exit
fi

#find the top 10 processs' cache file
ps -e -o pid,rss|sort -nk2 -r|head -10 |awk '{print $1}'>/tmp/cache.pids
#find all the processs' cache file
#ps -e -o pid>/tmp/cache.pids

if [ -f /tmp/cache.files ]
then
    echo "the cache.files is exist, removing now "
    rm -f /tmp/cache.files
fi

while read line
do
    lsof -p $line 2>/dev/null|awk '{print $9}' >>/tmp/cache.files 
done</tmp/cache.pids


if [ -f /tmp/cache.fincore ]
then
    echo "the cache.fincore is exist, removing now"

    rm -f /tmp/cache.fincore
fi

for i in `cat /tmp/cache.files`
do

    if [ -f $i ]
    then

        echo $i >>/tmp/cache.fincore
    fi
done

linux-fincore -s  `cat /tmp/cache.fincore`

rm -f /tmp/cache.{pids,files,fincore}

Řešení 4:

Můžete také použít pcstat (Page Cache Stat) https://github.com/tobert/pcstat

Doufám, že to někomu pomůže.

Řešení 5:

Napsal jsem následující skript, který vypíše všechny soubory a jejich stav cache pomocí příkazu pcstat. Je to samostatný skript pro x86_64 linuxové systémy. V případě potřeby stáhne pcstat.

První argument je umístění souborového systému, který se má analyzovat, a druhý argument je počet výsledků (Top N podle počtu stránek v mezipaměti).

#!/bin/bash
#Exit if a variable is not set
set -o nounset
#Exit on first error
set -o errexit

if [ $# -eq 0 ]; then
echo "Usage: $0 <root-dir> [number-of-results]"
echo
echo "Example $0 /var 10"
echo "will show top 10 files in /var which are loaded in cache"
exit
fi

ROOT=$1
#Number of results to show
HOW_MANY=50
[ -n ${2-} ] && HOW_MANY=$2


SCRIPT_DIR="$( cd -P "$( dirname "$0" )" && pwd )"
if [ ! -x $SCRIPT_DIR/pcstat ]; then
(
cd $SCRIPT_DIR
rm -f pcstat
curl -L -o pcstat https://github.com/tobert/pcstat/raw/2014-05-02-01/pcstat.x86_64
chmod +x pcstat
)
fi

FIND="find ${ROOT} -not ( -path /proc -prune ) -not ( -path /sys -prune ) -type f -size +0c -print0"
$FIND |  xargs -0 ${SCRIPT_DIR}/pcstat -terse -nohdr | sort --field-separator=, -r -n -k 6 | head -n ${HOW_MANY}

Linux
  1. Jak jsou závorky interpretovány na příkazovém řádku?

  2. Archivace Tar, která přebírá vstup ze seznamu souborů

  3. Máme ručně smazat obsah /tmp?

  1. Odeberte soubory, které jsou uvedeny v textovém souboru

  2. Jak vypsat strom zařízení jádra

  3. Jak odstranit miliony souborů bez narušení serveru

  1. [Linux]:Jak kopírovat soubory/adresáře bez přepsání souborů, které jsou již zkopírovány!

  2. Linux – Jak vyprázdnit vyrovnávací paměti a mezipaměť v systému Linux?

  3. Nástroj pro získání řádků v jednom souboru, které nejsou v jiném?