2012-02-21 112 views
11

私は、多数のマシン/ノードが関与する並行システムを持っています。各マシンは、異なるものを実行するいくつかのJVMを実行します。これは、階層化されたアーキテクチャであり、各レイヤーはマシン間で実行される多数のJVMで構成されています。基本的に最上位層のJVMは、外部からファイルを介して入力を受け取り、入力を解析し、レイヤー2の「記憶域」用の小さなレコードとして送信します。レイヤー2は実際にデータ自体を保持するのではなく、実際にレイヤー3(HBaseとSolr)でそれを保持し、HBaseはそれを持続性のためにレイヤー4(HDFS)に送信するので、それ自体を保持しません。LinuxでJavaプロセスを使用したiowaitが高い

レイヤ間の通信の大部分は同期されているので、もちろん、下位レイヤが完了するのを待っているスレッドが多くなります。しかし、私は待っているそれらのスレッドがCPU使用率が "無料"であることを期待しています。

私は80-90%iowaitやsys/usr CPU使用率が10-20%のような非常に高いiowait(上の%wa)があります。システムは使い果たされているようです - ssh経由でログインするのが遅く、コマンドなどに応答するのが遅くなります。

下位レイヤーを完了するのを待っているすべてのJVMスレッドがこれを引き起こす可能性がありますか?それは応答(ソケット)を待っている "無料"ではないはずですか?異なるレイヤーがブロッキングまたはノンブロッキング(NIO)を使用しているかどうかは関係ありませんか? Linuxがiowaitとして何かを数えているのはまさにどのような状況ですか?マシン上のすべてのJVMのすべてのスレッドが待機している状況にある場合(その間に意味のある何かを実行するために実行する他のスレッドがないのでカウントする)または、実際の処理にCPUを使用する準備ができている他のプロセスがあるにもかかわらず、待機中のスレッドも%waでカウントされますか?

私は本当にそれがどのように動作し、どのようにこの高い%WAを解釈するのかに関する完全な説明を得たいと思うでしょう。最初は、すべてのスレッドが待機している場所を%waとしてカウントしていましたが、実際にはもっと多くの処理を行う余地があるので、より多くのスループットを期待しているスレッドの数を増やそうとしましたが、 。だから、それは真の問題であり、トップを見る "視覚的な"問題だけではありません。

以下の出力は、HBaseとHDFSのみが動作しているマシンからのものです。それは私が(最も明確)

--- 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の上のこの1つは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

上部に状態列があります。 1つのボックスにスレッドを表示すると、何が表示されますか? 'top'出力を提供できますか? 'iostat -kd 1'の結果は? 'free -o'の結果は? – ingyhere

答えて

2

を示す問題IOは、Linux上で待機していることのHBaseおよび/またはHDFSを持つマシン上にあるプロセスが無停電I/Oでブロックされていることを示しています。実際には、一般的に、プロセスはディスクアクセスを実行していることを意味します - このケースでは、私は、次のいずれかを推測したい:

  • HDFSは、ディスクの多くのアクセスを実行している、そしてそれは他のディスクアクセスが遅くなっています結果として。 (iostat -xをチェックすると、それはディスクが「ビジー」である時間の何パーセントを示している余分な「%utilの」コラムを紹介として、役立つことがあります。)
  • あなたは負荷の下で、システムメモリが不足している、と終了していますときどきスワップに浸る。
+0

お返事ありがとうございます。私は "iostat -x"の出力を元の投稿に追加しました。 –

+1

私は、OS側から見たIO待機と見なされることを、 "uninterruptable I/O"と認識していました。しかし、それはJavaコードのどのような種類のスレッドがスレッドを "uninterruptable I/O"にするかを明確にしていません。 JVMは、通常、1-1をOSプロセスとマッピングしない複数のスレッドを実行します。したがって、1つのOSプロセスが多くのJVMスレッドの作業を実行します。では、「unint I/O」を実行するスレッドは、「unint I/O」を実行するとカウントされるプロセスにどのように変換されますか?すべてのスレッドがUnint I/Oを実行しているか、または?それが問題の本質でした。 –

+0

iostatの出力には、マシンが稼動している間にディスクが平均90%使用中であることが示されています。より多くの、より速いディスクのための時間! – duskwuff