Назад | Перейти на главную страницу

JVM зависает с ожиданием 100 операций ввода-вывода на Ubuntu Maverick (экземпляр AWS EC2 xlarge)

У вас есть экземпляр xlarge в AWS, на котором запущено 9 Tomcats с кучей от 256M до 4G. В Ubuntu 10.04 ящик периодически зависает на несколько часов с огромной очередью выполнения (30-40) и ничего не загружает процессор, а затем восстанавливается. Заподозрил GC, но перепроверил как с CMS GC, так и без нее.

После обновления до 10.10 машина переходит в режим 100% ожидания через пару часов после запуска, опять же без процессов на ЦП. Вот вывод сверху:

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    
...

Ничего полезного в журнале сборщика мусора (в более крупных экземплярах с MarkSweep основной сборщик мусора происходит каждые 5 минут и занимает ~ 4 с, инкрементный завершается за 0,1–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 на поле - зависает), показывает, что один поток заблокирован при записи на диск.

Я потерян. Какой камень повернуть следующим? Что здесь может происходить?