읽기/쓰기 블록 크기 성능 결과가 일관되지 않습니다. 테스트가 정확합니까?

읽기/쓰기 블록 크기 성능 결과가 일관되지 않습니다. 테스트가 정확합니까?

IO 불량으로 인해 그리드 작업에서 발생할 수 있는 병목 현상을 식별하기 위해 파일 시스템 블록 크기를 기반으로 몇 가지 테스트를 수행하려고 합니다. 작업 중에 8096B의 작은 파일 증가가 많이 있었고 FS 블록 크기는 다음과 같습니다.

stat -fc %s /my/filesytem
1048576

이것은 최적이 아닙니다. 이 동작을 시뮬레이션하기 위해 1GB에서 20GB 사이의 작은 임의 파일 두 개를 만들었고 소스 dd/dev/urandom다음 Python 코드를 시도했습니다.

#!/bin/python
bsize=8096
print('File random.20g1')
print(strftime("%Y-%m-%d_%H:%M:%S"))
f1= open('random.20g1','rb')
f2= open('random.20g1.dest','wb')

while True:
   b = f1.read(bsize)
   if b:
       f2.write(b)
   else:
       break
print(strftime("%Y-%m-%d_%H:%M:%S"))

나도 같은 것을 시도했습니다 bsize=1048576.

나는 처음에 8096과 1048576의 블록 크기 사이에 4초라는 작은 읽기/쓰기 시간 차이를 관찰했습니다(블록 크기는 읽기/쓰기 시간이 4초 더 짧았습니다).
첫 번째 결과는 유망했지만, 파일 크기를 20GB로 늘리거나 10GB 파일로 동일한 작업을 수행하는 등의 추가 테스트에서 성능에는 항상 동일한 4/3초 차이가 있었고 이득은 결코 없었습니다. 동일하게 파일의 크기가 조정됩니다.

테스트 중에 제가 뭔가 잘못한 걸까요? 아니면 이게 괜찮다고 생각하시나요?
예를 들어, 파일 크기 증가에 대한 개선 사항을 확인하고 싶습니다.

답변1

이 코드

while True:
   b = f1.read(bsize)
   if b:
       f2.write(b)
   else:
       break

하고있다순서대로읽기 및 쓰기 - any 가 주어지면 bsize첫 번째 bsize바이트를 읽고 대상 파일에 쓴 다음 두 번째 bsize바이트를 읽고 대상 파일에 추가합니다.

운영 체제는 다음을 통해 이를 버퍼링합니다.페이지 캐시, 댓글에 언급된 @StephenKitt와 같은 입력 데이터를 미리 읽고 사전 버퍼링할 수도 있습니다. 따라서 실제 디스크에 대한 기본 IO 호출은 결국 언급한 1MB의 더 큰 청크로 통합됩니다.

bsize성능에서 나타나는 작은 차이는 더 작은 프로세스를 사용할 때 실제로 데이터를 이동하기 위해 커널에 더 많은 시스템 호출을 수행해야 하기 때문에 거의 전적으로 발생합니다 .

따라서 테스트 코드를 변경할 때 큰 차이를 볼 수 없는 이유는 거의 확실 bsize하지만 시스템에 대한 자세한 내용이 없으면 확실히 아는 것이 실제로 불가능합니다.

더...

당신이하고있는 일은 실제로 동일합니다

dd if=random.20g1 of=random.20g1.dest bs=8192

실제로 사용하려면 dd디스크 IO를 테스트하기 위해 더 많은 작업을 수행할 수 있습니다(다음을 살펴보세요).매뉴얼 페이지- 예를 들어 직접 IO를 사용하여 페이지 캐시를 우회할 수 있지만 궁극적으로 수행할 수 있는 IO 테스트는 dd연속적이므로 매우 제한적입니다. dd당신에게 보여줄 것이다최고IO 성능이 뛰어나지만 실제 작업 부하를 대량으로 시뮬레이션할 수 없으므로 IO 성능의 단점이 드러납니다.

그리드 작업이 실제로 사용하고 있는 IO 패턴에 대해 더 자세히 결정해야 합니다. 즉, 테스트에서와 같이 순차적 읽기/쓰기를 수행하고 있습니까, 아니면 수행하고 있습니까?무작위의IO를 수행하기 전에 파일에서 찾는 위치를 유효한 임의 위치에 읽거나 쓰시겠습니까? 무작위 IO 작업은 파일 시스템 및 기본 디스크 하드웨어(특히 회전 디스크)에 대한 수요를 높입니다. 초당 수백 MB의 스트리밍 순차 IO를 전송할 수 있는 시스템은 매우 적은 양으로 줄어들 수 있습니다.킬로바이트초당 무작위 소규모 IO 작업입니다. 특히 느린 5,000RPM SATA 디스크를 사용하는 경우.

파일 시스템과 RAID 어레이를 이해하지 못하는 사람이 스토리지를 설정하면 상황이 정말 나빠질 수 있습니다. 1MB 파일 시스템 블록 크기에 대한 귀하의 언급은 "더 클수록 더 빠르다"라는 잘못된 패러다임으로 스토리지 시스템 설정에 접근하고 있는 것처럼 보입니다.

"더 큰 것이 항상 더 빠르다" 패러다임을 RAID5/6 어레이 및 임의의 작은 IO 청크(예: 그리드 작업이 수행하는 것으로 보이는 작업)와 혼합하면 IO 성능이 극도로 저하될 수 있습니다.

strace리눅스에서 사용할 수 있습니다작업에서 수행된 실제 시스템 호출을 가져옵니다. lseek, write, read및 와 같은 pwrite호출을 찾습니다 pread. 이는 작업이 수행하는 실제 IO 패턴을 알려줍니다.

IO 패턴이 있으면 해당 패턴을 밀접하게 복제하는 도구를 사용하여 해당 패턴에서 실제 스토리지 성능을 테스트하고 벤치마킹할 수 있습니다. 임의의 위치에 쓰기/쓰기가 가능한 도구가 필요할 수 있습니다. 다시 Linux를 가정하면,당신은부터 시작할 수 있습니다fio. 무작위 읽기/쓰기 옵션을 사용할 수도 있습니다.

관련 정보