/dev/sda 및 /mnt/sda/tempfile에 쓸 때 성능 차이

/dev/sda 및 /mnt/sda/tempfile에 쓸 때 성능 차이

Linux에서 새로운 PCI-E SSD를 테스트하고 있습니다.

성능을 테스트하기 위해 다음 명령을 사용하고 있습니다(참조:https://www.thomas-krenn.com/en/wiki/Linux_I/O_Performance_Tests_using_dd)

(1) dd if=/dev/zero of=/dev/nvme0n1 bs=1M 개수=2048 -->2.2GB/초

(2) dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=2048 oflag=direct -->2.2GB/초

(3) dd if=/dev/zero of=/mnt/nvme0n1/tempfile bs=1M count=2048 -->80MB/초

(4) dd if=/dev/zero of=/mnt/nvme0n1/tempfile bs=1M count=2048 oflag=direct -->800MB/초

내 추측은 다음과 같습니다: (3, 4) 파일 시스템에 쓰기(어떤 이유로 NTFS로 포맷됨). 그러나 (1, 2)는 블록 장치에 직접 기록되므로 파일 시스템 오버헤드가 발생하지 않습니다.

내 말이 맞나요? 설명을 좀 해주실 수 있나요?

감사해요

답변1

  1. 나는 당신의 표현에 문제를 제기할 것입니다. 나는 명령 (1)과 (2)가 다음과 같다고 말하고 싶습니다.초과하다-파일 시스템에 기록합니다(있는 경우). 즉, 무시하고 삭제합니다(있는 경우). 장치에 사전에 파일 시스템이 있는지 여부에 관계없이 동일하게 작동합니다.

    동시에 명령 (3)과 (4)가 기록됩니다.입력하다파일 시스템 또는통과하다그것.

  2. 예, 물론 명령 (3)과 (4)는 파일 시스템 코드를 통과하므로 성능 차이가 발생합니다. (4항에서 계속됩니다.)

  3. 파일 시스템이 NTFS라는 사실이 왜 중요한지 이해가 되지 않습니다. 예를 들어 ext 계열 중 하나와 같은 어떤 파일 시스템 유형에서도 비슷한 결과를 얻을 수 있을지 의문입니다.

  4. 포인트 2 구축: 첫째, 파일 시스템 I/O가 대부분 무시됩니다. 파일 시스템 코드는 1M 쓰기를 2048개의 512바이트 쓰기로 처리하거나 256개의 4K바이트 쓰기를 처리할 수 있습니다. 둘째, 파일 시스템 코드는 파일 시스템의 무결성을 유지하는 역할을 합니다. 이는 확장할 때마다 사용 가능 목록에서 블록을 할당하고 이를 파일에 할당해야 함을 의미합니다. 이는 사용 가능한 목록과 파일의 inode(또는 모든 파일 시스템 유형에 해당하는 항목)를 지속적으로 수정해야 함을 의미합니다. 이는 사용자가 볼 수 있는 각 쓰기에는 (아마도) 세 번의 실제 쓰기가 필요할 뿐만 아니라 쓰기가 연속적이지 않고 드라이브가 모든 곳을 검색하게 된다는 것을 의미합니다. 또한, 파일 시스템을 장기간 사용한 경우에는 free list가 순서에 어긋나서 파일에 할당된 블록이 연속되지 않을 수 있습니다.bs=anythingoflag=directtempfile

제안:

  • mkfs파일 시스템이 깨끗하도록 테스트 (3)과 (4)를 수행하십시오 . 그런 다음 기존 파일을 사용하여 이러한 작업을 반복합니다. 이렇게 하면 장부 I/O 양이 줄어듭니다.
  • bs512-4K 범위에서 모든 테스트를 반복합니다. 테스트 (3)과 (4)의 결과는 거의 변하지 않은 반면, 테스트 (1)과 (2)의 결과는 훨씬 낮아야 합니다.

관련 정보