ZFS의 ARC 카운터는 지속적입니까?

ZFS의 ARC 카운터는 지속적입니까?

자주 액세스되는 데이터가 있고 자주 액세스되지 않는 데이터가 있다고 가정해 보겠습니다. 나는 ARC가 최근에 다른 데이터에 액세스했기 때문에 다른 데이터를 위한 공간을 확보하기 위해 자주 액세스하는 데이터 제거를 중지하는 방법을 결국 학습하게 될 것임을 이해합니다. 꽤 오랫동안 ZFS 시스템을 실행했는데 이 시스템이 이 액세스 패턴을 포착했다고 가정해 보겠습니다.

시스템을 재부팅하고 자주 액세스하는 데이터가 읽기만 되어 ARC에 있는 경우 다른 데이터를 새로 읽으면 해당 데이터가 제거됩니까? 아니면 ZFS는 해당 데이터가 자주 사용된다는 것을 기억합니까?

구현에 따라 달라지는 경우 이 질문은 특히 Solaris와 관련이 있습니다.

답변1

ARC에는 영구 카운터가 없으므로 액세스 패턴을 다시 확인하여 무언가가 자주 사용되는지 확인해야 합니다. 그러나 꽉 찰 때까지 아무것도 제거되지 않습니다/시스템의 다른 것으로 인해 메모리가 부족하므로 처음 부팅할 때모든 것읽거나 쓴 내용은 결국 캐시에 남게 됩니다. 자주 액세스하는 데이터가 그 전에 두 번 읽히는 한 "MFU" 목록에 포함되어야 합니다.

ARC 알고리즘에 대해 자세히 알아볼 수 있습니다.여기. 간단히 말해서 이는 실제로 두 개의 LRU 목록으로 만들어집니다. 하나는 한 번 액세스된 항목("MRU 목록")에 대한 것이고, 다른 하나는 두 번 이상 액세스된 항목("MFU 목록")에 대한 것입니다. 이름이 올바르지 않습니다. LRU가 MFU보다 구현이 더 빠르고 간단하기 때문에 실제로는 LRU를 사용하여 제거합니다. 각 목록에서 최근에 제거된 키(데이터는 아님)를 추적하는 "고스트 목록"도 있는데, 이는 두 캐시가 서로 상대적으로 얼마나 큰지 결정하는 데 도움이 됩니다.

L2ARC는 지속적이지만(일반적으로 SSD에 저장됨) ARC 알고리즘을 사용하지 않습니다(또 다른 차선책 이름). 나는 이것이 단순히 캐시의 데이터를 라운드 로빈한다고 생각합니다. 또한 Nexenta의 OpenZFS 포크를 사용하지 않는 한 재부팅 후에는 이를 재사용할 수 없다고 생각합니다(아직 업스트림에 도달하지 않은 것 같습니다).

Nexenta의 "영구 L2ARC" 기능을 제외하고 이 답변에는 플랫폼별로 관련된 내용이 없습니다.

관련 정보