JVM 在 Ubuntu Maverick(AWS EC2 xlarge 实例)上挂起并等待 100 个 IO

JVM 在 Ubuntu Maverick(AWS EC2 xlarge 实例)上挂起并等待 100 个 IO

在 AWS 中有一个超大型实例,运行 9 个 Tomcat,堆大小从 256M 到 4G。使用 Ubuntu 10.04,该机器偶尔会挂起几个小时,运行队列很大(30-40),CPU 上没有任何资源,然后恢复。怀疑是 GC,但在使用和不使用 CMS GC 的情况下都出现了重现。

升级到 10.10 后,机器在启动后几个小时内进入 100% 等待状态,并且 CPU 上再次没有任何进程。以下是 top 的输出:

top - 18:33:44 up  3:11,  2 users,  load average: 26.99, 26.80, 25.82
Tasks: 126 total,   1 running, 125 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,  0.0%id,100.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  15373736k total, 15174780k used,   198956k free,    51288k buffers
Swap:        0k total,        0k used,        0k free,  6208956k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                       
 5910 tomcat6   20   0  746m 361m 9872 S    0  2.4   2:01.32 java                                                                           
10147 tomcat6   20   0  919m 173m 9.8m S    0  1.2   0:22.60 java                                                                           
12328 ubuntu    20   0 19276 1320  968 R    0  0.0   0:01.41 top                                                                            
    1 root      20   0 23864 2012 1300 S    0  0.0   0:00.38 init                                                                           
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd    
...

GC 日志中没有任何有用的信息(在较大的实例上,使用 MarkSweep,主要 GC 每 5 分钟发生一次,耗时约 4 秒,增量 GC 在 0.1 - 0.2 秒内完成,所有代中都有足够的可用内存)。

以下是 dstat 输出:

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  5   1  51  43   0   0|  63k  512k|   0     0 |   0     0 | 435   401 
  0   0   0 100   0   0|   0     0 |  52B  834B|   0     0 | 185   315 
  0   0   0 100   0   0|   0     0 |4997B   14k|   0     0 | 247   360 
  0   0   0 100   0   0|   0     0 |  52B  354B|   0     0 | 146   318 
  0   0   0 100   0   0|   0     0 |  52B  354B|   0     0 | 149   314 
  0   0   0 100   0   0|   0     0 |  52B  354B|   0     0 | 145   318 
  0   0   0 100   0   0|   0     0 |4997B   14k|   0     0 | 227   345 
  0   0   0 100   0   0|   0     0 |  52B  354B|   0     0 | 158   325 
  0   0   0 100   0   0|   0     0 |  52B  354B|   0     0 | 160   306 
  0   0   0 100   0   0|   0     0 |  52B  354B|   0     0 | 148   319 
  0   0   0 100   0   0|   0     0 |4619B   14k|   0     0 | 224   353

当等待时间开始飙升时,它正处于从 s3 下载/解析一堆大文件并将它们本地写入磁盘(实例存储)的最后阶段。线程转储(在 jconsole 上,无法在框上杀死 -3 - 挂起),显示单个线程在写入磁盘时被阻止。

我迷路了。接下来该翻哪块石头?这里可能发生了什么?

相关内容