вторник, 24 июля 2012 г.

Java vs OpenVZ + CentOS kermel update 2.6.32-042

У нас имеется небольшой веб-сервис бегающий на Apache Tomcat 6.0.32, размещенный на VPS. На этом VPS также размещены клиентские сайты под управлением NetCAT CMS - собственно сервис работает для передачи данных из БД этой CMS в мобильное приложение

В прошлую среду (в середину моего отпуска!) VPS ушел в отказ. Точнее сказать начал очень сильно тормозить. Наш админ отправил VPS в restart. После перезапуска работа клиентских сайтов нормализовалась, а вот Tomcat перестал запускаться.

Симптомы:
1. Запуск - в логах может начать что-то выдаваться, а может и ничего не выдаваться
2. Процесс java висит нагрузки на CPU не дает (периодиески по 0.3% скачет)
3. Удалили все приложения запустили чистый tomcat - запустился, работает и отвечает по http.
4. Делаем деплой нашего небольшого приложения. В логах выдается
Jul 18, 2012 4:17:55 PM org.apache.catalina.startup.HostConfig deployDescriptor                                                    
INFO: Deploying configuration descriptor WebApplication.xml
И всё
5. Чистый Tomcat не всегда запускается, иногда крешится:
#                                            
# A fatal error has been detected by the Java Runtime Environment:
#                                            
#  Internal Error (synchronizer.cpp:1429), pid=1083, tid=3040942992
#  guarantee(mid->header()->is_neutral()) failed: invariant              
#
# JRE version: 7.0_05-b06
# Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing linux-x86 )
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#                                        
# An error report file with more information is saved as:
# /srv/java/tomcat6/conf/hs_err_pid1083.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
6. Иногда в Tomcat выдается:
Exception in thread "Reference Handler" java.lang.IllegalMonitorStateException
        at java.lang.Object.notifyAll(Native Method)
        at java.lang.ref.ReferenceQueue.enqueue(ReferenceQueue.java:51)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:129) 


Мои коллеги в моё отсутствие пробовали переустановить JRE, поставить свежую 1.7, ставили новый tomcat. Картина та же. Обращались в техподдержку - явно были произведены какие-то изменения в конфигурации VPS - безрезультатно.

В понедельник перенесли сервис на наш сервер и на VPS клиента включили HTTP-прокси на наш сервак.

Итог

Первое что нашел http://serverfault.com/questions/389152/java-hangin-and-crashing-on-centos-6
Оттуда сюда http://forum.proxmox.com/threads/6998-Best-strategy-to-handle-strange-JVM-errors-inside-VPS

Проверили систему установленную на VPS - Хостинг-провайдер провел обновление ядра - сборка свежая от 10 мая (2.6.32-042stab055.10 #1 SMP Thu May 10 15:38:32 MSD 2012 i686 i686 i386 GNU/Linux)!

По какой-то причине с последней версией ядра в OpenVZ Container-е с 1 CPU Java не работает.

Из предложенных решений в обсуждении по последней ссылке:
1. Увеличить кол-во CPU как минимум до 2-х
2. Откатить обновление.

Мы всю информацию передали хостинг-провайдеру. Благо дело, техподдержка отреагировала очень адекватно - пошла навстречу и увеличила число CPU до 2-х. Всё заработало.