나는 거대한 Mercurial 저장소를 가지고 있습니다. (디렉토리가 얼마나 많은지 추측해보세요. 생각보다 많습니다.) 기본 리포지토리 작업을 수행하는 데 필요한 시간은 다음 예에 표시된 것처럼 시스템 버퍼 캐시가 핫인지 콜드인지에 따라 크게 달라집니다(하나의 명령이 다른 명령으로 실행됨).
bash> time hg status
real 0m41.809s
user 0m0.815s
sys 0m0.217s
bash> time hg status
real 0m0.858s
user 0m0.679s
sys 0m0.175s
며칠 동안(재부팅하지 않고) 머신을 사용하지 않으면 캐시가 차가워지고 다시 실행하는 데 오랜 시간이 걸립니다 hg status
. 디렉터리가 전혀 또는 거의 변경되지 않았지만(mtimes를 확인하여 확인) RAM이 많이 있습니다(페이지 캐시를 세는 것조차 모두 사용되지는 않습니다. 로 확인 free
).
그러면 메모리 부족이 없는데 왜 dentry 또는 inode 캐시에서 항목이 제거됩니까? 어딘가에 최대 크기가 있나요? 흥미롭게도 저는 free
4GB보다 큰 "버퍼" 열을 본 적이 없습니다 . 시스템이 버퍼 캐시가 이 값보다 커지는 것을 거부하는지 확실하지 않습니다.
답변1
디렉터리 탐색에 가장 중요한 캐시는 inode 캐시입니다. 이는 free
표시된 "캐시" 그래프 에 포함되지 않습니다 . 이는 커널 데이터("평평한"). 각 슬래브 풀이 차지하는 메모리 양을 확인할 수 있습니다 /proc/slabinfo
(이에는 루트 액세스가 필요함). 를 slabtop
사용하여 실시간으로 변경되는 것을 확인하거나 다음 코드 조각을 사용하여 각 풀 크기에 대한 보고서를 바이트 단위로 얻을 수 있습니다.
</proc/slabinfo awk '{print $1, $3*$4}' |sort -k2n
일반적인 시스템에서는 inode 캐시에 대한 압력이 밤마다 발생합니다.데이터베이스 갱신일하다. 이를 피할 수 있는 방법을 찾으신다면,알려줘요.
inode 캐시 풀의 크기는 고정되어 있지 않으며 메타데이터 캐시와 데이터 캐시의 비율에 따라 결정됩니다.vm.vfs_cache_pressure
범위. 이것을 시도해 볼 수도 있습니다. 더 낮은 값(기본값은 100)을 사용하여 캐시에 더 많은 항목을 유지하여 야간 크론 작업의 항목이 hg
대체되지 않도록 하거나 더 높은 값을 사용하여 야간 크론 작업의 항목이 대체되지 않도록 합니다. 항목은 대체되지 않습니다. RAM을 오염시키기 위해 남겨졌습니다.
hg status
마지막으로 아침에 크론 작업으로 실행하는 방법이 항상 있습니다.