캐시 된 파일을 나열 할 수 있습니까?


29

여기에 출력 free -m:

             total       used       free     shared    buffers     cached
Mem:          7188       6894        294          0        249       5945
-/+ buffers/cache:        698       6489
Swap:            0          0          0

파일 캐싱에 거의 6GB(5945MB)의 메모리 7GB가 사용 된 것을 볼 수 있습니다. 캐시를 비우는 방법을 알고 있습니다. 내 질문은 : 어떤 파일 (또는 inode)이 캐시되고 있는지 볼 수 있습니까?


나는 대답을 모르지만 두 가지가 흥미 롭습니다. 캐시를 어떻게 플러시합니까? 왜 관심, 내가 여기에 아무것도 의미 아니에요된다 - 유스 케이스에만 관심
serverhorror

2
이 모두 플러시 bufferscached: sysctl -w vm.drop_caches=3. 사용하기 전에 자세한 내용을 읽으십시오. 때로는 그저 필요했습니다. 그것의 가능-이것은 또 다른 이유가되어야합니다 :)
ssapkota

많은 사람들이 그것을 요구하고 있습니다 . 몇 가지 이유가 있습니다.
ssapkota 2016 년

일부 I / O 관련 성능 측정을 수행 할 그들을 O / S 캐시가 "버릇"이하지 않으려는 경우 캐시를 삭제하는 것은 편리 온다
더 - wabbit

답변:


25

음, 거기 이다 당신이하는 일이면 커널의 페이지 캐시를 살펴 할 수있는 쉬운 방법 ftools은 - "fincore은"당신에게 파일 '페이지가 캐시의 내용이 무엇인지에 대한 몇 가지 요약 정보를 제공합니다.

페이지 캐시에 파일 이름이 있는지 확인하려면 파일 이름 목록을 제공해야합니다. 커널의 페이지 캐시 테이블에 저장된 정보는 파일 이름이 아닌 데이터 블록 참조 만 포함하기 때문입니다. fincoreinode 데이터를 통해 주어진 파일의 데이터 블록을 해결하고 페이지 캐시 테이블에서 각 항목을 검색합니다.

데이터 블록에 속하는 파일 이름을 얻으려면 파일 시스템에서 모든 inode 및 간접 블록을 읽어야합니다. 페이지 캐시에 저장된 모든 단일 파일 블록에 대해 알아야하는 경우 파일 시스템의 모든 파일 목록을에 제공해야합니다 fincore. 그러나 많은 양의 데이터가 디렉토리를 탐색하고 모든 inode와 간접 블록을 가져 와서 페이지 캐시에 넣고 검사하려는 페이지 캐시 데이터를 제거하기 때문에 측정이 손상 될 수 있습니다.


fincore는 파일이 캐시에 있는지 여부를 알려줍니다. 그러나 캐시 된 모든 파일을 나열하는 도구가 있습니까 (fincore는 파일 이름을 입력 및 검색으로 사용합니다. 현재 캐시 된 모든 항목을 살펴보고 싶습니다)
Joe

@Joe 커널의 페이지 캐시 테이블에 저장된 정보는 파일 이름이 아닌 데이터 블록 참조 만 포함한다고 가정합니다. fincoreinode 데이터를 통해 주어진 파일의 데이터 블록을 해결하고 페이지 캐시 테이블에서 각 항목을 검색합니다. 데이터 블록에 속하는 파일 이름을 얻으려면 파일 시스템에서 모든 inode 및 간접 블록을 읽어야합니다. 따라서 알고리즘 적으로는 fincore이 수준의 정보가 실제로 필요한 경우 파일 시스템의 모든 파일 목록을 제공하는 것이 좋습니다 .
the-wabbit

@ -wabbit 감사합니다. 파일 외에, 디스크립터, 공유 메모리 등과 같은 캐시의 일부인 다른 것들이 있습니다.
Joe

@Joe 불행히도, 나는이 주제에 대해 권위있는 답변을 제공하기 위해 커널 내부에 깊이가 없습니다. 페이지 캐시는 파일 시스템 데이터 블록 이외의 다른 유형의 데이터를 캐시하기에 충분히 일반적인 것처럼 보이지만 예제는 알지 못합니다.
the-wabbit

1
이상 사용되지 않는 답변으로 수행 할 작업 에 대한 StackExchange 입장 은 다소 모호합니다. 수락 된 답변을 삭제하거나 실질적으로 변경하는 것은 눈살을 찌푸리게합니다. vmtouch를 권장하도록이 답변을 변경하면 @ewwhite의 기존 답변이 복제되며 유사한 수의 투표가 있습니다. 따라서 단순히 ewwhite의 답변을 추가로 올리면 트릭을 수행해야합니다.
the-wabbit

19

vmtouch 유틸리티 를 사용하여 명명 된 파일 또는 디렉토리가 캐시에 있는지 확인할 수 있습니다 . 도구를 사용하여 항목을 강제로 캐시하거나 캐시에 고정 할 수도 있습니다.

[root@xt ~]# 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

이제 캐시에 "터치"할 수 있습니다.

[root@xt ~]# 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

이제 얼마나 캐시되어 있는지 확인하려면 ...

[root@xt ~]# 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

3

linux-fincore를 사용하여 캐시 된 파일을 표시하는 매우 간단한 쉘 스크립트를 작성합니다. 캐시는 메모리의 한 부분이기 때문에 내 코드는 프로세스의 상위 10 RSZ 사용법을 찾고 lsof를 사용하여 열린 파일을 찾은 다음 linux-fincore를 사용하여 이러한 파일이 캐시되는지 여부를 찾습니다.

내가 틀렸다고 생각하면 수정 해주세요.

#!/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}

1
캐시에있는 파일 세트는 일반적으로 현재 열려있는 파일의 작은 서브 세트보다 더 클 것입니다 (캐시 공간이 작은 경우 제외). 현재 열려있는 파일이 캐시에있을 가능성이 높습니다 (파일이 유휴 상태이거나 캐시가 최근에 정리되지 않은 경우). 참고 : lsof또한 프로세스 주소 공간에 매핑 된 파일을보고하며 반드시 캐시되지는 않습니다. 또한 파일의 많은 부분이 부분적으로 / 약간 캐시 될 것입니다.
Vlad


2

pcstat 명령을 사용하여 모든 파일과 캐시 상태를 인쇄하는 다음 스크립트를 작성했습니다. x86_64 Linux 시스템 용 자체 포함 스크립트입니다. 필요한 경우 pcstat를 다운로드합니다.

첫 번째 인수는 분석 할 파일 시스템 위치이고 두 번째 인수는 결과 수입니다 (캐시의 페이지 수 기준 상위 N 개).

#!/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}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.