2009/01/30

고성능 스토리지(하이엔드 스토리지 or Highend Storage) 와 ZFS의 궁합 ?



일단, zfs는 최초 개발시 대규모 캐쉬 메모리를 가지고 있지 않다는 가정하에서 - 즉

JBOD 혹은 저렴한 내장 디스크들. - 디자인이 되었습니다.

반면, 시스템에 장착되는 메모리의 비용/용량은 급격히 떨어지는 것을 활용하는 것에

촛점을 둠에 따라,  zfs는 가급적이면 많은 메모리를 끌어다가 저 성능의 디스크를 위한

캐쉬 처럼 작동할 수 있는 메커니즘을 넣게 되었습니다. 이렇게 대용량 메모리를 캐쉬버퍼로

쓰게되면 당연히 시스템 장애시 플러시 되지 않은 데이타들이 화일 시스템에 dirty area를

만들 수 있게되므로(과거 화일 시스템들의 큰 문제였죠.) zfs는 '항상 data state가 보장되는'

기술을 채택하게 됩니다. flush 되지 않은 내용이 날라가더라도 file system이 깨지지는 않습니다.

일단 디스크에 쓰인 것은 언제나 보장이 됩니다.  따라서, 화일 시스템에서 데이타가 깨진 다는 둥

이런 얘기는 고객과 얘기할 때 zfs에서는 사용하지 않으시길 바랍니다.



이러한  커다란 캐쉬는 저렴한 디스크들과 함께 사용시 고성능을 제공해주는 근간이 되기도 합니다.

썬의 오픈 스토리지는 이러한 특징에 기반하여 고성능을 제공하고 있습니다.



반면 단점도 발생합니다.  다른 서비스를 위해서 상당한 메모리를 사용하는 애플리케이션들이 탑재되는

경우에는 메모리 점유에 대한 경쟁현상이 발생하므로 이런 경우에는 zfs가 사용하는 캐쉬 버퍼 영역을

제한해야 할 필요성이 대두되게 되었습니다.  쓰기를 많이 할 수록 이런 문제는 더욱 더 많이 발생하겠죠.

때문에 Sun Solaris 10에서는 함께 사용하게 될 애플리케이션의 종류를 염두에 둬서 사전에 이런 코치를

해주실 필요가 있습니다. 만약 데이타베이스 처럼 헤비한 '쓰기' 트랜잭션을 반드시 가지는

애플리케이션들인 경우에는 필히 arc-max를 적정 수준의 메모리로 제한하셔야 합니다.

잘 모르겠다 싶으면 최소, 중간, 대량 정도로 구분했을 때 최소는 메모리의 1/8, 중간은 1/4, 대량은 1/2

정도로 두시면 됩니다. arc 캐쉬로 설정된 값만 큼 모든 메모리가 사용되는 것이 아니므로 설정했다

하더라도 사용되지 않으면 다시 애플리케이션이 사용할 수 있도록 return되게 되어 있습니다.



연속적으로 이 문제는  zfs 의 캐쉬 버퍼가 끊임없이 늘어나게 됨에따라 캐쉬를

오퍼레이션 타임(서비스 타임)이 급증하는 현상도 함꼐 발생했는데, 이에 따라서 zfs는 계속 사용하게

되면 response time이 일정치 않아지는 문제와 disk service time이 늘어나는 것 처럼 나타나게 됩니다.

이러한 문제로 zfs는 기존의 ufs가 가지고 있던 'throttling' 기법을 도입하게 되었습니다.

즉, 무조건 애플리케이션이 주는 데이타를 다 받는 것이 아니라, 디스크에 적당히 내려지면 받고 하는

식으로 조절되도록 개선되었는데, 이는 file system IO의 응답시간을 더 예측가능하도록(일정해지도록)

해주는 개선효과를 가집니다. 이 개선 효과를 보실려면 Sun Solaris 10 U6이상을 사용하셔야 합니다.



끝으로, 이 메일의 주제에 나온 것처럼 스토리지가 엄청난 양의 캐쉬를 가지고 있는 경우라면 zfs는

어떨 것인가 하는 주제가 나옵니다. 즉, 이미 스토리지가 충분한 캐쉬를 가지고 있는데, zfs가 쓸데없이

캐쉬를 운영하기 위해서 헛짓하면서 cpu time을 낭비하고, 응답시간을 지연할 필요가 있는가 하는 문제가

발생합니다.



이렇게 고성능의 캐쉬가 달린 (주로 하이엔드 스토리지) 스토리지를 사용하는 경우라면 헛짓하지 않고

바로 바로 채널로 내려보내는 것이 오히려 훨씬 좋겠죠. 따라서, 이런 경우에는 zfs가 flushing을 하지

않도록(헛짓) 하는 것이 필요합니다. 이 캐쉬 플러시 작동은 저렴한 디스크가 내장한 캐쉬를 플러시하기

위해서 사용된 것인데, 비휘발성 고비용 캐쉬를 가진 어레이 붙였다면 필요가 없겠죠.

최소한 6x40같은 급 이상의 스토리지를 사용하면서 솔라리스10 U4을 사용하신다면 /etc/system안에

zfs의 noflush를 활성화하는 것을 권고합니다. (set zfs:zfs_nocacheflush = 1
)



반가운것은 솔라리스 10 U7에는 cached를 가진 어레이를 자동으로 감지하도록 변경되어서 제공한다니

update 7을 사용하시도록 패치하거나 새 버젼을 설치해보시는 것도 좋을 듯 합니다.



관련 기술의 이해는 이곳을 참고하시기 바랍니다.
 http://www.solarisinternals.com/wiki/index.php/ZFS_Evil_Tuning_Guide

댓글 없음: