Уменьшить нагрузку на PHP IO - PullRequest
       49

Уменьшить нагрузку на PHP IO

1 голос
/ 23 августа 2011

У меня есть PHP-скрипт, который обслуживает множество небольших файлов (> 100 000) с размерами до 10 МБ. Он в основном загружает запрошенный файл в память и передает его клиенту. Из-за контроля доступа я не могу обслуживать эти файлы напрямую через Apache и мне нужен скрипт, обернутый вокруг него.

Если есть большой трафик (> 150 Мбит), мой жесткий диск интенсивно используется и представляет собой ограничение для масштабирования. У меня была идея, что я могу использовать memcached для уменьшения загрузки жесткого диска, так как у меня есть 10 ГБ оперативной памяти, но у memcached есть максимальный размер элемента 1 МБ. Тогда я подумал, что мог бы использовать PHP-APC, но его поведение, если в кеше не хватает памяти (полный сброс), недопустимо.

Что бы вы сделали, чтобы уменьшить нагрузку ввода-вывода?

Спасибо

Ответы [ 5 ]

1 голос
/ 23 августа 2011

Что бы вы сделали, чтобы уменьшить нагрузку ввода-вывода?

Я никогда не работал с ним сам, но метод X-Sendfile может быть полезен для принятиянемного нагрузки.Он передает задачу фактической передачи файла обратно в Apache.

0 голосов
/ 23 августа 2011

Вы можете использовать CDN, который поддерживает контроль доступа.

Однако, если вы хотите продолжать обслуживать его самостоятельно, существуют различные подходы. Вы всегда будете хотеть избежать подачи файла через PHP, потому что это ваше узкое место. Все это не очень элегантно.

  • Храните файлы вне корневого каталога HTTP и генерируйте новую символическую ссылку каждые X минут. Символические ссылки удаляются через Y раз. Затем ваш скрипт аутентификации PHP просто перенаправит пользователя на URL, в котором существует (временно действующая) символическая ссылка. Очень короткое время выполнения PHP, файлы обслуживаются Apache.
  • Храните файлы внутри корня HTTP, но вместо этого измените правила перезаписи в файле .htacess, чтобы добиться того же самого.

Уменьшите нагрузку ввода-вывода, сохранив наиболее часто используемые файлы на виртуальном диске, интегрируйте их с обычной файловой системой с помощью некоторых монтирующих или символических ссылок, а затем позвольте Apache обработать все остальное.

0 голосов
/ 23 августа 2011

Я бы использовал PHP-APC для загрузки этих файлов в кеш.

apc_add(), apc_fetch() и apc_delete() - это то, что вам нужно.Вы можете убедиться, что не переполнены, используя apc_cache_info() для определения уровней свободной памяти.Вы также можете установить apc.user_ttl INI, чтобы предотвратить полную очистку кэша при заполнении.

Настройте параметры на тестовом сервере, подвергните его высокой нагрузке (с ab или подобным) и проверьте свою статистику, используяapc.php.Твик, твик и еще немного!

0 голосов
/ 23 августа 2011

Вам понадобится либо mod_xsendfile для Apache2 , либо nginx с X-Accel-Redirect .Существует также аналогичное решение для lighttpd.Nginx также может служить из memcached .

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

0 голосов
/ 23 августа 2011

Я думаю, что вы не можете сделать это, если у вас нет 2 жестких дисков, которые разделяют эти файлы.

...