계산용 클러스터에서 레이드 디스크 IO속도 문제
안녕하세요. 저는 큰 시뮬레이션을 돌리는 연구실에 있는 대학원생이고 클러스터 관리자입니다. 이 게시판에서 늘 많은 도움을 얻고 있습니다.
문제가 되는 클러스터의 스펙은 다음과 같습니다.
메인노드: CPU core 4개, 8GB 메모리, 부팅 및 바이너리용 하드 + (400GB HDD*11) raid5 3.6TB
{슬레이브: CPU core 4개*2, 4GB 메모리, (500GB HDD*2) raid1} * 26
26개의 슬레이브 노드와 1개의 메인노드는 1기가비트 랜으로 엮여 있습니다.
메인노드의 3.6TB짜리 레이드5하드는 메인노드와 슬레이브의 /home에 마운트되어 있습니다.
이 레이드 하드의 컨트롤러는 (비싼;;) 하드웨어 레이드 컨트롤러입니다.
이 계산 머신은 메모리를 별로 쓰지 않고 계산만 죽어라 하는 연산에 특화되어 있으며, 중간중간 결과를 내뱉습니다.
이 내뱉은 결과는 물론 /home에 쓰여집니다. 때때로 계산 결과가 많기 때문에, /home을 맡고 있는 메인노드의
레이드5하드는 빨라야만 합니다. 그래서 하드 11개를 raid5로 한번에 묶는 개짓-_-;;을 했습니다.
/home은 nfs로 공유하며, nfs로 구글링하여 검색하면 나오는 간단한 튜닝정도는 했습니다.
슬레이브노드의 /etc/fstab입니다
10.1.100.1:/home /home1 nfs rw,rsize=32768,wsize=32768,nfsvers=3,tcp,bg,nointr,noac 0 0
일단 rsize와 wsize를 늘리라고 해서 늘렸습니다.
메인노드의 /etc/exports입니다
/home/ 10.1.0.0/255.255.0.0(rw,sync,no_root_squash,no_subtree_check)
그리고 /etc/default/nfs-kernel-server 의
# Number of servers to start up
RPCNFSDCOUNT=32
원래 4개였던 것을 권장대로 32개로 고쳤습니다.
그런데 이렇게 해도 이 레이드 하드가 엄청 느립니다.
슬레이브 노드에서 dd같은걸로 써보면 , 한 노드에서 주구장창 쓸 때에는 정확히 기가비트 네트웍 만큼의 속도가 나옵니다.
100MB/sec정도요
하지면 여러 파일을 동시에 쓸 때에 엄청나게 느려집니다.
약 20-30노드가 동시에 파일을 쓰려고 시도하는 경우 초당 1-2MB 정도밖에 쓰지 못합니다. 아무리 빨라봐야 10MB/sec 이하입니다.
하드 쓰기 속도가 네트웍 속도보다 훨씬 빠르다는 점과 여러 노드가 데이터를 보낸다는 점을 생각해 봤을 때 더 빨라져야 할 것같은데,
아주 심각하게 느려집니다. 초당 1-2MB라는게 한 작업당이라면 좋겠지만 raid5하드의 전체 쓰기 속도가 그렇다는 이야기입니다;;
파일을 30개를 동시에 쓴다고 해도 그렇지 무슨 레이드5하드가 초당 몇메가밖에 못쓰나요 망신이네요;;
이런 쓰기 작업을 하는 경우 메인노드의 로드 에버리지가 20-30까지 치솟고 cpu시간의 iowait가 눈에 뜨일 만큼(20-30%) 커집니다.
이렇게 되면 슬레이브 노드에서 하드에 쓰는 일을 할 경우 엄청 기다려야 하고 그래서 작업 속도가 현저하게 느려집니다.
어떻게든 이걸 빠르게 하고 싶습니다.
혹시 문제가 될 만한 부분이 있을까요? 아니면 이게 정상인가요?
조언해주시면 감사하겠습니다.
고맙습니다.
요약: raid5하드가 nfs로 마운트되어 있는데 파일 한 개를 쓸 경우 기가비트 랜의 속도가 나오지만 파일 수십개를 동시에 쓸 경우 전체 쓰기 속도가 수메가/초 밖에 나오지 않습니다.
용량 제약이 적다면
용량 제약이 적다면 raid 10도 고려해보심이..
我不知道
我不知道
계산이 MPI를 이용한 것이라면..
병렬 계산 방법으로 어떤걸 사용하시는지를 안적어 주셔서 확실히는 모르겠습니다만,,
만약 MPI를 사용하는 것이라면 I/O관련 통신 루틴이 노드간에 서로 경쟁하여 수행되도록 만들어진 것 같습니다.
노드 수가 몇개 안되거나 I/O 작업이 얼마 차지 하지 않는 경우에는 별 문제가 안되더라도 프로그램에 따라 성능에 큰 문제를 일으키기도 합니다.
이 경우에는 하드웨어 스펙을 아무리 높여도 제성능이 나오질 않습니다.
실제로 사용해보진 않았지만 MPI 2 버전에서는 그런 문제를 해결하기 위해서 병렬 I/O 기능을 제공 한다고 합니다.
코드의 I/O 처리 관련 루틴을 개선하는 게 유일한 해결책이 아닌가 합니다.
MPI안씁니다;;
상황이 이러하니 MPI로 코드 나누고 이런거 생각도 못하고 있어요;;
그냥 여러 슬레이브 노드가 여러 파일을 열어서 동시에 쓰기 시작하면 느려집니다.
IO관련 루틴은 아주 간단합니다 c라면 그냥 fprintf고 포트란이라면 그냥 write입니다.
그냥
do i=1, 1000000
write(1,*) 'hello world'
enddo
이렇게 짜도 느립니다. 간단히 말씀드리면 dd로 여러 파일을 써보려 해도 느려지거든요.
그래서 프로그램상의 문제가 아니라 다른 문제라고 단정한겁니다.
아직 raid5 disk optimize
아직 raid5 disk optimize 가 끝나지 않은거 아닌가요?
400G 11개 이면 족히 48시간 이상은 걸릴거 같은데...
설치한지는 한달이 넘었습니다.
시간이 많이 지나서 그런 문제는 아닐거라고 생각합니다.
도움이 될지는 잘
도움이 될지는 잘 모르겠지만 제 나름대로 생각나는 것을 적어 봅니다.
1. 이건 이미 dd로 테스트를 해 보셨다고 하니 아닐 것 같은데..
한 파일을 쓸 때 조금씩 여러번 쓰는 것 보다 한번에 쓰는게 훨신 빠르더군요.
nfs를 통하지는 않았지만 하드를 많이 쓰는 시뮬레이션 코드를 짠 적이 있는데
속도가 느려서 코드 내부에 버퍼를 만들어서 썻습니다.
2. raid가 설치되어있는 로컬 머신에서는 같은 일이 안 생기나요?
로컬 머신에서 dstat 같은걸 돌렸을 때 CPU, 네트웍, HDD I/O는 어떻게 되나요?
누가 병목현상의 주범인지 알아 볼 필요가 있을 것 같습니다.
1. dd 로 한것은 한
1. dd 로 한것은 한 번에 쓰는 파일 수가 1, 2, 3, 4, ... 이렇게 늘어날 때 속도는 100MB/s, 70MB/s, ... 이런식으로 줄어드는 것을 확인한 정도입니다. 여러 개를 쓸수록 scale하지 않는다 정도인데요. 출력 버퍼 문제는 nfs가 해주는거라고 생각했는데;;; 한번 해보겠습니다.
2. 로컬 머신에서 그렇게 많은 파일을 동시에 써본 일은 없습니다.
제가 말씀드린 현상이 일어날 때 dstat을 돌린 경우, cpu의 특이할만한 점은 iowait가 30%정도였고, 네트워크 보내는 것은 초당 수십-수백 킬로바이트, 받는 것은 초당 2-3메가바이트 정도입니다. 하드디스크는 초당 5-6메가바이트 정도로 쓴다고 나옵니다. 좀 특이한건 system의 int라고 되어 있는 부분이 천이 넘었다는것? dstat에서는 하드가 초당 5-6메가 쓴다고 하지만 실제로 제가 돌리는 작업이 쓰는건 초당 1-2메가정도밖에 안됩니다.
raid5의 쓰기 속도가
raid5의 쓰기 속도가 늦다고는 하지만
1-2MB는 분명히 문제가 있어 보이네요.
iowait가 20-30%로 올라간다면 raid 콘트롤러의 write cache는 확인해 보셨는지요?
비싼 콘트롤러라 하셨으니 분명 배터리는 들어가 있을테고 디폴트로 대부분 write cache가 disable
되어 있으니 확인 삼아 한번 보시는게 좋을거 같습니다.
다 보셨을거 같기도 합니다만...
저번에 레이드가
저번에 레이드가 깨져서 다시 설치한 이후 좀 느려진 감이 있긴 합니다.
느려져서 한번 재부팅해보고 롸이트 캐시를 확인한 것 같긴 한데 배터리가 없는 것 같기도 했고;
활성화되어있는지는 모르겠네요;; 한번 확인해보겠습니다.
정상적인 경우 입니다.
제가 볼땐 일반적인 NAS 문제로 보이는 군요.
이건 디스크나 Raid 구성 같은 하드웨어 문제가 아니고 NFS 의 문제 입니다.
NAS 방식의 특성상 노드가 많아 질수록 성능은 급격하게 떨어집니다.
(이 정도는 아니었습니다만, 제가 테스트 했을때도 비슷한 수치를 받았던 것 같습니다.)
NAS 방식의 성능 평가는 클라이언트의 성능과 함께 서버에서 처리 가능 한 수치를 확인 하셔야 합니다.
님의 경우는 클라이언트에서는 1~2M Bps 라는 수치 보다 1~2M Bps * 26node 라는 수치로 고민 하셔야 한다는 말이죠.
어느 정도의 튜닝으로 조금의 성능 향상은 얻을 수 있겠지만,
큰 성능 향상은 시스템 구성을 변경하기 전까지는 얻기 힘드실 겁니다.
SAN으로 바꾸시는게 좋겠지만, 예산문제가 있겠지요.
GNBD 나 Gluster FS 등 네트워크 기반 이면서 NFS 와는 다른 구조의 파일시스템을 검토 해 보셔야 할 것 같네요.
(이건 삽질이 좀 필요합니다. 아직 한글 자료도 별로 없고요.
SAN으로 NAS 서버를 4node 정도로 구성하고 나머지 클라이언트 에게 나눠 서비스 하는 구성이 제일 적당해 보입니다.
몇대로 어떻게 구성해야 할지는 노드 갯수를 조절해 가면서 NAS 서버 한대가 처리 할 수 있는 한계를 확인 해 보시면 알 수 있습니다.)
그리고 NFS 서비스 하실때는 Jumbo frame 셋팅 해서 사용 하시는 게 성능 향상에 많은 도움이 될 겁니다.
댓글 달기