나는 애플리케이션이 수명 동안 수행하는 모든 IO 작업을 추적하고 캐싱 효과가 방해를 받지 않기를 원합니다. 심(Shim)을 사용하면 애플리케이션 소스 코드를 변경할 수 없습니다. 성능은 문제가 되지 않습니다. 몇 시간이 걸리더라도 애플리케이션이 수행하는 작업을 기록하고 싶습니다. 궁극적인 목표는 추적을 사용하여 프리페칭과 같은 파일 시스템 관련 경험적 방법을 개선하는 것입니다. 이상적으로 출력은 <filename, offset>과 비슷하지만 그것만으로 충분할 수도 있습니다.
지금까지의 내 생각과 그것이 작동하지 않을 것이라고 생각하는 이유는 다음과 같습니다.
SSD로 전송된 IO와 같은 모든 블록 수준 액세스를 추적합니다. 이를 위해서는 미리 읽기 및 페이지 캐싱을 비활성화해야 합니다. 전자는 쉽게 할 수 있고 후자는 불가능해 보인다. 모든 읽기가 페이지 캐시를 우회한다는 보장이 없기 때문에 X 시간 단위마다 페이지 캐시를 새로 고치는 것은 불가능합니다. 단순히 쓰기 캐싱을 비활성화하는 것만으로는 충분하지 않습니다.
eBPF를 사용하여 다음과 같은 모든 파일 시스템 작업을 추적합니다.이 글은 과연. 여기에는 두 가지 문제가 있습니다. 파일에 대한 첫 번째 요청만 기록되는 것 같습니다(블로그에서: "우리가 구현한 프로브는... 첫 번째 요청 블록의 시간을 식별합니다").
그리고 A 복사본과 판독값이 무엇인지에 대해 블로그에 글을 올렸습니다.여기에는 인쇄 소스가 없습니다 .]2(편집: 표시되지 않는 이유는 내가 읽고 있는 파일이 NFS 드라이브에 있기 때문입니다. 죄송합니다.) BCC 스크립트는 시스템에서 발생하는 일부 IO를 표시하지만touchblk
응용 프로그램의 IO는 인쇄되지 않습니다. 이유나 방법을 모르겠습니다.
편집: 여기에 몇 가지 다른 아이디어가 있지만 아직 구현 방법을 모르겠습니다.
- 항상 페이지를 사용할 수 없는 것으로 표시하여 항상 디스크에서 가져오도록 하세요.
- TLB 중독.
내가 생각을 너무 많이 하는 걸까? 이 작업을 수행하거나 발견한 문제 중 하나를 해결할 수 있다고 생각하지 못한 솔루션이 있습니까?
감사해요!