(c) Андрей Ефимочкин 06.01.1998.


Конфигурация и настройка TCP/IP стека в Solaris 2.5.1

Для нормальной работы многих операционных систем, после их установки, требуется внести ряд изменений адаптирующих среду действия приложений под их непосредственные нужды. Для примера используется операционная система Solaris 2.5.1 для работы под ней прокси сервера (Squid).
Прокси сервер использует как TCP так и UDP для своей работы, причем прокси сервер является очень чувствителен к таким ограничениям системы как, колличество открытых файлдескрипторов на процесс пользователя, сетевых соединений, интервалу между пакетами.
Тонкая настройка системы охватывает более 500 значений. Большинство из этих значений может быть использовано по умолчанию, но для увеличения производительности некоторых приложений необходимо изменить некоторые из них. Для каждого приложения, а так же для каждой конфигурации сервера (тип процессора, объем оперативной памяти, пропускная способность сетевого канала, нагрузка на приложений и т.д.) требуется своя, и единственно подходящая настройка.

Для начала увеличим ограничение на колличество файлдескрипторов в системе. Это можно сделать с файле /etc/system в разделе set. По умолчанию их количество равно 64, рекоммендуемое колличество 1024. Перед тем как внести в него изменения сделайте backup копию этого файла. После внесения необходимых изменений в этом файле необходимо произвести перезагрузку системы. Изменение некоторых параметров в этом файле может привести к некорректной работе системы или в ее отказе от работы, в этом случае загрузитесь с CD содержащей Solaris при помощи команды boot -sw и используйте backup файл.

set rlim_fd_max=1024 ; установки по умолчанию
set rlim_fd_cur=64   ; установки по умолчанию
rlim_fd_cur - параметр определяющий softlimit (не жесткое огранечение) колличество открытых вами файлов. Значение по умолчанию 64. Посмотрет значение можно при помощи команды ulimit -Sn.
rlim_fd_max - определяет hardlimit (жесткое огранечение) колличества открытых файлов. Значение по умолчанию 1024. Посмотреть их колличество можно при помощи команды ulimit -Hn. Рекомендуется устанавливать это значение по формуле 2*tcp_conn_reg_max (значение tcp_conn_reg_max будет рассмотрено ниже) или используя формулу 2*rlim_fd_cur. Всегда должна быть соблюдена формула rlim_fd_cur<=rlim_fd_max!

Изменив строки или вписав их, если они не были еще написаны, в файле /etc/system:
set rlim_fd_max=4096 ; установки для нашей системы
set rlim_fd_cur=1024 ; установки для нашей системы
мы увеличили ограничение на колличество файлдескрипторов в системе Solaris 2.5.1.

Следующим шагом произведем настройку TCP/IP стека. Solaris позволяет настроивать и изменять параметры TCP/IP стека в процессе работы системы, без ее перезагрузки.
Утилита ndd, позволяет прочитать и установить параметры в драйверах ядра системы. В данный момент поддерживается драйверы TCP/IP протокола. Получить список параметров поддерживающих конфигурацию драйвера TCP можно при помощи команды:
host% ndd /dev/tcp \?			; список параметров TCP
host% ndd /dev/udp \?			; список параметров UDP
host% ndd /dev/tcp tcp_xmit_lowat	; значение параметра
					; tcp_xmit_lowat
Для установки значения параметров используется опция -set:
host% ndd -set /dev/tcp tcp_slow_start_initial 2 ; установить значение 2
					    	; параметру
					    	; tcp_slow_start_initial
Некоторые параметры октрыты только для чтения:
host% ndd /dev/tcp \?
...
tcp_slow_start_initial        (read and write)
tcp_status                    (read only)
tcp_bind_hash                 (read only)  
...
Ниже приводиться список некоторых параметров TCP/IP стека, которые я изменял в своем конкретном случае:

tcp_conn_req_max_q и tcp_conn_req_max_q0 - эти значения появились в Solaris 2.6 или после установки patch номер 103630-09 и 103582-12 и заменили параметр tcp_conn_req_max. Их значение по умолчанию равны 128 и 1024 соответственно. Для веб серсеров (или прокси сервера в нашем случае) рекомендуется увеличить значение tcp_conn_req_max_q до 512. Этот параметр определяет максимальное значение очереди запросов на кождое соединение.
tcp_keepalive_interval - значение опеределяет когда истекает интервал перед тем как будет послан keep-alive probe. Иными словами - это интервал когда сервер находиться в состоянии ESTABLISHED. Значение по умолчанию - 7200000, новое значение зависит от пропускной способности канала и мы его установили равным 600000.
tcp_close_wait_interval - параметр определяющий интервал соединения в состоянии CLOSE_WAIT и по умолчанию он равен 4-рем минутам (значение по умолчанию 240000). Большинство соединений прокси сервера имеют состояние CLOSE_WAIT, следовательно мы уменьшили этот интервал до одной минуты (новое значение 60000). Этот параматр тесно связан с двумя другими, которые описываются ниже.
tcp_rexmit_interval_initial - определяет интервал ожидания после посылки данных и получение подтверждения. Это значение используется только при первой перепосылке данных. Значение по умолчанию 3000 мы не изменяли. После первой перепосылке данных используется интервал указанный в параметре tcp_rexmit_interval_min. Значение по умолчанию 200, я увеличил этот интервал до 2000.
Изменение размера окна TCP/IP стека часто помогает при наличии спутникового канала из-за больших задержек на спутниковых "хопах", так как чем больше будет размер окна, тем меньше запросов на подтверждение будет послано. Для увеличения размеров окна используются следующие переменные:
tcp_xmit_hiwat - параметр определяющий размер буфера посылки. По умолчанию равен 8192 (8K). В нашем случае увеличим его значение до 32768 (32К).
tcp_recv_hiwat - размер буфера при приеме, то есть размер который используеися под информацию при ее приеме. По умолчанию равен 8192 (8K). Увеличим его до 32768 (32К).
tcp_max_buf - определяет максисальный размер буфера доступного пользователю при использовании переменных SO_SNDBUF и SO_RCVBUF при написании, определении или переопределении с программе. По умолчанию равен 262144 (256К).

Некоторый другие значения который могут показаться интересными:

tcp_smallest_anon_port - определяет наименьший порт для anonymous соединения. По умолчанию параметр равен 32768.
tcp_ip_ttl - опеределяет значение Time To Live для TCP/IP пакетов. По умолчанию равен 255.
tcp_mss_def - определяет максисальный размер сегмента для не локальных пакетов, пакетов посланных из другой сети. По умолчанию равен 536 (536 байт).

Внесем наши изменения в файл /etc/init.d/inetinit в раздел:
# Set configurable parameters.

echo "Tuning Solaris For Proxy Server"

ndd -set /dev/tcp tcp_conn_req_max_q 512
ndd -set /dev/tcp tcp_conn_req_max_q0 1024

ndd -set /dev/tcp tcp_keepalive_interval 600000
ndd -set /dev/tcp tcp_close_wait_interval 60000

ndd -set /dev/tcp tcp_rexmit_interval_initial 3000
ndd -set /dev/tcp tcp_rexmit_interval_min 2000
ndd -set /dev/tcp tcp_rexmit_interval_max 240000

ndd -set /dev/tcp tcp_xmit_hiwat 32768
ndd -set /dev/tcp tcp_recv_hiwat 32768
Это не полный список того что может пригодиться, но может быть это поможет вам произвести изыскания в данной области самим и добиться большей производительности от вашей системы и/или заставить работать приложения с максимальной отдачей.

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

Литература:

Solaris 2.x - tuning your TCP/IP stack and more
Perfomance Q&A by Adrian Cockcroft
Web Server Tuning And Monitoring
TCP Large Window Support



(c) Андрей Ефимочкин 06.01.1998.