프로세스/응용 프로그램에서 실행될 때 항상 결과/프로세스를 캐시하므로 real
프로세스에 시간을 제공하지 않는 것 같습니다.
나는 시도했다:
sync; time process
그리고
sync -f; time process
그러나 실제로 캐싱을 비활성화하지는 않는 것 같습니다.
반복적으로 실행하거나 time process
위의 예에서와 같이 실행 시간이 변경되는 것을 알 수 있습니다(캐싱 때문인 것으로 의심됩니다).sync -f; time process
sync; time process
라이브 프로세스를 제공하기 위해 실제로 캐싱을 비활성화하는 방법이 있습니까?
답변1
time
사용하는 하위 프로세스의 리소스 사용량을 표시합니다(커널로 측정됨).getrusage
이를 수행하려면(Linux에서는 다음을 사용합니다.wait4
. 측정 중인 특정 실행에 사용된 실시간 시간을 측정합니다.
표시되는 변경 사항은 프로세스 실행 중에 발생한 변경 사항을 반영합니다. 원인은 다양하며 일반적으로 한 종류 또는 다른 종류의 리소스 경합과 관련됩니다. 모든 벤치마크와 마찬가지로 time
사전 정의된 시나리오에서만 사용하는 것이 좋습니다.
외부 영향 없이 명령의 실행 시간을 측정하는 것은 (대부분) 가능하지만 많은 설정 작업이 필요합니다. Linux에서는 다음을 수행할 수 있습니다.모든 디스크 캐시를 미리 플러시합니다.:
echo 3 > /proc/sys/vm/drop_caches
(프로세스 실행 결과는 CPU 캐시의 소량을 제외하고는 어디에도 캐시되지 않습니다. 단, 프로세스 자체가 자체 메모리를 수행하여 다시 실행될 때 작업을 덜 수행하지 않는 한 -예를 들어. ccache
)
커널에서 사용하지 않는 전용 CPU에서 측정하려는 명령을 실행할 수도 있으므로 인터럽트나 일정 변경의 영향을 받지 않고 캐시 플러시의 영향을 덜 받습니다. 염두에 두어야 할 다른 요소로는 CPU 주파수 변경, 하이퍼스레딩, 주소 공간 무작위화 등이 있습니다.
내 동료 중 한 명인 Victor Stinner가 기사를 썼습니다.벤치마킹 주제에 대한 그의 메모 및 링크, Python 벤치마크에 초점을 맞춘 좋은 조정 세트를 제공하는 링크는 다음과 같습니다.Linux에서 일관된 결과를 얻기 위한 Denis Bakhvalov의 가이드.
답변2
더티 캐시를 완전히 비활성화해 볼 수도 있지만, 이렇게 하면 커널이 쓰기 작업을 최적화할 수 있으므로 쓰기 속도에 심각한 영향을 미칠 수 있는 매우 불쾌한 효과가 있을 수 있습니다. 예를 들면 다음과 같습니다.
sudo sysctl vm.dirty_background_bytes=4096
sudo sysctl vm.dirty_bytes=8192
캐싱에 대한 좋은 기사:https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/