У меня проблема с моим html-скребком. Html-scraper — многопоточное приложение, написанное на Java с использованием HtmlUnit, по умолчанию работает со 128 потоками. Вкратце, это работает следующим образом: берет URL-адрес сайта из большого текстового файла, пингует URL-адрес и, если он доступен, анализирует сайт, находит определенные 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 machine run with default parameters except next options:
-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-адресов в секунду и работал достаточно стабильно. Но после 2-х слабых мест, когда таблица urls содержит 384929 записей (~25% всех обработанных url-ов) и занимает 8.2Gb, java-приложение стало работать очень медленно и вылетать каждые 1-2 минуты. Думаю, причина в mysql, который не справляется с растущей нагрузкой (парсер, выполняющий 2+4*BLOCK_NUMBER
запроса на каждый обработанный url; sphinx, обновляющий дельта-индексы каждые 10 минут; веб-интерфейс не рассматриваю, т.к. им пользуется только один человек ), может быть, он очень медленно перестраивает индексы? Но журналы mysql и скребка (которые также содержат все неперехваченные исключения) пусты. Что вы думаете об этом?