Re: Отдача больших файлов

Anton Yuzhaninov citrin at citrin.ru
Tue Jan 14 12:16:16 UTC 2014


On 01/14/14 14:57, Anton Sayetsky wrote:
> 14 января 2014 г., 11:28 пользователь Anton Yuzhaninov
> <citrin at citrin.ru> написал:
>> 1. Собрать ядро с увеличенным до 1 Мб MAXPHYS
>>
>> options         MAXPHYS=(1024*1024)
> Поискал - как-то мало информации по этому поводу. А та, что есть - в
> основном очень старая. Впрочем, внимания всё равно стоит. Интересно,
> почему это не default, если действительно помогает.

1. Есть небольшая вероятность, что существуют драйвера для SCSI/ATA-контроллеров 
неявно (т. е. из кода это не очевидно) предполагающие, что к ним не может придти 
запроса больше 128 Кб (текущий MAXPHYS). Но проблем в этом месте стоит ожидать 
разве что со старым и экзотическим железом.

2. Большой MAXPHYS может быть плох для систем с очень маленьким объемом памяти 
т. к. на эту константу завязаны размеры некоторых буферов в ядре. И для 32-х 
битных систем, т. к. резервируется KVA, которого на 32-х битных системах мало.

3. На популярных синтетических тестах прирост от увеличения MAXPHYS небольшой.

Подробнее об этом можно почитать в этом треде:
http://lists.freebsd.org/pipermail/freebsd-arch/2010-March/009974.html

Но для раздачи больших файлов эффект от увеличения MAXPHYS может быть вполне 
ощутимым:
http://mailman.nginx.org/pipermail/nginx-ru/2009-February/022197.html

>
>> 2. Подобрать оптимальное значение для
>> sysct kern.ipc.sendfile.readahead
> Хм...
> root at jnb:~# uname -srm
> FreeBSD 9.2-RELEASE-p2 amd64
> root at jnb:~# sysctl -a | grep sendfile | wc -l
>         0
> root at jnb:~#

:~> uname -srm
FreeBSD 10.0-PRERELEASE amd64
:~> sysctl -d kern.ipc.sendfile.readahead
kern.ipc.sendfile.readahead: Number of sendfile(2) read-ahead MAXBSIZE blocks

А MFC в 9-ку похоже не сделали...
Впрочем это не актуально учитывая что sendfile на ZFS не так полезен как на UFS.

> А вот это есть:
> jason at jnb:~$ sysctl vfs.read_max vfs.zfs.zfetch.array_rd_sz
> vfs.read_max: 32
> vfs.zfs.zfetch.array_rd_sz: 1048576
> ЕМНИП для UFS (ext2fs, vfat, etc) - это кол-во кластеров, а для ZFS,
> видимо - кол-во байт.

vfs.read_max нужен для обычного чтения файлов и да, его стоит увеличивать. Но 
влияет ли это на sendfile не знаю, надо смотреть. Вполне возможно что без его 
увеличения sendfile readahead работать не будет.

С ZFS работал мало и про vfs.zfs.zfetch.array_rd_sz ничего не скажу.

 > для отдачи с ZFS всегда рекомендовали sendfile выключать, НЯП для
 > избежания double-buffering.

Да, похоже что senfile на ZFS использовать не стоит.

Без sendfile можно попробовать
output_buffers 1 1M;
плюс можно попробовать aio и directio (вместе и по отдельности).



Подробная информация о списке рассылки nginx-ru