Linux에서 디스크 I / O 캐시 제거 방법


Answers

다음과 같이 할 수 있습니다.

# sync # (move data, modified through FS -> HDD cache) + flush HDD cache
# echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt)
# blockdev --flushbufs /dev/sda
# hdparm -F /dev/sda

# NEXT COMMAND IS NOT FOR BENCHMARKING:
# should be run before unplug, flushes everything possible guaranteed.
# echo 1 > /sys/block/sdX/device/delete

strace를 사용하여 이들이 세 가지 시스템 호출인지 확인할 수 있습니다.

또한, hdparm을 사용하여 HDD 캐시를 끄는 것이 바람직 할 수도 있습니다. 벤치마킹이 어떤 것인지 잘 모르는 경우가 있습니다.

어떤 식 으로든 HDD가 최근에 사용한 64/32/16 MB의 데이터를 캐시하지 못하게 할 수는 없습니다. 그 캐시를 죽이기 위해서, 얼마간의 양의 0을 쓰고 (플러시) + 관련없는 장소를 HDD에서 읽으십시오. 이는 캐시가 읽기 부분과 쓰기 부분으로 나누어 질 수 있기 때문에 필요합니다. 그 후에는 HDD를 벤치 마크 할 수 있습니다.

Question

더 예측 가능한 벤치마킹을 위해이 작업을 수행해야합니다.




짧은 좋은 충분히 대답 : (복사 붙여 넣기 친절한)

DISK=/dev/sdX # <===ADJUST THIS===
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK

설명:

sync : 맨 페이지에서 : 파일 시스템 버퍼 플러시. 변경된 블록을 강제로 디스크에 저장하고 수퍼 블록을 업데이트하십시오.

echo 3 > /proc/sys/vm/drop_cache : 커널 워드 프로세서에서 커널 이 깨끗한 캐시를 버리게한다.

blockdev --flushbufs /dev/sda : 맨 페이지에서 : 호출 블록 장치 ioctls [to] 버퍼를 blockdev --flushbufs /dev/sda .

hdparm -F /dev/sda : 매뉴얼 페이지에서 : 드라이브 내 쓰기 캐시 버퍼 플러시 (이전 드라이브는 이것을 구현하지 않을 수도 있음)

위의 대답 에 따라 blockdev 및 hdparm 명령이 비슷해 보이더라도 장치에 다른 ioctl을 실행합니다.

아마 더 좋은 길 :

(나는 당신이 디스크를 포맷했다고 가정 하겠지만 디스크에 직접 쓰고 싶다면이 명령을 적용 할 수있다)

첫 번째 벤치 마크 전에 한 번만 실행하십시오.

MOUNT=/mnt/test # <===ADJUST THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16

캐시를 비울 때마다 다음을 실행하십시오.

DISK=/dev/sdX # <===ADJUST THIS===
MOUNT=/mnt/test # <===AND THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16
rm $MOUNT/temp-hddwrite.tmp
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
dd if=$MOUNT/temp-hddread.tmp of=/dev/null

완료되면 실행하십시오.

MOUNT=/mnt/test # <===ADJUST THIS===
rm $MOUNT/temp-hddread.tmp

설명:

HDD에는 위의 명령으로 지워지지 않는 H / W 캐시가있을 수 있습니다. 쓰레기로 채우기 위해 의사 랜덤 데이터 호핑을 쓰고 읽고 있습니다. 얼마나 많은 데이터가 HDD 캐시가 얼마나 클지에 달려 있습니다. 나는 / dev / urandom을 사용하고 있습니다. 왜냐하면 그것이 빠르며 우리가 진정한 임의성에 신경 쓰지 않기 때문입니다. 내가 처음부터 /mnt/test/temp-hddread.tmp를 만들고 충분한 랜덤 데이터를 읽을 때마다 사용하고있다. 난 충분히 임의의 데이터를 쓰고 싶을 때마다 /mnt/test/temp-hddwrite.tmp를 만들고 삭제하고있다.

크레딧

필자는 기존 답변의 가장 좋은 부분을 기반으로이 답변을 작성했습니다.




Related



Tags

linux linux   io