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