Aroused
@Aroused

Как найти узкое место в производительности скрипта?

Здравствуйте.

Есть парсер, который кушает html с чужого сервера (в пределах РФ) и возвращает некоторые данные в формате json. Пока нагрузка была 40к запросов в сутки, все было здорово. Но в данный момент количество запросов значительно увеличилось. И с этого момента, время на выполнение скрипта стало доходить до 10-20 секунд!

Операции:
  1. require библиотеки QueryPHP
  2. запрос на другой сервер с получением 100кб кода html
  3. инициализация класса QueryPHP
  4. извлечение содержимого 8 элементов DOM из ответа
  5. запрос в локальную базу данных PHP::PDO методом SELECT
  6. вывод объекта json.


Пожалуйста помогите понять, что нужно сделать? Есть ли смысл менять тариф у хостера? Хостер говорит, что производительность в первую очередь зависит от скрипта, а не от железа, и более дорогой тариф вряд ли решит мою проблему.

Конфигурация: VPS OpenVZ / Xeon 400MHz / 512mb / RAID HDD

Статистика CloudFlare (сейчас прокси отключен)
20fcadc87b1a4caebe87658ac5cd8a5c.png
Статистика от хостера за 1 час.
113a6b791a6f42cebb470ca1e9c91928.png
  • Вопрос задан
  • 462 просмотра
Решения вопроса 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
https://blackfire.io/ - для профилирования кода.

В целом первым делом надо думать над кешированием результатов парсинга, если это возможно, а не лазать каждый раз на удаленный сервер и т.д. Подозреваю что у вас именно так, и это и сжирает 99% времени.
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Правильно вам хостер говорит, скорее всего, проблема именно в скрипте.
Ну а поскольку скрипт вы не привели, обсуждать больше нечего.
Хотя нет, можно ответить на заглавный вопрос - используйте xhprof.

Может быть, стоит заменить QueryPHP на регулярные выражения или стандартный DOMDocument. Но это несёт свои ограничения, как правило, парсить html регулярками - плохая идея.
Ответ написан
@lubezniy
Раз пошла такая пьянка (не удаётся кэшировать обращения к чужому серверу), то вот возможные варианты:

1. По возможности кэшировать select из Вашей базы в memcache или куда-то ещё, чтобы каждый раз не подключаться к БД (есть не очень большая, но вероятность, что поможет);
2. Перенести скачивание и парсинг страниц стороннего сайта (а, может, и select к базе заодно) на другие виртуальные машины (может, даже в другом дата-центре, чтобы не забивать канал), балансируя нагрузку между ними (например, по результату выполнения функции mt_rand обращаться то к одной машине, то к другой, то к третьей - количество подобрать экспериментально).

Важно учесть то, что владельцам стороннего сайта большой трафик с нескольких ip может и не понравиться.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы