2012-02-21 3 views
11

나는 많은 기계들/노드들이있는 동시 시스템을 가지고 있습니다. 각 기계는 여러 가지 JVM을 실행하여 다른 작업을 수행합니다. 이는 각 계층이 여러 시스템에서 실행되는 많은 JVM으로 구성되는 "계층화 된"구조입니다. 기본적으로 최상위 계층 JVM은 파일을 통해 외부로부터 입력을 받아 입력을 파싱하고 레이어 2의 "저장소"에 대한 여러 개의 작은 레코드로 보냅니다. 레이어 2는 실제로 데이터 자체를 유지하지 않지만 HBase 및 Solr 레이어 3에 실제로 지속되며 HBase는 지속성을 위해 레이어 4 (HDFS)로 전송하기 때문에 실제로 자체를 유지하지 않습니다.리눅스에서 java 프로세스가 많은 iowait가 있습니다.

대부분의 계층 간 통신은 동기화되어 있으므로 하위 계층이 완료 될 때까지 기다리는 스레드가 많습니다. 하지만 기다리는 스레드가 "무료"CPU 사용량이 될 것으로 기대합니다.

나는 80-90 % iowait와 sys/usr CPU 사용량이 10-20 % 밖에되지 않는 매우 높은 iowait (맨 위 %)를 볼 수 있습니다. 시스템이 고갈 된 것 같습니다 - ssh를 통해 로그인하는 속도가 느려지고 명령에 응답하는 속도가 느려짐

하위 계층을 완료하기 위해 대기하는 모든 JVM 스레드가이 문제를 일으킬 수 있습니다. 응답 (소켓)을 기다리는 "자유로운"것이 아닌가? 다른 레이어가 블로킹 또는 비 블로킹 (NIO)을 사용하는지 여부와 관련하여 중요합니까? 정확히 어떤 상황에서 리눅스는 무엇인가를 iowait로 간주합니까? 머신의 모든 JVM에있는 모든 스레드가 대기중인 상황에있는 경우 (그 동안 의미있는 작업을 수행 할 다른 스레드가 없으므로 계산)? 또는 실제 처리를 위해 CPU를 사용할 준비가 된 다른 프로세스가 있더라도 대기중인 스레드는 % wa로 계산됩니까?

나는 그것이 어떻게 작동하는지,이 높은 % wa를 해석하는 방법에 대한 철저한 설명을 원합니다. 처음에는 모든 스레드가 대기하고 있지만 실제로는 더 많은 공간을 확보 할 수 있기 때문에 더 많은 처리량을 얻으려는 스레드의 수를 늘리려고했지만 % was으로 계산했다고 추측했습니다. . 그래서 그것은 진짜 문제입니다. 꼭 봐야하는 "시각적 인"문제가 아닙니다.

아래 출력은 HBase 및 HDFS 만 실행중인 컴퓨터에서 가져온 것입니다. 그것은 IO 리눅스에서 대기

--- jps --- 
19498 DataNode 
19690 HRegionServer 
19327 SecondaryNameNode 

---- typical top ------- 
top - 11:13:21 up 14 days, 18:20, 1 user, load average: 4.83, 4.50, 4.25 
Tasks: 99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie 
Cpu(s): 14.1%us, 4.3%sy, 0.0%ni, 5.4%id, 74.8%wa, 0.0%hi, 1.3%si, 0.0%st 
Mem: 7133800k total, 7099632k used, 34168k free, 55540k buffers 
Swap: 487416k total,  248k used, 487168k free, 2076804k cached 
    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ 
COMMAND 
19690 hbase  20 0 4629m 4.2g 9244 S 51 61.7 194:08.84 java 
19498 hdfs  20 0 1030m 116m 9076 S 16 1.7 75:29.26 java 

---- iostat -kd 1 ---- 
[email protected]:~# iostat -kd 1 
Linux 2.6.32-29-server (edrxen1-2)  02/22/2012  _x86_64_  (2 CPU) 
Device:   tps kB_read/s kB_wrtn/s kB_read kB_wrtn 
xvda    3.53   3.36  15.66 4279502 19973226 
dm-0   319.44  6959.14  422.37 8876213913 538720280 
dm-1    0.00   0.00   0.00  912  624 
xvdb   229.03  6955.81  406.71 8871957888 518747772 
Device:   tps kB_read/s kB_wrtn/s kB_read kB_wrtn 
xvda    0.00   0.00   0.00   0   0 
dm-0   122.00  3852.00   0.00  3852   0 
dm-1    0.00   0.00   0.00   0   0 
xvdb   105.00  3252.00   0.00  3252   0 
Device:   tps kB_read/s kB_wrtn/s kB_read kB_wrtn 
xvda    0.00   0.00   0.00   0   0 
dm-0    57.00  1712.00   0.00  1712   0 
dm-1    0.00   0.00   0.00   0   0 
xvdb    78.00  2428.00   0.00  2428   0 

--- iostat -x --- 
Linux 2.6.32-29-server (edrxen1-2)  02/22/2012  _x86_64_  (2 CPU) 
avg-cpu: %user %nice %system %iowait %steal %idle 
      8.06 0.00 3.29 65.14 0.08 23.43 
Device:   rrqm/s wrqm/s  r/s  w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util 
xvda    0.00  0.74 0.35 3.18  6.72 31.32 10.78  0.11 30.28 6.24 2.20 
dm-0    0.00  0.00 213.15 106.59 13866.95 852.73 46.04  1.29 14.41 2.83 90.58 
dm-1    0.00  0.00 0.00 0.00  0.00  0.00  8.00  0.00 5.78 1.12 0.00 
xvdb    0.07 86.97 212.73 15.69 13860.27 821.42 64.27  2.44 25.21 3.96 90.47 

--- free -o ---- 
      total  used  free  shared buffers  cached 
Mem:  7133800 7099452  34348   0  55612 2082364 
Swap:  487416  248  487168 
+0

내가 여기 저기 비슷한 질문의 다양성을 볼 수 있지만에 Serverfault에이 하나 WRT 하드웨어 오류를 시도 할 몇 가지 사항이 있습니다 http://serverfault.com/questions/83778/finding-the-root- 100-iowait-in-linux의 원인 다음은 같은 줄에있는 또 다른 설명입니다. 즉, 문제가있는 다른 디버깅과 함께 오류 조건이있을 수 있습니다. http://www.articledashboard.com/Article/Linux -and-High-IO-Wait/959842 –

+0

여러 물리적 시스템에서이를 볼 수 있다고 가정하면 생각한 오류 조건은 계속 발생하지 않지만 이러한 도구의 도구는 기다려.그런 말로, 나는 누군가가 당신의 질문의 일부인 "어떻게 작동하는지에 대한 철저한 설명"에 응답하는 것에 매우 관심이 있습니다. –

+0

상단에 상태 열이 있습니다. 하나의 상자에서 스레드를 볼 때 무엇이 ​​표시됩니까? 'top '출력을 제공 할 수 있습니까? 'iostat -kd 1'의 결과는 무엇입니까? 'free -o' 결과? – ingyhere

답변

2

이 프로세스가 무정전 I/O에 차단하고 있음을 나타냅니다 문제 내가 (가장 명확하게)를 보여주는 것을 HBase를 및/또는 HDFS와 기계에 있습니다. ,

  • HDFS가 디스크 액세스를 많이 수행과는 다른 디스크 액세스 속도가 느린 만들고있다 : 나는 다음 중 하나를 추측에는 요이 경우 - 실제로, 그것은 일반적 의미 프로세스가 디스크 액세스를 수행하고 있음 그 결과로 (iostat -x을 확인하면 디스크가 "사용 중"인 시간의 백분율을 나타내는 추가 "% util"열이 표시되므로 도움이됩니다.)
  • 로드가 부족한 상태에서 시스템 메모리가 부족하여 종료 중입니다. 때로는 스왑에 잠기는 것.
+0

응답 해 주셔서 감사합니다. "iostat -x"의 출력을 원래 게시물에 추가했습니다. –

+1

OS 측면에서 볼 때 IO 대기로 간주되는 것이 "uninterruptable I/O"라는 것을 알고있었습니다. 하지만 그것은 자바 코드의 어떤 종류의 쓰레드가 "uninterruptable I/O"를하는지 분명히하지 않습니다. JVM은 일반적으로 1-1을 OS 프로세스와 매핑하지 않는 여러 스레드를 실행합니다. 따라서 하나의 OS 프로세스가 많은 JVM 스레드의 작업을 실행하게됩니다. 그렇다면 "unint I/O"를 수행하는 스레드는 "unint I/O"를 수행하는 것으로 계산되는 프로세스로 어떻게 변환됩니까? - 모든 스레드가 Unint I/O를 수행 할 때 또는 일부 스레드가이를 수행 할 때? 또는? 그게 질문의 핵심이었습니다. –

+0

iostat 출력은 장비가 가동 중일 때 평균 90 %의 디스크 사용량을 기록했다는 것을 알려줍니다. 더 빠르고 더 빠른 디스크를위한 시간! – duskwuff

관련 문제