내가 아는 한, Linux 시스템에서는 파일 내용이 수정되면 파일 내용이 포함된 페이지가 페이지 캐시에서 더티로 표시되고 결국 디스크로 플러시됩니다.
내가 알고 싶은 것은 이러한 페이지가 디스크에 플러시될 때 블록 단위로 플러시됩니까?
예를 들어, 블록 크기가 4kB이고 1024kB를 플러시해야 한다면 디스크 쓰기 횟수는 1024/4 = 256번이 될까요?
답변1
이는 매우 복잡한 주제이며 디스크, 디스크 컨트롤러 및 커널 설정에 따라 다릅니다.
일반적으로 커널은 가능한 한 효율적이려고 노력합니다. 예를 들어, 조정 가능한 시간 범위(보통 약 30초) 내에 동일한 블록을 여러 번 업데이트하고 매번 디스크에 대한 동기화를 명시적으로 강제하지 않으면 대부분의 쓰기는 단순히 데이터 캐시를 업데이트합니다. 최종 결과만 실제로는 디스크에 기록됩니다.
연속된 블록의 긴 시퀀스를 작성하는 경우 커널은 스토리지 컨트롤러와 디스크 자체가 허용하는 만큼 적은 블록과 큰 블록에서 이를 수행하려고 시도할 것입니다.
커널의 I/O 스케줄러는 가장 효율적인 디스크 액세스를 달성하기 위해 디스크 작업 순서를 최적화할 수도 있습니다. 이 최적화는 가상 머신과 SSD에서는 거의 중요하지 않으므로 끌 수 있습니다. (SSD는 샷건 방식으로 임의의 블록에 액세스하더라도 충분히 빠릅니다. VM에서 하이퍼바이저는 종종 전체 VM 그룹과 모든 디스크 작업을 기반으로 최적화를 다시 실행하므로 개인 수준에서 미세 최적화를 시도하십시오. 가상 머신 워크로드는 에너지 낭비입니다.
일부 디스크에는 I/O 작업 크기에 대한 제한 사항이나 권장 사항이 있을 수 있습니다.
# fdisk -l /dev/sdb
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
예를 들어 HDD는 기존 512바이트 디스크 섹터를 에뮬레이트하지만 내부적으로는 4k 섹터 크기를 사용합니다. 따라서 지정된 최소 I/O 크기는 4k입니다.