저는 다음 두 가지 테스트를 수행하고 있습니다.
#1
dd if=/dev/zero of=./testfile1 bs=512M count=1 conv=fsync
그리고
#2
dd if=/dev/zero of=./testfile2 bs=1M count=512 conv=fsync
무슨 말을 해야 할까요...:
#1은 복사(쓰기 실행)를 의미합니다.1큰 파일 크기512M그리고
#2는 많은 작은 파일을 복사하는 것을 의미합니다.(512개 파일)각 파일의 크기는100만?
답변1
아니요, 그렇게 말할 수는 없습니다. dd
복사되는 것은 파일이 아니라 단일 파일의 내용이며 이러한 작업은 매우 다르며 성능면에서 비교할 수 없습니다.
답변2
아니요.
#1은 파일을 하나의 큰 덩어리로 복사하는 것을 의미합니다.
#2는 파일을 여러 개의 작은 덩어리로 복사하는 것을 의미합니다.
성능에 세 가지 영향이 있을 수 있다고 생각합니다.
#1 파일을 읽을 수 있도록 운영 체제에 512M의 메모리를 확보해 달라고 요청하세요. 이렇게 하면 작업 속도가 느려집니다. (/dev/zero를 사용하세요.가능한OS가 실제로 할당할 필요가 없는 수요 제로 페이지를 생성하도록 허용하면 나중에 속도가 느려질 수 있습니다...) 이로 인해 dd 프로세스가 스왑되면 속도가 크게 느려질 수 있습니다.
#1 항상 운영 체제에 512M의 출력 디스크를 사전 할당해야 한다고 알려줍니다(쓰기는 한 번만 수행하므로). 운영 체제와 파일 시스템이 대규모 할당을 수행할 수 있으면 작업이 더 빨라질 수 있습니다. 좋은 구현은 dd
운영 체제가 이를 알 수 있다고 가정하고 쓰기를 수행하기 전에 이를 운영 체제에 알릴 수 있습니다. 파일 시스템이 대규모 할당이 가능하다고 가정하면 #1 속도가 약간 빨라질 수 있습니다. 원시 장치에 쓰는 경우에는 적용되지 않습니다.
#2는 512개의 읽기 요청과 512개의 쓰기 요청을 발행했습니다. 커널을 켜고 끄고 매개변수를 확인하는 데 시간이 걸립니다. 이에 대한 영향을 확인하려면 버퍼 크기를 더 줄이세요(아마도 4k 또는 16k - 하지만 너무 작으면 다른 심각한 성능 영향을 받기 시작합니다).
답변3
아니요, 그렇게 말할 수는 없습니다. dd는 파일을 복사하지 않고 개별 파일의 내용을 복사하며 이러한 작업은 성능 면에서 비교할 수 없을 정도로 다양합니다.
testfile1
512MB라는 대용량 파일을 생성 중입니다 . 이 파일의 데이터는/dev/zero
(제공된 null 바이트)에서 생성 됩니다.dd 명령은 dd라는 단일 파일을 생성
testfile2
하고 명령이 반복될 때마다 이를 덮어씁니다. 이bs=1M count=512
옵션은 명령이 데이터를 1MB 청크로 작성하고 이 프로세스를 512회 반복하도록 지정합니다. 명령이 실행될 때마다 새로운 널 바이트(0) 세트가 생성되고/dev/zero
이를 파일에 기록하여 해당 내용을 효과적으로 덮어씁니다.
목적
conv=fsync
은 데이터 무결성과 내구성을 보장하는 것입니다. 이는 데이터가 저장 매체에 완전히 기록되도록 보장하고 정전이나 시스템 충돌이 발생할 경우 데이터 손실이나 손상 위험을 줄여줍니다. 동기 작업은 명령 실행이 완료되기 전에 보류 중인 모든 쓰기가 저장 장치에 커밋되도록 합니다.
포함을 사용하면 명령이 완료될 때까지
conv=fsync
쓰고 있는 데이터 가 디스크에 안정적으로 저장됩니다.dd
이는 데이터가 성공적으로 기록되고 후속 작업에 사용 가능한지 확인하려는 경우 중요합니다.