У меня проблема с моим 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 (которые также содержат все необработанные исключения) пусты. Что вы думаете об этом?