저는 데이터 스토리지 요구 사항에 NFS를 사용하는 클러스터의 사용자입니다. 최근에 일부 작업 중에 I/O가 매우 높은 파이프라인을 실행하고 있습니다.
문제를 일으키는 것으로 생각되는 프로그램의 이름은 Bioinformatic 파이프라인의 정렬 장치인 Bowtie입니다. 간단히 말해서, 전체 사전을 포함하는 다른 파일과 비교되는 파일당 100만 줄의 조각화된 파일에 알파벳 순서가 있습니다. (이것은 알고리즘을 지나치게 단순화한 것입니다.)
이 사전은 절차 중에 매핑된 메모리입니다. 클러스터의 세 노드에 대한 대기열 제출 권한이 있습니다.
노드: Node1 Node2 Node3 Node4 Node5 Node6 Node7
내 권리: Node1 Node2 Node3
사용 가능한 프로세서 수: 프로세서 128개 또는 실행 대기열 슬롯 128개.
클러스터에서 실행하기 위해 기본 파일은 각각 100만 줄의 청크로 나누어지고 모든 작업은 SGE를 사용하여 시작됩니다.
이 시점의 사전은 각 노드, 즉 Node1 2 및 3의 메모리에 로드됩니다.
대기열 슬롯에서 활성화된 각 작업에 대해 다음 파일 처리기가 열려 있습니다.
실행할 코드가 포함된 작업 파일 1개 프로세스의 종료 코드가 포함된 코드 파일 1개 SGE에서 생성된 STDOUT 파일 1개 SGE에서 생성된 STDERR 파일 1개 파일 청크 1개 출력 파일
즉, 이 프로세스 동안 원격 데이터 저장소에 768+3개의 파일 핸들러가 열려 있지만 처음 4개 파일은 파이프라인의 모든 단일 스크립트에 대해 일정합니다.
이런 일이 발생할 때마다 데이터 스토리지의 NFS 서버가 충돌하고 스토리지가 응답하지 않기 때문에 전체 클러스터가 다운됩니다.
우리 IT 직원은 이것이 이 프로세스 중 높은 I/O 때문일 수 있으며 NFS는 대규모 클러스터가 아닌 소규모 클러스터에만 사용되었을 가능성이 있다고 제안했습니다.
따라서 우리는 노드 자체 중 하나에서 이 프로세스를 실행할 계획인 솔루션으로 문제를 해결했습니다. 그러나 모든 클러스터에서 공유되는 데이터 저장소가 아니라 노드의 디스크에 쓰기 때문에 클러스터를 마음대로 사용할 수 있다는 점은 무효화됩니다.
NFS가 소규모 클러스터용으로 구축되었으며 대규모 엔터프라이즈 규모 솔루션에서 성공적으로 구현된 적이 없다는 사실이 믿기지 않습니다. NFS가 갑자기 네트워크 연결을 끊는 또 다른 이유가 있을 수 있습니까?
프로세스에 대한 질문이 클러스터 정지의 원인이라고 확신하지만, 프로세스에 필요한 읽기/쓰기 속도가 실패의 원인이라고 확신하지는 않습니다. 이전에 이런 문제를 경험하신 분 계신가요? 완전한 프로토콜 마이그레이션이 우리가 가지고 있는 유일한 솔루션입니까?
답변1
수년에 걸쳐 배운 몇 가지 제안.
- NFS 서버의 로드를 최소화합니다.
NFS 내보내기 옵션을 설정합니다.async,insecure,no_subtree_check
NFS 마운트 옵션 설정soft,noatime,nodiratime,nolock,vers=3
또한 다음을 설정합니다: noatime,nodiratime
data/tmp/scratch 마운트. 로드를 줄이려면 NFS 암호화가 꺼져 있는지 확인하세요. NFS 잠금 프로세스를 중지합니다.
모든 호스트에서 네트워크에 대해 JUMBO 프레임을 활성화해 보십시오(네트 장비에서 지원하는 경우). MTU를 9k 정도로 설정하십시오.
무작위 쓰기 IO에 raid10 스토리지가 사용되는지 확인하십시오(모든 비용을 들여 raid5/6을 피하십시오). SSD가 있나요?
열려 있는 FS 핸들 수를 최대화하고(일부 시스템에서는 기본값은 2K) 1M 정도로 설정합니다.
입력 데이터가 포함된 매핑 데이터베이스를 로컬 스크래치 노드 저장소에 복사하고 결과 샘 파일을 별도의 단계로 결합/정렬할 수 있는 기회가 있습니까?
처리되는 청크의 크기를 늘립니다. (최소 30분 이상 처리되도록 합니다.)
가능하다면가능한 최고 수준에서 작업을 분할(10개의 호스트를 사용하여 각 게놈을 연속적으로 매핑하는 대신 10개의 서로 다른 노드에서 10개의 개별 게놈/샘플을 병렬로 매핑/정렬해 보세요). 모든 프로세스가 완료되면 체크포인트를 시도합니다.
프로그램 소스를 수정하여 4k 대신 1M과 같은 더 큰 청크로 데이터를 읽습니다.
CPU/RAM 상호 연결 경합(특히 AMD 4-8 소켓 시스템)에 유의하십시오. 때로는 48개 코어 상자에서 12-24개 스레드를 실행하는 것이 48개 스레드보다 훨씬 빠릅니다. 다양한 활용도 수준을 시도해 보세요. 다중 CPU 시스템에 대해 NUMA가 켜져 있고 구성되어 있는지 확인하십시오. NUMA를 활성화하여 다시 컴파일합니다.
추신: 효율적인 클러스터를 관리하는 것은 1,000명 이상의 작업자가 있는 건물 현장을 계획/관리하는 것과 유사합니다...