Назад | Перейти на главную страницу

Сервер получает довольно много запросов в секунду

Я запускаю веб-сайт для размещения изображений. Мой сервер может получать от 8 запросов в секунду до 20 запросов в секунду в часы пик. В настоящее время я запускаю сервер на текущем оборудовании:

Процессор AMD Hexa-Core Speed ​​6 ядер x 2,8 ГГц (3,3 Turbo Core) ОЗУ 16 ГБ DDR3 ECC Место на жестком диске 1000 ГБ (2 x 1000 SATA) Программный RAID RAID 1

Полные спецификации http://www.1and1.com/ServerPremiumXL?__lf=Static&linkOrigin=ServerPremium&linkId=ct.btn.package.xl Заказал сервер XL6.

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

Я установил eaccelerator, который, кажется, помогает, но недостаточно помогает. В какой-то момент у меня также был установлен X-SendFile, который, похоже, тоже помог, но мне пришлось временно удалить его из-за проблем с Apache, хотя я хочу попытаться вернуть его.

Я здесь в основном прошу совета, чтобы я мог легко настроить свой сервер, чтобы легко обрабатывать 50 запросов в секунду (если только это не совсем неразумно). Я сам разработчик и не слишком разбираюсь в linux / apache, хотя знаю основы. Я тоже хочу учиться. Спасибо за любую информацию.

Здесь вы можете сделать несколько вещей. Во-первых, вы упомянули, что вы обслуживаете изображения с помощью readfile ()? Это может быть здесь виновником, поскольку именно PHP обслуживает изображения. По своей сути это не намного медленнее, чем их статическое обслуживание, и дает множество преимуществ (например, динамическая обработка изображений), но в результате вы можете столкнуться с рядом подводных камней. С точки зрения сервера всегда намного быстрее обрабатывать изображения как статические.

Прежде всего, ваш скрипт - тот, который возвращает изображения - выталкивает правильные заголовки? То есть отправляете ли вы заголовки Cache-control и Expires, которые сообщают пользовательским агентам о необходимости кэширования изображений? Ваш трафик может быть связан с тем, что ваши изображения обслуживаются постоянно или слишком часто. Также отправьте заголовок Last-modified.

Вы также можете отправить заголовок Not-modified в качестве ответа, если пользовательский агент делает запрос на файл, и вы знаете, что он не был изменен с даты, которую предоставляет пользовательский агент.

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

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

(Обратите внимание, что для сравнения полезно сравнить страницу с размером X с изображением размера X, чтобы пропускная способность была одинаковой, и вы могли просто оценить производительность).

РЕДАКТИРОВАТЬ:

Заголовки кэша, которые сообщают пользовательским агентам, что запрашивают кэширование файла как можно дольше, следующие:

$lastModified=filemtime($myPicture); // File location of your image
$cacheDuration=31536000; // One year
// This tells user agent to keep the cache for one year
header('Cache-Control: public,max-age='.$cacheDuration);
header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
// This tells the user agent the last modified time of your image
header('Last-Modified: '.gmdate('D, d M Y H:i:s',$lastModified).' GMT');

Обслуживание неизмененных заголовков немного сложнее:

// Testing if the servers known last modified time is different from the last modified time of file on your server
// If those times are the same, then we will not return the image and just tell the user agent to use their cache
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$lastModified){
    // Cache headers (Last modified is never sent with 304 header, since it is often ignored)
    header('Cache-Control: public,max-age='.$cacheDuration);
    header('Expires: '.gmdate('D, d M Y H:i:s',(time()+$cacheDuration)).' GMT');
    // Returning 304 header
    header('HTTP/1.1 304 Not Modified');
    die();
}

Это может быть такой же вопрос, как и ответ, так что, возможно, кто-то с опытом может взвесить это. Будет ли RAM-диск полезен в этой ситуации? Я не знаю, сколько изображений вы размещаете, но что, если бы вы поместили наиболее часто используемые изображения (с очевидным ограничением того, сколько из них поместится в оперативный диск) на оперативный диск. Затем всякий раз, когда вы или пользователь добавляете или редактируете фотографию, вы вносите изменения в постоянную копию на диске, а также в копию, хранящуюся в ОЗУ. При таком большом количестве поступающих запросов можно подумать, что исключение шага «чтение с диска» поможет ускорить процесс.

у меня вопрос: вы действительно хотите направлять их через PHP на выходе? это ужасно много умноженной обработки, учитывая, что каждая страница, вероятно, просматривает несколько изображений. поэтому узким местом становится PHP, и это язык сценариев.

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