스냅샷 성능을 테스트하기 위해 임의의 대용량 파일을 생성하고 변경하는 방법은 무엇입니까?

스냅샷 성능을 테스트하기 위해 임의의 대용량 파일을 생성하고 변경하는 방법은 무엇입니까?

매시간 스냅샷을 찍는 연결된 볼륨이 있습니다.

스냅샷 성능을 테스트하려면 스냅샷 백업 간에 대량의 "변동" 또는 파일 변경을 생성하는 프로세스를 실행해야 합니다.

이와 관련된 두 가지 질문이 있습니다.

  1. 간단하고 간단하게 큰 텍스트 덩어리를 효율적으로 생성하고 디스크에 기록하는 방법입니다. 내 지식이 제한되어 있기 때문에 내가 생각할 수 있는 유일한 것은 for임의의 문자를 생성하는 루프뿐이지만 이는 매우 느릴 수 있습니다. 또한 파일이 교체되는 경우 스냅샷에 기본적으로 일치하는 패턴이 없도록 새로운 임의성이 설정되어야 합니다.
  2. 이것을 저장하는 가장 효율적인 방법은 무엇입니까? 예를 들어 1000개 파일에 1GB, 10개 파일에 100GB

그림은 1K 단어와 동일하므로 개념적으로 다음과 같이 그렸습니다.

여기에 이미지 설명을 입력하세요.

파일 시스템과 도구를 결합하는 방법에 대한 귀하의 통찰력에 미리 감사드립니다.

답변1

간단하고 간단하게 큰 텍스트 덩어리를 효율적으로 생성하고 디스크에 기록하는 방법입니다. 내 지식이 제한되어 있기 때문에 내가 생각할 수 있는 유일한 것은 무작위 문자를 생성하는 for 루프뿐이지만 이는 매우 느릴 수 있습니다.

왜 그렇게 느린가요? 소프트웨어 루프를 실행하는 것 외에 데이터를 생성하는 다른 방법은 무엇입니까?

예, for루핑은 여러분이 원하는 것과 거의 정확히 같습니다. 적당한 크기의 버퍼(예: 각각 512kB)를 할당하고 임의의 텍스트로 채웁니다(또는 실제로는 바이트만 입력하면 바이트가 "A"와 같은 특정 항목을 나타내든 아니든 저장 매체에 영향을 주지 않습니다. "), write이 버퍼를 사용하여 호출합니다. 다음 버퍼로 이동합니다. 이것은 모두 매우 선형적이기 때문에 그보다 더 똑똑하다고 해서 이점이 없습니다. 그리고 CPU는많은RAM 버퍼는 저장할 수 있는 것보다 더 빨리 채워집니다.

호출하면 write들어오는 버퍼가 파일 시스템 버퍼(RAM)에 복사되고 write즉시 반환되므로 다음 데이터 청크를 생성할 수 있습니다. 동시에 커널은 이 버퍼를 백 저장소에 쓰기 시작합니다.

이는 파일 시스템 버퍼가 가득 차서 즉시 데이터를 복사할 공간이 없을 때까지 제대로 작동합니다. write그러면 공간이 생길 때까지 의지가 차단됩니다 . 이는 항상 스토리지를 바쁘게 유지하고 애플리케이션을 실행하는 깔끔한 방법입니다!

따라서 루프의 처음 몇 번의 반복은 for매우 빠르지만 어느 시점에서 스토리지의 평균 쓰기 속도로 "제한"됩니다. 엄청난!

또한 파일이 교체되는 경우 스냅샷에 기본적으로 일치하는 패턴이 없도록 새로운 임의성이 설정되어야 합니다.

상당히 빠르지만 나쁘지 않은 PRNG(의사 난수 생성기), libc rand(어떤 관점에서든 끔찍함) 이외의 다른 것을 사용하십시오.절대 사용하지 마세요rand). 나는 사용한다이상한 색 시로 128+상당히 높은 데이터 생성 속도를 달성합니다.

한 번 내 PC에서 벤치마킹한 적이 있는데 생성된 의사 무작위 8바이트 값은 각각 약 0.65나노초가 걸렸으므로 각 무작위 비트는 약 0.01나노초, 즉 이론적으로 100Gb/s가 걸렸습니다. 단일 코어 성능은 Kroshiro 128의 SIMD 버전을 사용하지도 않았습니다. +. 이는 스토리지 인터페이스보다 훨씬 빠른 속도일 수 있습니다(Google, Cloudflare, LHC 또는 NSA에서 근무한다는 사실을 잊어버리지 않은 경우).

이것을 저장하는 가장 효율적인 방법은 무엇입니까? 예를 들어 1000개 파일에 1GB, 10개 파일에 100GB

사실 1000개의 파일은 그리 많지도 않고 오버헤드도 미미합니다. 그러나 가장 저렴한 변형은 1TB 파일입니다.

답변2

제가 개발한 작업 스크립트는 다음과 같습니다.

# init
__PWD__=$(pwd)
cd $(dirname $0)
__THIS_FILE__=$0
__THIS_DIR__=$(pwd)
write_loc='/../create-large-files-repository/'
__TARGET_DIR__="$__THIS_DIR__$write_loc"
cd $__PWD__

# output
echo running script: $__THIS_FILE__
echo current directory: $__THIS_DIR__
echo files written to: $__TARGET_DIR__

if [[ ! -d $__TARGET_DIR__ ]]; then mkdir $__TARGET_DIR__; fi

FILE_COUNT=100
FILE_SIZE=1000000

for ((i = 0 ; i < $FILE_COUNT ; i++)); do
  file="file$i.dta"
  file="$__TARGET_DIR__$file"
  echo processing $file..
  dd if=/dev/urandom of=$file bs=2048 count=$FILE_SIZE
done

실행 속도는 GB당 약 30초이므로 분당 2GB로 1시간에 약 0.12TB의 데이터를 얻을 수 있다. 실제 목표는 한 시간에 1TB 이상을 생성하는 것이므로 이 중 약 10개를 병렬로 실행하면서 시스템 로드에 따라 이 값을 업데이트하겠습니다. /dev/urandom/차단 기능이 없으므로 (현재로서는) 성능이 뛰어난 것으로 보입니다.

관련 정보