Апр 052011
 

На работе решил оптимизировать файловый сервер samba

Приступим.
Добавим для начало в наш конфиг самбы
nano /usr/local/etc/smb.conf

[global]
 max xmit = 65435
 socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=65435 SO_RCVBUF=65435 SO_KEEPALIVE
Samba:
В локальных сетях. где редки потери пакетов, Nagle алгоритм мог бы
замедлить скорость передачи, так как позволяет находиться в сети
только одному неподтвержденному пакету. Отключаем.
Редактируем smb.conf:
socket options = TCP_NODELAY

Теперь редактируем TCP/IP стек в freebsd
nano /etc/sysctl.conf

net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535
net.inet.ip.portrange.randomized=0
net.inet.tcp.nolocaltimewait=1
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.sendspace=65535
net.inet.tcp.recvspace=65535
net.inet.udp.maxdgram=57344
net.local.stream.recvspace=65535
net.local.stream.sendspace=65535
vfs.vmiodirenable=1
kern.maxfiles=65536
kern.maxfilesperproc=32768
kern.ipc.nmbclusters=65536
kern.ipc.maxsockbuf=2097152
kern.ipc.maxsockets=204800
kern.ipc.somaxconn=8192


Описания параметров:

TCP/IP ports По умолчанию исходящие соединения инициируются с диапазона портов 49152-65535 (16 тыс.). Их можно увеличить (1024-65535):
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535

Для использования портов по порядку, вместо случайной выборки (для исключения ошибки повторного коннекта с одного порта до отработки TIME_WAIT):
net.inet.ip.portrange.randomized=0

Убираем создания состояния TIME_WAIT для локального хоста.
net.inet.tcp.nolocaltimewait=1

Контролирует работу временной марки и масштабируемого окна. (0 — выключено, 1 — включено)
net.inet.tcp.rfc1323=1

Nagle алгоритм квитирования пакетов
net.inet.tcp.delayed_ack=0

send buffers Буферы для отправки данных. По умолчанию 32K. Если скачиваются данные небольшого объема или недостаток mbuf кластеров можно уменьшить до 16k.
net.inet.tcp.sendspace=65535

receive buffers Буферы для приема данных. По умолчанию 64Kб, если нет загрузки больших объемов данных, то можно уменьшить до 8Кб (меньше вероятность переполнения при DoS атаке).
net.inet.tcp.recvspace=65535

Максимальный исходящий размер датаграмм UDP
net.inet.udp.maxdgram=60344

параметры для оптимизации самбы отправка и прием
net.local.stream.recvspace=65535
net.local.stream.sendspace=65535

Значением переменной vfs.vmiodirenable может быть установлено в 0 (выключено) или 1 (включено); по умолчанию 1. Эта переменная отвечает за метод кэширования каталогов. Размер большинства каталогов невелик. Они могут поместиться в одном фрагменте (обычно 1K), и могут занимать ещё меньше места (обычно 512 байт) в кэше буфера. При отключении этой переменной (при установке значения 0) буфер прокэширует только заданное число каталогов даже если у вас много памяти. При включении (при установке значения 1) эта переменная sysctl позволит использовать страничное кэширование VM, делая доступным для кэширования каталогов весь объём памяти. Однако, минимальный объём памяти, используемой для кэширования каталогов стал равен объёму страницы (обычно 4 K) вместо 512 байт. Мы рекомендуем оставлять эту опцию включенной, если ваш компьютер исполняет программы, манипулирующие значительным количеством файлов. Примером таких программ могут быть кэширующие прокси-серверы, большие почтовые серверы и серверы новостей. Обычно включение этой опции не понижает производительности, однако лучше поэкспериментировать, чтобы узнать оптимальное значение для вашей машины.
vfs.vmiodirenable=1

Приложения работают не с сокетами, а с файлами. По этому для каждого
сокета нужна структура, которая описывает файл. Увеличить можно через:
kern.maxfiles=65536 # всего файлов в системе
kern.maxfilesperproc=32768 # максимальное число файлов на один процесс.

Увеличение числа mbuf кластеров, 0 — означает, что Отсутствует ограничение на размер зоны.
kern.ipc.nmbclusters=65536

максимальный размер TCP буфера.
kern.ipc.maxsockbuf=2097152

Увеличиваем максимальное число открытых сокетов во время работы.
kern.ipc.maxsockets=204800

После того как соединение принято оно попадает в «listen socket queue», тоесть в очередь.
Увеличение размера очереди производится
kern.ipc.somaxconn=7652

Пример , просмотр очереди
# netstat -Lan
tcp4 5/0/128 *.22
tcp4 0/0/50 10.7.20.210.139
128 — размер очереди (максимум 65тыс.)
5 — заполненность очереди в данный момент (приложение не вытащило из очереди).

  3 комментария to “FreeBSD + Samba + TCP/IP стек оптимизируем нагрузку”

  1. Aw, this was a really nice post. In idea I would like to put in writing like this additionally — taking time and actual effort to make a very good article… but what can I say… I procrastinate alot and by no means seem to get something done.

  2. Спасибо, очень помогла ваша статья, особенно в параметрах sysctl.

  3. Как был полтинник метров в секунду, так и остался, как ни крути все эти опции. Не за ради пиара, под win2k12 — до 110 MB/s write и столько же read. Под бздей и Linux — 55 — 60 MB/s. и стена. Диск не нагружен. проц не нагружен. мамка супермикра 10й серии.

 Leave a Reply

(required)

(required)

38 Запросов к базе. 0,350 Генерации страницы, 36MB Использование памяти.
Вы зашли с IP: 54.144.100.123