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

Anton Sayetsky vsjcfm at gmail.com
Tue Jan 14 10:57:53 UTC 2014


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

> 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:~#

jason at pxe:~$ uname -srm
FreeBSD 9.1-RELEASE-p4 amd64
jason at pxe:~$ sysctl -a | grep sendfile | wc -l
       0
jason at pxe:~$

jason at jason-freebsd:~$ uname -srm
FreeBSD 8.3-RELEASE-p4 amd64
jason at jason-freebsd:~$ sysctl -a | grep sendfile | wc -l
       0
jason at jason-freebsd:~$
На последних двух системах установлен nginx со включенным sendfile.
При каких условиях должен появиться данный OID?
А вот это есть:
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,
видимо - кол-во байт.

> измеряется в блоках по MAXBSIZE (по умолчанию 64к)
> больше MAXPHYS/MAXBSIZE ставить смысла нет.
> т. е. при MAXPHYS 1 Мб можно попробовать kern.ipc.sendfile.readahead=16
Таки да, для UFS это - кол-во кластеров.
jason at jnb:~$ man tuning | col -b | grep -A 10 read_max
     The vfs.read_max sysctl governs VFS read-ahead and is expressed as the
     number of blocks to pre-read if the heuristics algorithm decides that the
     reads are issued sequentially.  It is used by the UFS, ext2fs and msdosfs
     file systems.  With the default UFS block size of 16 KiB, a setting of 32
     will allow speculatively reading up to 512 KiB.  This setting may be
     increased to get around disk I/O latencies, especially where these laten‐
     cies are large such as in virtual machine emulated environments.  It may
     be tuned down in specific cases where the I/O load is such that read-
     ahead adversely affects performance or where system memory is really low.

     The vfs.ncsizefactor sysctl defines how large VFS namecache may grow.
jason at jnb:~$

> Ну и собственно в конфиге nginx - sendfile on;
Странно, ибо в ранее прочитанных мануалах (втч и в этой рассылке) для
отдачи с ZFS всегда рекомендовали sendfile выключать, НЯП для
избежания double-buffering.

> 3. Про тюнинг ZFS написано много, в первую стоит посмотреть на размер ARC -
> по умолчанию ZFS пытается съесть почти всю память и запущенным приложениям
> остаётся мало, иногда аппетиты ZFS приходится ограничивать:
> vfs.zfs.arc_max="16G"
Вот тут не соглашусь. "Съест почти всю память" абсолютно любая ФС,
имеющая кэш. Более того, любая такая ФС _обязана_ использовать всю
память, не занятую приложениями.
И проблема ранее была только в том, что ZFS слишком медленно
освобождала память, что вызывало использование свопа. В общем-то, если
бы данная проблема и существовала до сих пор - ничего страшного для
сервера с 128-256 Г памяти, на котором не запущено ничего, кроме
базовой системы, nginx, sshd и ntpd. ;)

> vfs.zfs.prefetch_disable="1" # это стоит проверять на тестах, но я несколько
> раз сталкивался с тем, что отключение ZFS prefetch ускоряет работу.
А тут соглашусь. При отключенном prefetch чтение становится по сути
однопоточным. Заметил это некоторое время назад случайно, во время
теста ZFS over GELI. При отключенном GELI жрёт одно ядро, при
включенном - больше одного.
Из этого можно сделать вывод, что при большом кол-ве независимых
операций отключение prefetch действительно может дать эффект:
теоретически один клиент получит чуть меньше, но все клиенты вместе -
больше.


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