내 Linux 시스템에 더 많은 메모리를 추가한 후 캐시를 보다 적극적으로 사용하고 싶습니다.
일어난 일은 다음과 같습니다. 컴퓨터를 부팅하고 화장실에 갔다가 돌아와서 로그인했습니다. 로그인하는 데 약 30분 정도 걸립니다. 그런 다음 Firefox를 시작하면 시간이 좀 걸립니다. 로그아웃했다가 다시 로그인하면 캐시가 뜨거워지기 때문에 이 모든 일이 몇 초 내에 발생합니다. 그래서 나는 화장실에 있을 때 이 모든 파일을 캐시에 저장하도록 내 컴퓨터를 어떻게 가르칠 수 있을까 하는 생각을 했습니다.
사전 로드를 조사한 결과 결과가 다소 실망스러운 것으로 나타났습니다. 궁극적인 이유는 mmap()된 파일만 추적하고 read()를 통해 읽은 파일은 추적하지 않기 때문인 것 같습니다.
나는 이것이 mmap()된 파일이 관찰하기 쉽기 때문이라고 생각합니다. 응용 프로그램 mmap()이 파일일 때 잠시 동안 메모리에 남아 있으며 open()-read()-close()는 1초 이내에 발생할 수 있습니다(제가 틀렸다면 정정해 주십시오).
파일을 읽을 때 알림을 받는 쉬운 방법은 없는 것 같습니다. inotifiy가 있지만 디렉터리를 올바르게 등록해야 하며 IIRC가 필요하며 전체 파일 시스템을 모니터링하기 위한 것은 아닙니다.
이상적으로는 일부 응용 프로그램이 읽는 파일 이름을 읽을 수 있는 장치(tty와 같은)를 /dev에 갖고 싶습니다.
(1) 비슷한 것이 있나요?
(2) 이것이 어려운 이유가 있나요?
파일 읽기 액세스에 대한 정보가 있으면 시작 중에 캐시를 쉽게 워밍업할 수 있습니다.
답변1
read
시스템 호출 캐싱 정보:
시스템 read
호출은 다수의 소켓 유형에 적용될 수 있습니다. 따라서 캐싱 논리 자체가 없습니다 read
. 그러나 파일 시스템에서 IO 작업을 수행하는 경우 파일 시스템 자체가 캐싱 기술을 지원할 수 있지만 이는 파일 시스템에 따라 다릅니다.
이는 대용량 파일을 메모리에 매핑하고 해당 파일에서 작동하도록 특별히 설계되었기 mmap
때문에 다릅니다 . mmap
이렇게 한다면 mmap
사용을 고려해 볼 가치가 있습니다 read
.
게시물의 두 번째 부분에서는 정의된 애플리케이션이나 프로세스에서 읽고 있는 파일 목록을 가져오는 방법을 원한다고 말했습니다.
방법은 모르겠지만 System Tap을 사용하면 /dev
정의된 프로세스가 실행 중인 모든 매개변수나 시스템 호출을 read
dmesg로 인쇄하는 커널 모듈을 쉽게 만들 수 있습니다. open
그런 다음 미리 정의된 접두사 같은 것을 이 출력에 추가할 수 있습니다. 그렇게 하면 dmesg | grep <prefix>
설명한 대로 해당 커널 모듈의 모든 출력을 얻을 수 있으며 /dev
장치에서 원하는 결과를 얻을 수 있습니다.
이는 프로덕션에서는 사용해서는 안 되며, 디버깅이나 기타 비프로덕션 목적으로만 사용해야 합니다.
이는 System Tap의 기본 사항에 대한 좋은 가이드이며, 이를 학습한 후에는 실행 파일 이름이나 프로세스 PID만 입력으로 요구하는 System Tap 스크립트를 생성할 수 있어야 합니다. 그런 다음 프로세스나 애플리케이션의 read
모든 호출 또는 시스템 호출의 매개변수를 open
dmesg에 인쇄할 수 있습니다.