내 시스템에는 부분적으로 md 미러링된 물리적 4TB 하드 드라이브 2개와 루트 파일 시스템을 저장하고 중요한 대형 파일 시스템을 디스크에 캐시하는 매우 빠른 512GB SSD M.2 장치가 있습니다. 특정 파일 시스템은 VMWare Workstation 가상 머신 디스크 파일을 저장합니다. 이러한 파일은 매우 클 수 있습니다(10-70GB). 제가 실행하는 가장 일반적인 VM은 Windows 10 이미지로, 여기에는 78GB 기본 이미지와 또 다른 6GB 스냅샷 파일이 포함되어 있습니다.
저는 이 파일 시스템과 특히 이러한 파일이 더 나은 성능을 발휘할 수 있도록 LVM 캐시 조정 가능 항목을 찾고 있습니다.
이에 비해 동일한 M.2 SSD에는 실제 Win 10 이미지도 있으며 Grub 선택에서 Windows 로그인 화면으로 직접 이미지를 부팅하는 데 약 8초가 걸립니다. 이에 비해 VMWare 부팅 선택에서 로그인까지 약 28초가 걸렸습니다. 캐싱을 끄는 것보다 훨씬 낫지는 않습니다(비록 최근에 해당 테스트를 수행한 적이 없어서 인용할 숫자가 없습니다).
Win 10 VM 전체 디렉터리는 82GB입니다. 다음은 내 lvm에 대한 세부 정보입니다(마지막 vmCache에 중점을 둡니다).
lvs -a -o+devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
games cache Cwi-aoC--- 200.00g [gamesDataCache] 11.37 16.05 0.00 games_corig(0)
[gamesDataCache] cache Cwi---C--- 10.00g 11.37 16.05 0.00 gamesDataCache_cdata(0)
[gamesDataCache_cdata] cache Cwi-ao---- 10.00g /dev/nvme0n1p6(23015)
[gamesDataCache_cmeta] cache ewi-ao---- 12.00m /dev/nvme0n1p6(23012)
[games_corig] cache owi-aoC--- 200.00g /dev/md126(0)
home cache Cwi-aoC--- 300.00g [homeDataCache] 100.00 16.05 0.01 home_corig(0)
[homeDataCache] cache Cwi---C--- 10.00g 100.00 16.05 0.01 homeDataCache_cdata(0)
[homeDataCache_cdata] cache Cwi-ao---- 10.00g /dev/nvme0n1p6(3)
[homeDataCache_cmeta] cache ewi-ao---- 12.00m /dev/nvme0n1p6(0)
[home_corig] cache owi-aoC--- 300.00g /dev/md127(128000)
[lvol0_pmspare] cache ewi------- 79.90g /dev/md127(204800)
vm cache Cwi-aoC--- 500.00g [vmCache] 100.00 19.01 0.00 vm_corig(0)
[vmCache] cache Cwi---C--- 79.80g 100.00 19.01 0.00 vmCache_cdata(0)
[vmCache_cdata] cache Cwi-ao---- 79.80g /dev/nvme0n1p6(2563)
[vmCache_cmeta] cache ewi-ao---- 80.00m /dev/nvme0n1p6(22992)
[vm_corig] cache owi-aoC--- 500.00g /dev/md127(0)
root0 fedora -wi-ao---- 39.00g /dev/nvme0n1p5(1)
캐시 크기는 거의 80GB이고 이 Win 10은 내가 부팅하는 유일한 VM이므로 거의 전체 이미지를 캐시할 것으로 예상됩니다. 데이터 사용량은 100%인데 성능은 기대한 것보다 훨씬 낮습니다.
요청 시 더 자세한 LVM 구성을 제공할 수 있지만 현재로서는 대부분의 값이 기본값이라고 가정합니다.
어떤 제안이 있으십니까?
감사해요,
브라이언
답변1
사용하고 있는 시스템은 무엇입니까(OS + 버전 + 가상화 제품군/패키지)?
CentOS 6.8의 LVM 캐시에서 대규모 캐시 문제를 발견했습니다. 100GB SSD를 2TB HDD(소프트웨어 RAID SSD 및 HDD)와 결합하면 속도 증가가 전혀 없습니다! SATA 컨트롤러
iostat -m -x 2
SSD SATA 포트가 100% 사용 중이지만 대략적인 쓰기 작업만 표시됩니다. 120MB/초(HDD와 동일한 속도) 캐시 크기를 10GB로 줄이면 상황이 훨씬 좋아질 거라 생각했어요! 그런데 둘 다 동일한 블록 크기를 갖습니다.
lvconvert --type cache-pool --chunksize 960 --cachemode writeback --poolmetadata ${VGBASE}/cachemeta ${VGBASE}/cachedata
dmesg
또한 보고됨(100G 캐시가 있는 경우)
device-mapper: 캐시: 별도의 여러 캐시 블록이 있는 캐시 장치를 생성했습니다(1670400).
블록 크기를 조정하면 도움이 될 수 있지만 이 값을 설정하는 데 문제가 있는 것 같습니다.
블록 크기는 64(32KB)에서 2097152(1GB) 사이여야 하며 64(32KB)의 배수여야 합니다. https://www.kernel.org/doc/Documentation/device-mapper/cache.txt
이러한 규칙을 따르면 실제로 블록 크기를 변경할 수 있지만 많은 블록 크기의 경우 디스크로 다시 플러시하는 것이 작동하지 않습니다. 캐시 볼륨의 캐시를 해제하고 다음과 같은 무한 루프에 빠지지 않는지 확인하는 것이 좋습니다.
X 블록은 여전히 플러시되어야 합니다(이런 일은 항상 발생합니다!)
SSD가 빠르게 쓰기를 수행하고 나중에 HDD가 실제로 쓰기를 수행하는지 조사하는 데 사용됩니다 iostat
(게시 당시 Cpy%Sync 열 참조 lvs -a
).
따라서 해당 항목을 제거(새로 고침)할 수 있는지 확인하고 정상적으로 작동하는지 확인하세요 iostat
.
물론, 캐시가 가득 차면 새 콘텐츠를 쓰기 위해 플러시해야 하므로 속도가 HDD 속도만큼 떨어집니다.
하지만 지금까지 제가 내린 결론은 튜닝이 어렵다는 것입니다. 어쩌면 CentOS 7에서 수정된 일부 버그로 인해 CentOS 6.8에서는 튜닝이 어려워질 수도 있습니다.
PS Windows VM을 빠르게 부팅하려면 SSD에 있어야 합니다. 따라서 이 예에서는 캐시에 맞지 않는 수십 개의 OS 이미지를 동시에 실행하고 있으므로 작동하지 않을 수 있습니다. 하드웨어 노드가 재부팅되면 부팅에 필요한 부분이 오랫동안 접촉되지 않았기 때문에 전체 OS 이미지가 더 이상 캐시에 (일부만) 존재하지 않습니다. 재부팅한 후에는 HDD를 통해 이미지를 다시 초기화해야 합니다. 하지만 그건 당신의 문제가 아닐 수도 있을 것 같아요.