radix_tree_node의 캐시 크기를 줄이는 방법은 무엇입니까?

radix_tree_node의 캐시 크기를 줄이는 방법은 무엇입니까?

radix_tree_node전체 캐시 크기를 줄이지 않고 Linux에서 캐시에 사용되는 공간을 줄이는 것이 가능합니까?

예를 들어, 나는 현재

$ sudo slabtop -sc --once | awk '{ if (0 + $1  > 0) { printf "%20s: % 6d MB, active %3.0f%%\n", $8, $7 / 1024, (100*$2/$1); } }'
    ext4_inode_cache:  10387 MB, active 100%
              dentry:   2042 MB, active 100%
     radix_tree_node:    263 MB, active  90%
         buffer_head:    117 MB, active 100%
      kmalloc-rcl-64:     92 MB, active 100%
      kmalloc-rcl-96:     79 MB, active 100%
   dmaengine-unmap-2:     43 MB, active 100%
      vm_area_struct:     18 MB, active  99%
         task_struct:     13 MB, active  98%
  ext4_extent_status:     12 MB, active 100%
   ext4_groupinfo_4k:     10 MB, active 100%
         inode_cache:     10 MB, active  90%
          kmalloc-4k:      7 MB, active  99%
     kmalloc-rcl-128:      7 MB, active 100%
   kernfs_node_cache:      5 MB, active 100%
    proc_inode_cache:      5 MB, active  99%

따라서 다른 모든 캐시에는적어도98% 활성이지만 radix_tree_node90%만 활성입니다. 시스템이 메모리를 많이 낭비하지는 않지만, radix_tree_node비활성 캐시를 제거하기 위해 크기를 줄이면 전체 캐시 사용량이 늘어날 것 같습니다. slabtop -sc을 실행했는데 그냥 잘못된 회계라고 생각합니다 USE 0%.radix_tree_node

예를 들어 캐시는 20%에 불과하고 /proc/sys/vm/vfs_cache_pressure둘 다 활성 상태가 100%이므로 줄여야 할 것 같습니다 . 내 작업 부하의 경우 시스템은 많은 수의 디렉터리 항목을 계산해야 합니다.dentryext4_inode_cache

답변1

실험 후에는 Linux 커널 버전 5.4 이상을 실행하고 필요에 따라 조정해야 한다고 말하고 싶습니다 /proc/sys/vm/vfs_cache_pressure. 시스템 속도가 느려지지 않는 가능한 가장 작은 값을 사용하려고 합니다. 내 경험상 vfs_cache_pressure커널 버전 5.3에서는 1~10 범위의 값이 잘 작동하지만 커널 버전 5.4에서는 유사한 동작을 얻으려면 100에 가까운 값이 필요합니다.

값이 낮을수록 vfs_cache_pressure더 많은 디렉터리 메타데이터를 RAM에 보관할 수 있으므로 프로세스가 파일에 액세스할 때 저장 매체는 파일의 실제 내용만 가져오면 됩니다. 이는 랜덤 액세스 속도가 느린 HDD의 경우 특히 중요합니다. 저장소 미디어의 경우 시스템이 여러 수준의 디렉터리를 읽어야 하고 각 디렉터리가 실제 저장소 미디어의 다른 영역에 위치하기 때문에 깊은 디렉터리 계층에 대한 메타데이터를 얻는 것은 무작위 데이터 액세스로 보입니다.

그러나 너무 많이 줄이면 vfs_cache_pressure시스템이 캐시에서 디렉터리 메타데이터를 제거하는 대신 스왑을 시작할 수 있으며 이로 인해 성능이 저하될 수도 있습니다. 저는 이것이 커널 버전 5.3과 5.4의 가장 중요한 차이점이라고 생각합니다. 버전 5.3에서는 시스템이 RAM에 남아 있도록 스왑을 시작하지 않도록 vfs_cache_pressure항상 설정할 수 있습니다. 커널 버전 5.4를 사용하는 시스템의 경우 다음 사항을 알고 있으면 교체가 더 즐거워집니다 .1dentries100

/proc/sys/vm/vfs_cache_pressure와 의 다양한 조합을 벤치마킹 해 봐야 할 것 같습니다 /proc/sys/vm/swappiness. 현재 vfs_cache_pressure120과 swappiness80을 실행하고 있는데 백그라운드 프로세스가 시스템의 많은 디렉터리를 확인할 때 가끔 속도가 느려지는 경우가 있습니다(예: 백업 스크립트가 시스템에서 새 파일을 확인하는 경우). 내 생각에는 시스템이 캐싱을 위해 RAM을 사용하는 현재 방식 dentries은 너무 공격적이며 더 많은 메모리를 요청하는 프로그램은 요청을 처리하기 전에 다른 캐시를 삭제하여 RAM을 확보해야 할 때 속도가 느려집니다.

관련 정보