
풀은 2개의 HDD(WD Red 3TB, 5200RPM?, 최대 전송 속도 147MB/s 및 Verbatim(Toshiba) 3TB, 7200RPM)으로 구성되어 있습니다 raidz1-0
. 2.25TB의 데이터가 2개의 디스크에 복제되어 총 용량은 4.5TB입니다. 풀을 생성할 때 값을 지정하지 않았습니다 ashift
.
zpool status
"스캔: 2021년 1월 3일 일요일 13:58:54에 오류 0개로 32시간 43분에 0을 스크럽 복구했습니다"가 표시됩니다. 이는 스캔 속도가 4.5e6 / (32.717 * 60 * 60) = 38.2 MB / s
. WD 디스크가 다른 것보다 다소 느리긴 하지만 최소 2 x 100 또는 최대 2 x 200MB/s를 예상합니다.
디스크의 SMART 데이터는 모든 것이 정상임을 보여줍니다. 가동 시간은 6.5~7년이지만 시작-정지 횟수는 약 200에 불과합니다.
그래서 주요 질문: 읽기 성능이 좋지 않은 이유는 무엇입니까?
이상하게 도 zdb
풀이 . "파티션 1은 물리적 섹터 경계에서 시작되지 않습니다"라고 언급했지만 쓰기 성능만 저하된다는 내용을 읽었습니다. 데이터가 복제(및 백업)되므로 장치를 제거하고 적절한 전체 디스크 경로로 다시 추가하여 이 문제를 해결해 볼 수도 있습니다./dev/disk/by-id/ata-WDC_WD30EFRX-xyz-part1
/dev/disk/by-id/ata-WDC_WD30EFRX-xyz
fdisk -l /dev/disk/by-id/ata-WDC_WD30EFRX-xyz
풀에는 710만 개의 파일이 있습니다. sha1sum
를 통해 캐시를 지운 후 14276MB 파일에서 실행을 테스트했는데 /proc/sys/vm/drop_caches
읽기 속도는 88.5MB/s로 2분 41초가 걸렸습니다.
dd bs=1M count=4096 if=/dev/disk/by-id/ata-WDC_WD30EFRX-xyz of=/dev/null
ata-WDC_WD30EFRX-xyz-part1
보고된 134MB/s와 ata-TOSHIBA_DT01ACA300_xyz
195MB/s를 사용하여 144MB/s의 속도를 보고했습니다 .
내 NAS는 꽤 오래된 소프트웨어 버전을 실행합니다.
$ modinfo zfs
filename: /lib/modules/3.11.0-26-generic/updates/dkms/zfs.ko
version: 0.6.5.4-1~precise
license: CDDL
author: OpenZFS on Linux
description: ZFS
srcversion: 5FC0B558D497732F17F4202
depends: spl,znvpair,zcommon,zunicode,zavl
vermagic: 3.11.0-26-generic SMP mod_unload modversions
24GB의 RAM이 있으며 그 중 8GB는 JVM용으로 예약되어 있지만 나머지는 무료로 사용할 수 있습니다. 비록 그 중 많은 부분이 무료인 것 같지는 않지만:
$ free -m
total used free shared buffers cached
Mem: 23799 21817 1982 0 273 1159
-/+ buffers/cache: 20384 3415
Swap: 7874 57 7817
편집 1:
bonnie++
RAIDZ에서 단일 4GB 파일을 사용하여 몇 가지 테스트를 수행했습니다 . 75.9MB/s 쓰기, 42.2MB/s 다시 쓰기 및 199.0MB/s 읽기. 나는 "킬로 문자/초"에서 올바르게 변환을 수행했다고 가정합니다.
아, 방금 병렬 스크러빙이 가장 느린 5400RPM 디스크만큼 오래 걸린다는 것을 깨달았습니다. 7200RMP가 (아마도) 더 빨리 스크러빙되었다는 것은 중요하지 않습니다.
편집 2:
풀의 파일 수를 710만 개에서 450만 개(-36.6%)로 줄였고 스크러빙 시간은 32.72시간에서 16.40시간(-49.9%)으로 줄었습니다. 작은 파일들을 저압축 ZIP에 넣었기 때문에 데이터 양은 동일합니다.
또한 128k에서 512k로 늘렸는데 recordsize
, 이것이 이 경우에 차이가 있는지 전혀 알 수 없습니다. 기존의 다른 데이터는 건드리지 않았으므로 원본을 유지합니다 recordsize
. 아 그리고 /sys/module/zfs/parameters/zfs_scan_idle
로 설정되었습니다 2
.
답변1
어떤 버전의 ZFS를 실행하고 있나요?
0.8.x 이전 버전에서는 디스크에 배치된 모든 메타데이터와 데이터를 순회하여 스크러빙합니다. 이로 인해 기계식 디스크의 성능이 저하되는 많은 검색이 발생합니다. 수백만 개의 작은 파일로 채워진 저성능 5K RPM 디스크와 함께 사용하면 스크럽/리실버 시간이 매우 길어집니다. 이러한 이전 ZFS 버전을 사용하면 일부 ZFS 조정 가능 항목을 조정할 수 있습니다.예를 들어:
echo 0 > /sys/module/zfs/parameters/zfs_resilver_delay
echo 0 > /sys/module/zfs/parameters/zfs_scan_idle
스크럽 우선순위를 높이면 애플리케이션 성능이 저하된다는 점에 유의하세요.
0.8.x에서는 메타데이터를 더 큰 배치로 수집한 다음 관련 데이터만 검색하는 일괄 스크럽 접근 방식을 사용합니다. 이로 인해 아무것도 조정할 필요 없이 훨씬 더 빠른(즉, 절반의 시간) 스크럽이 이루어집니다(위의 노브는 더 이상 존재하지 않습니다).
따라서 스크럽/리실버 속도를 높이는 더 효과적인 방법은 아마도 ZFS 버전을 업데이트하는 것입니다.