free, available, buff/cache에 대한 지침과 "free -mh" 명령을 사용하여 서버에서 buff/cache에 의해 저장된 프로세스를 찾는 방법

free, available, buff/cache에 대한 지침과 "free -mh" 명령을 사용하여 서버에서 buff/cache에 의해 저장된 프로세스를 찾는 방법

free -mh에 대한 설명을 다음과 같이 보았습니다.

free는 커널에서 사용하는 버퍼와 캐시뿐만 아니라 시스템에서 사용 가능한 실제 메모리와 스왑 메모리의 총량을 표시합니다. /proc/meminfo를 구문 분석하여 정보를 수집합니다. 표시되는 열은 다음과 같습니다.

   total  Total installed memory (MemTotal and SwapTotal in
          /proc/meminfo)

   used   Used memory (calculated as total - free - buffers - cache)

   free   Unused memory (MemFree and SwapFree in /proc/meminfo)

   shared Memory used (mostly) by tmpfs (Shmem in /proc/meminfo)

   buffers
          Memory used by kernel buffers (Buffers in /proc/meminfo)

   cache  Memory used by the page cache and slabs (Cached and
          SReclaimable in /proc/meminfo)

   buff/cache
          Sum of buffers and cache

   available
          Estimation of how much memory is available for starting
          new applications, without swapping. Unlike the data
          provided by the cache or free fields, this field takes
          into account page cache and also that not all reclaimable
          memory slabs will be reclaimed due to items being in use
          (MemAvailable in /proc/meminfo, available on kernels 3.14,
          emulated on kernels 2.6.27+, otherwise the same as free)

가끔 버퍼/캐시 메모리에 여유 메모리가 할당되는 것을 볼 수 있습니다. 메모리 활용도가 높거나 사용 가능한 메모리가 매우 낮은 경우 "top"을 사용하면 프로세스가 많은 메모리를 차지하고 있음을 알 수 있습니다.

그러나 "여유 메모리"가 충분할 때 "여유 메모리" 중 어떤 메모리가 "버퍼/캐시"에 할당되는지 어떻게 알 수 있습니까? 어느 프로세스에 저장됐는지 확인할 수 있는 방법이 있나요?

root@server_test:~# free -mh
              total        used        free      shared  buff/cache   available
Mem:            29G         24G        359M        398M        4.2G        3.5G
Swap:            0B          0B          0B

감사합니다, 타이토

답변1

내가 이해한 바에 따르면 "유휴"로 표시되는 버퍼/캐시는 메모리가 필요하지 않고 매우 큰 숫자일 수 있습니다.제자리에 있다어떤 프로세스에도. 따라서 이 경우 top 또는 ps에서 볼 수 있듯이 프로세스에 할당된 메모리가 많지 않습니다.

즉, 버프/캐시를 파일 시스템 캐시로 사용할 수 있습니다. 파일(또는 파일의 일부)을 디스크에서 읽을 때(느리게) 데이터는 메모리 캐시에 보관됩니다(빠르게). 나는 OS 커널이 데이터를 캐시에 저장하게 만든 프로세스를 추적하지 않는다고 생각합니다.

예를 들어, 이 이론을 테스트하기 위해 버프/캐시(또는 대부분)를 비운 다음 프로세스(예: cat)가 매우 큰 파일을 읽도록 할 수 있습니다. 프로세스(cat)가 파일 읽기를 마치면 종료되고 프로세스는 더 이상 존재하지 않습니다. 그러나 대략적으로 읽고 있는 파일의 크기만큼 버프/캐시 값이 증가한 것을 확인할 수 있습니다. 따라서 이 경우 cat 프로세스는 해당 데이터를 캐시에 추가하지만 cat 프로세스는 현재 데이터가 (일시적으로) 상주하는 메모리의 캐시 페이지를 "소유"하지 않습니다.

답변2

문제의 프로그램이 자체 제어 그룹에서 실행 중인 경우 아마도 다음을 사용할 수 있습니다.

cd /sys/fs/cgroup
find -name memory.stat -exec grep -HE '^(file|cache) ' | sort -nk 2

캐시된 각 페이지는 하나의 cgroup만 차지한다고 확신합니다. 여러 cgroup이 동일한 페이지 캐시를 사용하는 경우에도 마찬가지입니다.

관련 정보