디렉토리가 항상 캐시에 있도록 강제

디렉토리가 항상 캐시에 있도록 강제

저는 전체 C++ 프로젝트를 컴파일하는 데 걸리는 시간을 줄이기 위해 다양한 방법을 테스트해 왔습니다. 현재는 5분 정도 소요됩니다. distcc, ccache 등을 시도했습니다. 최근에 전체 프로젝트를 RAM 드라이브에 복사하고 거기에서 컴파일하면 컴파일 시간이 원래 시간의 30%, 단 1.5분으로 단축된다는 사실을 발견했습니다.

분명히 RAM 드라이브에서 작업하는 것은 비현실적입니다. 그럼 내가 어떤 방법을 사용할 수 있는지 아는 사람 있나요?운영 체제가 항상 디렉토리를 캐시하도록 강제? 나는 여전히 디렉터리가 평소처럼 디스크에 다시 동기화되기를 원하지만, 항상 데이터의 메모리 내 복사본을 원합니다. 가능합니까?

편집하다: 가능한 해결책으로 우리는 rsync디스크 드라이브를 RAM 드라이브와 동기화하기 위해 10초마다 실행되는 데몬 프로세스를 시작하는 것을 생각했습니다. 그런 다음 RAM 드라이브에서 컴파일을 실행합니다. 매우 빠르지 rsync만 실제로 작동합니까? 물론 OS가 더 좋을 수도 있지만..

답변1

캐시에 많은 파일을 보관하는 확실한 방법은 해당 파일에 자주 액세스하는 것입니다. Linux는 스왑과 캐시 사이를 조정하는 데 매우 능숙하므로 관찰한 속도 차이는 실제로 OS가 캐시에 항목을 보관하지 않기 때문이 아니라 tmpfs 사용과 다른 시도 간의 다른 차이점으로 인한 것 같습니다.

각 경우에 어떤 IO가 수행되고 있는지 관찰해 보십시오. 기본 도구는 다음과 같습니다.iotop. 다른 도구도 유용할 수 있습니다.Linux 디스크 IO 로드 분석(파일 시스템 경로 및/또는 프로세스별)?,일정 기간 동안의 I/O를 측정할 수 있는 Linux 프로그램은 무엇입니까?, 서버 오류의 다른 스레드.

일어날 수 있는 일에 대한 몇 가지 가정은 다음과 같습니다. 측정을 수행하는 경우 이러한 가설을 확인하거나 반증할 수 있도록 이를 보여주십시오.

  • 파일이 있다면면접 시간일단 열리면 운영 체제는 이러한 액세스 시간을 기록하는 데 많은 시간을 낭비할 수 있습니다. 빌드 트리에 대한 액세스 시간은 쓸모가 없으므로 반드시 마운트 옵션을 사용하여 끄십시오 noatime. 귀하의 tmpfs+rsync 솔루션은 결코읽다하드 드라이브에서 저장되므로 한 번 쓰기 위해 추가 시간을 소비할 필요가 없습니다.
  • 쓰여진 내용이라면동기화, 컴파일러 호출로 인해 sync()또는 커널이 출력 버퍼를 자주 플러시하기 때문에 하드 디스크에 쓰는 것이 tmpfs에 쓰는 것보다 오래 걸립니다.

답변2

리눅스기본적으로RAM을 디스크 캐시로 사용합니다. 데모로 time find /some/dir/containing/a/lot/of/files > /dev/null두 번 실행해 보세요. 두 번째 실행은 모든 디스크 inode가 캐시되기 때문에 훨씬 빠릅니다. 여기서 초점은 이 커널 기능을 활용하고 이를 교체하려는 시도를 방해하는 방법입니다.

요점은 변경하는 것입니다 swappiness. 메모리 사용의 세 가지 주요 유형인 활성 프로그램, 비활성 프로그램 및 디스크 캐시를 고려해 보겠습니다. 분명히, 활성 프로그램에서 사용하는 메모리는 교체되어서는 안 되며, 다른 둘 사이의 선택은 다소 임의적입니다. 빠른 프로그램 전환이나 빠른 파일 액세스를 원하시나요? ㅏ낮은 교환성선호하다프로그램을 메모리에 유지(장기간 사용하지 않더라도) 그리고높은 호환성선호하다더 많은 디스크 캐시 유지(사용하지 않는 프로그램을 교환하여) (교환범위는 0~100, 기본값은 60)

귀하의 문제에 대한 나의 해결책은 교환성을 매우 높은 값(100 대신 90-95)으로 변경하고 캐시를 로드하는 것입니다.

echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

짐작할 수 있듯이 헤더 파일, 라이브러리, IDE 및 사용된 기타 프로그램을 포함하여 모든 소스 및 개체 파일과 컴파일러를 캐시할 수 있는 충분한 메모리가 있어야 합니다.

답변3

특정 파일이나 모든 파일을 특정 디렉토리의 캐시에 보관하려는 경우 이 방법이 효과가 있는 것 같습니다.

가상 터치그것이 하는 일인 것 같습니다. 예제 5에는 필요한 것이 있을 수 있습니다.

vmtouch -dl /whatever/directory/

루트로 실행해야 하는데sudo

답변4

inosync램디스크에 재동기화하고 싶다면 이 데몬이 원하는 대로 들릴 것입니다. 10초마다 rsync하는 대신 Linux의 inotify 도구를 사용하여 파일이 변경될 때 rsync를 수행합니다. Debian 저장소에서 해당 패키지를 찾았습니다 inosync. 소스 코드는 다음에서 찾을 수 있습니다.http://bb.xnull.de/projects/inosync/.

관련 정보