簡體   English   中英

在Linux上使用java進程的高iowait

[英]High iowait with java processes on linux

我有一個並發系統,涉及許多機器/節點。 每台機器運行幾個JVM做不同的東西。 它是一個“分層”架構,每個層都包含許多運行在機器上的JVM。 基本上,頂層JVM通過文件從外部接收輸入,解析輸入並在第二層中為“存儲”發送盡可能多的小記錄。 第二層實際上並不保留數據本身,但實際上它仍然存在於第三層(HBase和Solr)中,並且HBase實際上並不持久保存它,因為它將它發送到第四層(HDFS)以實現持久性。

層之間的大多數通信是同步的,因此它當然會在很多線程中等待較低層完成。 但我希望那些等待的線程能夠“免費”使用CPU。

我看到一個非常高的iowait(頂部%wa) - 像80-90%的iowait和只有10-20%的sys / usr CPU使用率。 系統似乎已經筋疲力盡 - 通過ssh登錄速度慢,對命令響應速度慢等。

我的問題是,所有那些等待較低層完成的JVM線程是否會導致這種情況? 它不應該是“免費”等待響應(套接字)。 對此有關重要,不同的層是否使用阻塞或非阻塞(NIO)io? 究竟在什么情況下Linux算作iowait(%wa在頂部)? 當機器上所有JVM中的所有線程都處於等待狀態時(因為在此期間沒有其他線程可以運行以執行某些有意義的操作)? 或者即使有其他進程准備好使用CPU進行實際處理,線程等待也會計入%wa?

我真的想徹底解釋它是如何工作的以及如何解釋這個高%wa。 在開始時我猜想當所有線程都在等待時它會被計為%wa,但實際上還有足夠的空間來做更多,所以我試圖增加線程數量,期望獲得更多吞吐量,但這不會發生。 所以這是一個真正的問題,而不僅僅是看頂部的“視覺”問題。

以下輸出取自僅運行HBase和HDFS的計算機。 它在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 ----
root@edrxen1-2:~# 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

Linux上的IO等待表示進程在不間斷I / O上被阻止。 實際上,它通常意味着進程正在執行磁盤訪問 - 在這種情況下,我猜是以下之一:

  • hdfs正在執行大量磁盤訪問,結果導致其他磁盤訪問速度變慢。 (檢查iostat -x可能會有所幫助,因為它會顯示一個額外的“%util”列,表示磁盤“忙”的時間百分比。)
  • 在負載下你的系統內存不足,最終有時會進入交換狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM