평소 2 초면 끝나던 hdfs dfs -put 이 30 초씩 걸리고, 클라이언트와 DataNode 로그에 지연 경고가 찍힌다.
Slow waitForAckedSeqno took 32574ms. file being written: /user/<user>/.staging/libjars/<file>.jar
Slow BlockReceiver write packet to mirror took ...ms
Slow flushOrSync took ...ms
Slow BlockReceiver write data to disk cost ...ms
DataNode 가 찍는 Slow ... 계열 메시지는 어느 구간이 느렸는지를 이름으로 알려 준다.
| 메시지 | 느린 구간 |
|---|---|
Slow BlockReceiver write data to disk |
로컬 디스크 쓰기 |
Slow flushOrSync |
디스크 flush · fsync |
Slow BlockReceiver write packet to mirror |
파이프라인 다음 DataNode 로의 네트워크 전송 |
Slow waitForAckedSeqno(클라이언트) |
파이프라인 전체의 ACK 대기. 위 셋 중 어디든 원인일 수 있다 |
클라이언트 쪽 waitForAckedSeqno 만 보고 원인을 정할 수 없다. DataNode 쪽 메시지를 함께 봐야 디스크인지 네트워크인지 갈린다.
HDFS 자체 문제인지 하부 하드웨어 문제인지 가르려면 같은 노드에서 OS 수준 측정을 먼저 한다.
dd if=/dev/zero of=/<data-dir>/testfile bs=1M count=2000 oflag=direct
iostat -x 1 10
%util 이 지속적으로 높고 await 가 크면 디스크 병목이다. DataNode 데이터 디렉터리가 있는 장치를 봐야 한다.
iperf3 -c <datanode-ip>
netstat -i
ping -c 20 <datanode-ip>
RX-ERR · TX-DRP 가 늘어나거나 대역폭이 기대보다 크게 낮으면 네트워크 쪽이다.
hadoop jar <hadoop-mapreduce-client-jobclient-tests>.jar TestDFSIO \
-write -nrFiles 10 -fileSize 100
hadoop jar <hadoop-mapreduce-client-jobclient-tests>.jar TestDFSIO \
-read -nrFiles 10 -fileSize 100
TestDFSIO 처리량이 로컬 디스크 성능에 가깝게 나오는데도 hdfs dfs -put 만 느리다면, 병목은 대역폭이 아니라 지연 쪽이다. 작은 파일을 여러 개 쓰는 패턴에서는 파이프라인 왕복 지연이 그대로 드러난다.
복제 파이프라인이 원인인지 보려면 복제 1 로 같은 파일을 써 본다.
hdfs dfs -D dfs.replication=1 -put <file> /tmp/
이때 빨라지면 원인은 파이프라인의 2 · 3 번째 DataNode 구간(다른 랙일 가능성)이다. 그대로 느리면 첫 번째 DataNode 의 로컬 디스크다.
현재 복제 수는 이렇게 본다.
hdfs dfs -stat %r /path/to/file
hdfs fsck /path/to/file -files -blocks -locations
hdfs dfs -setfattr 로 복제 수를 바꾸는 방법은 없다. 복제 수는 dfs.replication 이거나 hdfs dfs -setrep 이다.
hdfs dfs -setrep -w 1 /tmp/<path>
동시 전송이 많은 클러스터에서 기본값이 모자란 경우가 있다.
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>16384</value>
</property>
이 값은 DataNode 재시작이 필요하다. 클라이언트에서 -D 로 넘겨도 서버 쪽 값이라 적용되지 않는다.
특정 DataNode 나 특정 디스크에 블록이 몰려 있으면 그 노드가 파이프라인에 들어갈 때마다 느려진다.
du -sh /<data-dir>*/current/BP-*
hdfs dfsadmin -report
노드 간 편중은 Balancer, 노드 안 디스크 간 편중은 Disk Balancer 로 푼다.