하위 폴더에 쓰는 것이 상위 폴더에 쓰는 것보다 빠릅니다.

하위 폴더에 쓰는 것이 상위 폴더에 쓰는 것보다 빠릅니다.

쓰기 성능을 측정하기 위해 dd를 사용했는데 이상한 점을 발견했습니다. /data/emzed2에 쓰는 것이 /data에 쓰는 것보다 빠릅니다. 제가 성능을 측정한 방법은 다음과 같습니다.

$ dd if=/dev/zero=/data/emzed2/testfilebs=32

^C4921834+0 레코드

4921834+0은 복사된 157498688바이트(157MB), 2,87329초를 기록합니다.54,8MB/초

$ dd if=/dev/zero=/데이터/테스트파일bs=32

^C2487991+0 레코드

2487991+0 레코드 출력 79615712바이트(80MB) 복사, 2,6501초,30,0MB/초

두 폴더 모두 SSD 드라이브의 동일한 파티션에 있습니다. 나는 Ubuntu 14.04를 사용하고 비슷한 결과로 실험을 여러 번 반복했습니다.

무슨 일인지 아세요?

답변1

ext4 최적화로 인해 문제가 발생한 것 같습니다.. 이들 중 일부는 다음에 설명되어 있습니다.Ext4 디스크 레이아웃선적 서류 비치.

예를 들어 dd를 사용하여 파일을 늘릴 때마다 새 데이터를 위해 일부 공간이 할당됩니다. 결국 파일은 조각화될 수 있습니다. 즉, 데이터가 디스크를 통해 여러 덩어리로 분산될 수 있습니다. 조각화는 (읽고 쓸 때) 속도 저하의 원인으로 잘 알려져 있으므로 파일 시스템 구현에서는 조각화를 피하려고 하는 경우가 많습니다. 조각화는 SSD보다 회전 디스크(헤드가 연속적인 청크로 이동해야 함)에서 훨씬 더 비싸지만 대부분의 파일 시스템 구현은 SSD에서 회전 디스크 최적화 전략을 사용합니다.

위에서 언급한 문서에 설명된 세 번째, 네 번째, 다섯 번째 "트릭"의 조합~할 것 같다귀하의 경우 하위 디렉토리에 쓰기가 더 빠른 이유를 설명하십시오.

다섯 번째 요령은 디스크 볼륨을 128MB 블록 그룹으로 나누는 것입니다. [...] 루트 디렉터리에 디렉터리가 생성되면 inode 할당자는 블록 그룹을 검색하고 해당 디렉터리를 찾을 수 있는 로드가 가장 적은 블록 그룹에 넣습니다.

결과적으로 emzed2128MB의 빈 블록에 생성되었을 것입니다.

네 번째 요령은 가능한 경우 디렉토리의 모든 inode를 디렉토리와 동일한 블록 그룹에 배치하는 것입니다.

결과적으로 /data/testfile(아마도 로드가 많은) 루트 블록 그룹에 생성되고, /data/emzed2/testfile(아마도 비어 있는) 블록 그룹에 생성됩니다 emzed2.

세 번째 요령 [...]은 파일의 데이터 블록을 inode와 동일한 블록 그룹에 유지하려고 시도한다는 것입니다.

의 경우 /data/emzed2/testfile파일 시스템은 먼저 emzed2블록 그룹의 모든 데이터 블록을 할당합니다. 이 블록이 처음에 비어 있었다면 처음 128MB에 대해 이는 조각화가 전혀 없음을 의미합니다. 의 경우 /data/testfile파일 시스템은 루트 블록 그룹이 아직 채워지지 않은 경우 먼저 루트 블록 그룹을 채운 다음 데이터를 저장할 다른 장소를 찾습니다.

또한 한 번에 32바이트씩 파일이 늘어나고 있습니다. 다행히 ext4와 같은 파일 시스템은 요청한 것보다 더 많은 데이터를 할당하고(ext4의 경우 8kb 단위로) 할당을 지연시키려고 합니다. 와 비슷한 패턴을 볼 수 있지만 bs=8196블록 크기가 클수록 속도 차이가 줄어들 수 있습니다.

관련 정보