Java-mysql сбой высоконагруженного приложения

У меня проблема с моим 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: logFile /java = error_file = / var /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 ответа

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

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

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

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

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

Другие вопросы по тегам