Загрузка сервера, совмещение вызовов системных функций

Web-сервер взаимодействует с TCP посредством последовательностей вызовов системных функций. Выполнение нескольких действий с помощью одного системного вызова предоставляет операционной системе дополнительную информацию, которая может увеличить эффективность передачи данных. Рассмотрим Web-cepвер под управлением операционной системы UNIX, обрабатывающий запрос GET для статического файла:

1. Прослушивание запросов на новые соединения. Сервер прослушивает запросы на новые соединения, а операционная система поддерживает очередь соединений.

2.       Установка нового соединения. Сервер получает повое соединение из очереди, используя системный вызов accept(). Вызвав эту функцию, сервер получает соединение для взаимодействия с клиентом, пославшим запрос. Готовясь передать данные клиенту, сервер может вызвать функцию setsockopt(), чтобы отключить алгоритм Нагла.

3.       Создание ответного сообщения. Сервер делает один или более вызовов функции read(), чтобы прочесть запрос клиента. Потом сервер анализирует запрос и идентифицирует запрашиваемый файл. Сервер открывает этог файл с помощью вызова opeti(). Сервер может делать другие системные вызовы для создания заголовка HTTP-ответа (например, для определения текущего времени, размера файла и даты последней его модификации и т.д.).

4.       Передача ответного сообщения. После создания заголовка НТТР-ответа, сервер использует системный вызов write(), чтобы передать его. Затем сервер может начинать передачу файла. Это включает в себя вызов read() для чтения файла и write() для передачи данных соединению. Если выходной буфер полон, операционная система может не дать серверу сделать еще один вызов write(‘), пока предшествующие данные не будут успешно переданы клиенту.

5.       Закрытие файла и, возможно, соединения. Записав последний байг ответа, сервер может закрыть файл с помощью close() и дополнительно с помощью этой же функцией закрыть соединение. Если сервер использует долговременные соединения, а клиент не передал запроса на закрытие соединения, сервер может оставить соединение открытым для последующей передачи. Наконец, сервер может вызвать write(), чтобы внести запись в журнал сервера.

Системный вызов обычно требует переключения контекста между серверным приложением и операционной системой. Выполнение нескольких действий с помощью одного вызова позволяет снизить пагрузку и уменьшить задержки, связанные с переключением контекста. Выполнение нескольких действий с помощью одного системного вызова также оптимизирует работу TCP [NBK99j:

•          Передача содержимого файла напрямую операционной системе. Чтобы выполнить запрос GET, Web-сервер должен прочитать файл и записать его в выходной буфер. Во многих случаях сервер не анализирует и не изменяет содержимое файла. Чтение файла и затем запись его в выходной буфер приводит к ненужным накладным расходам. Данные копируются из файловой системы в область памяти приложения, а йогом из области памяти приложения в выходной буфер операционной системы. Вместо этого данные могут копироваться в буфер напрямую из файловой системы с помощью единственного системного вызова. В большинстве операционных систем имеется системный вызов sendfile() или transmitfile() для выполнения дапной операции.

•          Совместная передача заголовка и тела ответа. Сервер может передать заголовок и тело ответа с помощью системного вызова writev(). Сервер обычно создает заголовок ответа в отдельном буфере. Этот комбинированный системный вызов требует указать буфер (для заголовка ответа) и файл (для тела ответа), а потом передаст содержимое буфера вместе с содержимым файла. Это избавляет от необходимости выполнения отдельных системных вызовов для записи заголовка и тела ответа в один буфер. Эго позволяет операционной системе передать начало тела ответа в том же IP-пакете, что и заголовок ответа. В противном случае при выполнении двух системных вызовов операционная система могла бы отправить заголовок, не дождавшись, когда сервер запишет в буфер тело ответа. Объединение этих двух шагов позволяет уменьшить число передаваемых пакетов и избежать потенциально вредных взаимодействий с таймером задержки подтверждений, о чем рассказано в разделе 8.2.3.

• Отправка ответа и закрытие соединения одним вызовом. Сервер может закрыть соединение тем же системным вызовом, который использовался для записи HTTP-ответа. Это позволяет серверу записать HTTP-заголовок, передать тело ответа и закрыть соединение одним системным вызовом. Операционная система знает, что сервер хочет закрыть ТСР-соединение. Закрытие соединения осуществляется пакетом, в котором установлен бит FIN. Операционная система имеет возможность установить его в последнем пакете данных, как показано на рис. 8.10. Это возможно, так как операционная система уже знает, что сервер хочет закрыть соединение. Иначе операционная система передала бы последний пакет данных до того, как сервер изъявит желание закрыть соединение. В случае длинных ответных сообщений операционная система обычно не успевает отправить весь ответ до того, как сервер вызовет функцию для закрытия соединения. Но короткие ответы чаще требуют отдельных пакетов FIN. Системный вызов для передачи ответа и закрытия соединения гарантирует, что операционная система установит бит FIN у послед- пего пакета данных. Это уменьшит накладные расходы, сократив число передаваемых пакетов на один.

Рис 8.10. Сервер устанавливает бит FIN у последнего пакета дашгых

Расширение операционной системы новыми системными вызовами может улучшить производительность Web-серверов. Теоретически, Web-сервер мог бы быть встроен в операционную систему. Внедрение приложения в операционную систему является обычной практикой для встроенных операционных систем, предназначенных для выполнения единственной задачи. Напротив, в операционные системы общего назначения дополнительные приложения Обычно не включаются. Выполнение требующих значительных ресурсов функций на уровне операционной системы усложняет распределение процессорных и дисковых ресурсов, а также оперативной памяти между различными задачами. В результате операционные системы Обычно имеют тщательно отобранный набор системных вызовов. Для нужд Web-серверов Можно было бы ввести нескольких новых системных вызовов или изменить реализацию имеющихся. Но нужды отдельных приложений не оправдывают существенных изменений набора функций, предоставляемых операциопиой системой.

Источник: Web-протоколы. Теория и практика. — M.: ЗАО «Издательство БИНОМ», 2002 г. – 592 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100