메모리 캐시와 버퍼를 덤프하는 방법이나 도구가 있나요?

메모리 캐시와 버퍼를 덤프하는 방법이나 도구가 있나요?

버퍼에 어떤 파일이 로드되어 있는지 확인하고 싶습니다. 명확하게 말하면, 내가 언급하는 버퍼와 캐시는 free -m명령을 실행할 때 표시되는 것입니다.

$ free -m
             total       used       free     shared    buffers     cached
Mem:          7800       7671        128          0        291        724
-/+ buffers/cache:       6655       1144
Swap:         5823        613       5210

답변1

보세요linux-ftools. 이 도구 세트는 버퍼와 캐시를 분석하도록 특별히 설계되었습니다. 여기에는 다음 도구가 포함됩니다.

핀코어

$ fincore [options] files...

  --pages=false      Do not print pages
  --summarize        When comparing multiple files, print a summary report
  --only-cached      Only print stats for files that are actually in cache.

root@xxxxxx:/var/lib/mysql/blogindex# fincore --pages=false --summarize --only-cached * 
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365 
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392 
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached pages=1 , cached size=4096, cached perc=0.497512 
stats for CLUSTER_LOG_2010_05_24.MYI: file size=192512 , total pages=47 , cached pages=1 , cached size=4096, cached perc=2.127660 
...

노트:위의 예제 출력에서는 /var/lib/mysql/blogindex캐시되는 디렉터리의 모든 파일이 표시됩니다. 이 예에는 이라는 이름의 파일이 여러 개 있습니다 CLUSTER_LOG_*.MYI.

멀리 고안하다

SYNTAX: filename mode [offset] [,length]
Where mode can be:

  POSIX_FADV_NORMAL       No further special treatment.  
  POSIX_FADV_RANDOM       Expect random page references.  
  POSIX_FADV_SEQUENTIAL   Expect sequential page references.  
  POSIX_FADV_WILLNEED     Will need these pages.  
  POSIX_FADV_DONTNEED     Dont need these pages.  
  POSIX_FADV_NOREUSE      Data will be accessed once.  

Allows an application to to tell the kernel how it expects to use a file handle,
so that the kernel can choose appropriate read-ahead and caching techniques for
access to the corresponding file. This is similar to the POSIX version of the
madvise system call, but for file access instead of memory access. The
sys_fadvise64() function is obsolete and corresponds to a broken glibc API,
sys_fadvise64_64() is the fixed version. The following are the values for the
advice parameter:

FADV_NORMAL

No special treatment.

FADV_RANDOM

Expect page references in random order.

FADV_SEQUENTIAL

Expect page references in sequential order.

FADV_WILLNEED

Expect access in the near future.

FADV_DONTNEED

Do not expect access in the near future. Subsequent access of pages in this
range will succeed, but will result either in reloading of the memory contents
from the underlying mapped file or zero-fill-in-demand pages for mappings
without an underlying file.

FADV_NOREUSE

Access data only once.

오류 위치

SYNTAX: fallocate file length

fallocate() allows the caller to directly manipulate the allocated disk space
for the file referred to by fd for the byte range starting at offset and
continuing for len bytes.

The mode argument determines the operation to be performed on the given
range. Currently only one flag is supported for mode:

FALLOC_FL_KEEP_SIZE

This flag allocates and initializes to zero the disk space within the range
specified by offset and len. After a successful call, subsequent writes into
this range are guaranteed not to fail because of lack of disk
space. Preallocating zeroed blocks beyond the end of the file is useful for
optimizing append workloads. Preallocating blocks does not change the file size
(as reported by stat(2)) even if it is less than offset+len.

If FALLOC_FL_KEEP_SIZE flag is not specified in mode, the default behavior is
almost same as when this flag is specified. The only difference is that on
success, the file size will be changed if offset + len is greater than the file
size. This default behavior closely resembles the behavior of the
posix_fallocate(3) library function, and is intended as a method of optimally
implementing that function.

Because allocation is done in block size chunks, fallocate() may allocate a
larger range than that which was specified.

버퍼 캐시 지우기

이를 비우려면 이 명령 체인을 사용할 수 있습니다.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

위 명령의 숫자 매개변수를 변경하여 Linux 커널에 캐시된 항목의 측면을 삭제하도록 지시할 수 있습니다.

노트:메모리의 불필요한 것들을 정리합니다(Kernerl 2.6.16 이상). 유용한 콘텐츠를 디스크에 플러시하려면 항상 동기화를 먼저 실행하세요!

  • 페이지 캐시를 비웁니다.

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • dentry 및 inode를 해제합니다.

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • 페이지 캐시, 디렉터리 항목 및 inode를 해제합니다.

    $ echo 3 > /proc/sys/vm/drop_caches
    

위의 내용은 루트로 실행되도록 고안되었습니다. 이를 사용하여 수행하려는 경우 sudo다음과 같이 구문을 약간 변경해야 합니다.

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

위 방법의 대안:

# alternative #1
$ sudo tee /proc/sys/vm/drop_caches <<<1
# alternative #2
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

구문을 변경하는 이유는 무엇입니까? 어떤 이유로 /bin/echo프로그램은 root 로 실행되지만 sudoecho의 출력을 루트 전용 파일로 리디렉션하는 셸은 여전히 ​​사용자로 실행 중입니다. 현재 쉘이 리디렉션을 수행합니다.앞으로 sudo시작.

인용하다

답변2

당신은 또한 시도할 수 있습니다가상 터치

vmtouch opens every file provided on the command line and maps it into virtual memory        
with mmap(2). The mappings are opened read-only. It recursively crawls any directories 
and does the same to all files it finds within them.

With no options, vmtouch will not read from (touch) any memory pages. It will only use 
mincore(2) to determine how many pages of each file are actually resident in memory. 
Before exiting, it will print a summary of the total pages encountered and how many were 
resident.

이를 사용하면 fincore와 유사하게 메모리에 있는 내용을 인쇄할 수 있습니다. 또한 파일을 제거하고 파일을 캐시에 영구적으로 매핑하는 등의 작업을 수행할 수 있습니다.

답변3

echo 2 | sudo tee -a /proc/sys/vm/drop_caches

완벽한 명령

관련 정보