Аварийное завершение работы приложения Java-mysql - PullRequest
0 голосов
/ 17 января 2012

У меня проблема с моим html-шабером. Html-scraper - это многопоточное приложение, написанное на Java с использованием HtmlUnit, по умолчанию оно работает с 128 потоками. Вкратце, он работает следующим образом: он берет URL-адрес сайта из большого текстового файла, URL-адрес ping и, если он доступен, - анализирует сайт, находит определенные html-блоки, сохраняет всю информацию о url и блоках, включая html-код, в соответствующих таблицах в базе данных и переходит на следующий сайт. База данных MySQL 5.1, есть 4 таблицы InnoDb и 4 представления. Таблицы имеют числовые индексы для полей, используемых при объединении таблиц. У меня также есть веб-интерфейс для просмотра и поиска проанализированных данных (для поиска я использую Sphinx с дельта-индексами), написанный на CodeIgniter.

Конфигурация сервера:

CPU: Type Xeon Quad Core X3440 2.53GHz
RAM: 4 GB
HDD: 1TB SATA
OS: Ubuntu Server 10.04

Некоторые настройки MySQL:

key_buffer = 256M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 128
max_connections = 400
table_cache = 64
query_cache_limit = 2M
query_cache_size = 128M

Java-машина работает с параметрами по умолчанию, за исключением следующих параметров:

-Xms1024m -Xmx1536m -XX:-UseGCOverheadLimit -XX:NewSize=500m -XX:MaxNewSize=500m -XX:SurvivorRatio=6 -XX:PermSize=128M -XX:MaxPermSize=128m -XX:ErrorFile=/var/log/java/hs_err_pid_%p.log 

Когда база данных была пуста, процесс очистки занимал 18 URL в секунду и был достаточно стабилен. Но после двух слабых мест, когда таблица URL-адресов содержит 384929 записей (~ 25% от всех обработанных URL-адресов) и занимает 8,2 ГБ, Java-приложение начало работать очень медленно и вылетать каждые 1-2 минуты. Я предполагаю, что причина в mysql, который не может справиться с растущей загрузкой (парсер, который выполняет 2+4*BLOCK_NUMBER запросов на каждый обработанный URL; sphinx, который обновляет дельта-индексы каждые 10 минут; я не рассматриваю веб-интерфейс, потому что он используется только один человек), может, очень медленно перестраивать индексы? Но журналы mysql и scraper (которые также содержат все необработанные исключения) пусты. Что вы думаете об этом?

Ответы [ 3 ]

0 голосов
/ 18 января 2012

То есть приложение перестало отвечать на запросы? (Совсем не то же самое, что крах) Я бы проверил, все ли ваши ресурсы свободны. например выполните jstack, чтобы проверить, связаны ли какие-либо потоки.

Проверьте, есть ли в MySQL ожидаемое количество соединений. Если вы постоянно создаете соединения в Java и не очищаете их, база данных будет работать все медленнее и медленнее.

0 голосов
/ 18 января 2012

Спасибо всем за ваш совет, MySQL был на самом деле причиной проблемы.Включив медленный журнал запросов в my.conf, я вижу, что один из запросов, который выполняет каждую итерацию, выполняет 300 секунд (1 поле для поиска не было проиндексировано).

0 голосов
/ 17 января 2012

Я бы порекомендовал выполнить следующее, только чтобы проверить несколько вещей о статусе ... размещение этого вывода также поможет:

  1. dmesg
  2. top Проверкарезидентная или виртуальная память на процессы
...