Тема выжать максимум из железа на nas4free всегда актуальна. Напомню, что в нашей ветке на хоботе есть обширный FAQ. А в нём, в частности, есть документ о тюнинге nas4free. Тк документ из-за перетасовки тем на хоботе уже пропадал, я сделал его копию под спойлер в конец этого поста
Настройка достаточно простая. Целью является - увеличение производительности ZFS - ускорение сети - экономия электричества за счет сокращения его потребления в простое
Технически тюнинг состоит в правке трех конфигурационных файлов - rc.conf, sysctl.conf и loader.conf. Первые два правятся через вебгуй. Это скучное занятие по вводу десятка параметров, но делается один раз. Результаты сохраняются в вашем конфигурационном файле. А вот loader.conf правится напрямую. И при каждом апгрейде на новую версию правка теряется. К тому же цифирь, которую надо вносить в loader.conf зависит от объёма памяти в вашем NAS и наличия потребляющих много памяти программ, типа виртуальных машин. UPD от 25 авг 2013. С 847 версии loader.conf правится через вебгуй, как и два остальных файла.
Поэтому я счёл полезным записать как свой конфиг, рассчитанный по методике автора, так и конфиги на 4, 8 и 16 физической памяти.
UPD от 10 янв 2015 - Про кавычки Кавычки ниже приведены так, как они записываются в самих конфигах. При вводе через вебгуй кавычки не нужны. Ср коммент от камрада Александр : "В статье Тюнинг nas4free указаны параметры с кавычками, я два дня убил чтобы разобратся (не применялись и все)" /UPD
UPD от 07 апр 2015 - стало понятно, почему у некоторых после тюнинга не грузится. В версии 9.3 сменились некоторые параметры, напрмер mfsroot_load с "YES" на "NO". Если их вбить как было - система не грузится. Удалил лишнее /UPD
По умолчанию - содержание родного loader.conf на Nas4Free 9.3 Эти параметры переназначать НЕ надо
Годится и для NAS4Free full, да и для FreeBSD - только конфигурационные файлы впрямую править
Значения по умолчанию не всегда подходят для максимальной производительности, потому система FreeBSD и его производная - NAS4Free имеют возможности для тонкой настройки. Большая часть настроек задается параметрами в трёх системных файлах - rc.conf, sysctl.conf и loader.conf, при этом способы работы с этими файлами в системе NAS4Free embedded разнятся. 1) Файл loader.conf находится на носителе, куда установлена NAS4Free и его можно редактировать, например, во встроенном редакторе. Для этого необходимо выбрать меню Advanced|File Editor в поле File Path ввести /cf/boot/loader.conf и нажать кнопку Load. После этого содержимое файла появляется в поле редактирования, можно вносить изменения и затем нажать кнопку Save. Файл будет сохранен и после перезагрузки его изменения окажут влияние на систему. 2) Файл sysctl.conf располагается по пути /etc/sysctl.conf, и его также можно загрузить в редактор и увидеть его содержимое. Проблема в том, что любые изменения, внесенные в этот файл не переживут перезагрузки - этот файл находится в виртуальном диске (в оперативной памяти) и он при старте системы генерируется каждый раз заново. Чтобы отредактировать его необходимо зайти в меню System|Advanced|sysctl.conf Тут мы увидим список параметров, их значения и комментарии к ним. Можно редактировать существующие записи, добавлять и удалять (естественно хорошо представляя себе, что вы делаете). Тогда после рестарта системы файл sysctl.conf будет сгенерирован с учетом наших изменений. 3) С файлом rc.conf всё аналогично второму варианту, только изменения вносятся в меню System|Advanced|rc.conf Теперь, когда мы знаем где можно подкрутить винтики, посмотрим на то, что можно подкрутить.
I) Тонкие настройки в файле loader.conf
Для примера рассмотрим мой файл (в моём nas установлено 8 гигабайт оперативной памяти):
код
01 mfsroot_load="YES"
02 mfsroot_type="mfs_root"
03 mfsroot_name="/mfsroot"
04 hw.est.msr_info="0"
05 hw.hptrr.attach_generic="0"
06 kern.maxfiles="65536"
07 kern.maxfilesperproc="50000"
08 kern.cam.boot_delay="8000"
09 autoboot_delay="3"
10 isboot_load="YES"
11 zfs_load="YES"
12 # ZFS kernel tune
13 vm.kmem_size="7424M"
14 vfs.zfs.arc_min="768M"
15 vfs.zfs.arc_max="5568M"
16 vfs.zfs.prefetch_disable="0"
17
18 vfs.zfs.txg.timeout="5"
19 vfs.zfs.vdev.max_pending="6"
20 vfs.zfs.vdev.min_pending="2"
21
22 # EIST tune
23 hint.p4tcc.0.disabled="1"
24 hint.acpi_throttle.0.disabled="1"
Первая его часть (до комментария # ZFS kernel tune) - это настройки, которые сгенерированы системой по умолчанию. Единственное отличие - я удалил строчку vfs.zfs.prefetch_disable="1", потому что этой настройке самое место в следующем разделе:
a) Тюнинг производительность zfs. Скорость работы файловой системы zfs напрямую зависит от количества оперативной памяти, установленной в нашем nas. Но при этом мало просто вставить побольше оперативки, надо ещё чтобы система правильно ей пользовалась. Почему-то по умолчанию настройки NAS4Free очень консервативны: префетч выключен, под кэш для zfs используется всего около трети от объема оперативной памяти. Для исправления соответствующих настроек можно установить специальное дополнение, но можно просто руками указать нужные значения переменных в файле loader.conf. У меня они указаны после комментария # ZFS kerne tune Рассмотрим внимательно и разберем подробно каждую строчку
код
1 vm.kmem_size="7424M"
2 vfs.zfs.arc_min="768M"
3 vfs.zfs.arc_max="5568M"
4 vfs.zfs.prefetch_disable="0"
5
6 vfs.zfs.txg.timeout="5"
7 vfs.zfs.vdev.max_pending="6"
8 vfs.zfs.vdev.min_pending="2"
первые три строчки - это настройка объемов памяти, почему-то NAS4Free иначе определяет по умолчанию некоторые значения, чем обычная FreeBSD. Поскольку нам непонятна логика NAS4Free, то мы постараемся приблизить эти значения к умолчаниям FreeBSD.
1) vm.kmem_size="7424M" Это важное значение, от него зависят два других, приведенный строчками ниже. Смысл такой: это участок адресного пространства, который мы отдаём системе. Он должен быть примерно равен доступному объему физической памяти, установленной в нашем NAS. Чтобы узнать точный объем доступной памяти необходимо выполнить команду dmesg | grep memory (Для того, чтобы выполнить эту команды необходимо открыть меню Advanced | Command, ввести с полк Command нашу команду и нажать Execute) В результате будет выведено следующее (в вашем случае цифры могут быть иными):
код
1 $ dmesg | grep memory
2 real memory = 8589934592 (8192 MB)
3 avail memory = 7958212608 (7589 MB)
Значение avail memory = 7958212608 (7589 MB) нам и требуется. Можно напрямую указать именно это значение, но объем доступной памяти со временем может меняться - из-за настроек в биосе может быть увеличена область отводимая под видеобуфер, или же новая версия NAS4Free потребует больше места под виртуальный диск, потому я использовал значение с некоторым запасом. В данном случае я указал, что системе отдается 7424 мегабайт. Как я получил эту цифру? Общий объем установленной памяти - 8192 мегабайта, чтобы не высчитывать объемы с точностью до мегабайта, я просто уменьшил грубо и с запасом на 256 (видео) + 512 (виртуальный диск) 768 мегабайт и получил 8192-768=7424. Вот от этого числа мы и будем отсчитывать в дальнейшем объем кэша. По умолчанию в NAS4Free это значение составляет менее половины от объема установленной памяти, и непонятно чем это может быть обусловлено.
2) vfs.zfs.arc_min="768M" Кэш, который использует ZFS называется ARC. Он находится в оперативной памяти и его объем может автоматически меняться, если мы зададим его минимальный и максимальный объем. Если мы ограничим минимальный объем очень большим числом, а системе вдруг понадобится для чего-то память, то ARC не сможет освободить ей память и мы получим непонятно что. Потому ограничим минимальный объем ARC как 768 мегабайт - это число получается в FreeBSD с 8 гигабайтами по умолчанию. Для отличных от 8 гигабайт объемов оперативной памяти предлагаю брать те же 768M, всё равно вряд ли память понадобиться кому-то кроме zfs. По умолчанию в NAS4Free это значение достаточно большое (около 60% от vm.kmem_size), что видимо очень маловероятно, но всё же может не позволить системе высвободить нужный объем памяти.
3) vfs.zfs.arc_max="5568M" Это число ограничивает сверху объем памяти под ARC кэш. Если мы возьмем его слишком маленьким - тогда некоторый объем памяти будет свободен и возможно будет простаивать вместо того, чтобы приносить нам пользу. Потому возьмем его примерно как 75%-80% от числа указанного нами в пункте vm.kmem_size. У меня взято ровно 75%. По умолчанию это значение в NAS4Free и берется как 75-80% от объема vm.kmem_size, я его задаю руками просто чтобы быть уверенным, что например в будущих версиях NAS4Free определение его размера не станет вдруг сильно неоптимальным.
4) vfs.zfs.prefetch_disable="0" Это включение префетча: специального вида кэширования, который осуществляет предвыборку непосредственно в процессе чтения с диска запрашивая и помещая в ARC бОльшее число блоков ФС нежели было запрошено в данный момент. При достаточном объеме ARC это сильно ускоряет операции последовательного чтения. Рекомендуется включать при >4GB RAM По умолчанию префетч в NAS4Free выключен, причины этого не совсем понятны. Вернее совсем не понятны.
5) vfs.zfs.txg.timeout="5" Эта строчка задают таймаут записи данных на диски из кэша (в секундах). Значение можно увеличить, например до 10, тогда данные из памяти на диски будут записываться реже, это снизит количество записей но есть вероятность потерять несброшенную на диски информацию в случае сбоев электропитания.
6)vfs.zfs.vdev.max_pending="6" 7)vfs.zfs.vdev.min_pending="2" Эти строчки регулируют глубину очереди команд к дискам (от 6 до 2: для быстрых современных дисков с большим числом оборотов эти значения можно увеличить, для зеленых тихоходных бОльшая глубина противопоказана), что позволяет оптимизировать нагрузку на диски. на этом заканчивается тонкая настройка zfs, переходим к следующему разделу:
b) тюнинг режимов энергосбережения. Поскольку наш NAS работает много времени, а процессор нагружен не всегда, то имеет смысл включить режим экономии. Делается это в меню System|Advanced установкой галочки на пункте Power Daemon. После этого управление энергопотреблением процессора осуществляется одновременно через EIST (Enhanced Intel SpeedStep Technology) и технологии тротлинга (снижения частоты). EIST управляет как частотой, так и напряжением питания процессора, в то время как тротлинг - только частотой. Обе технологии позволяют снижать энергопотребление системы, но эффект от троттлинга невелик и нивелируется за счет использования других технологи (С-states), поэтому рекомендуется отключить тротлинг при помощи следующих строк: # EIST tune hint.p4tcc.0.disabled="1" hint.acpi_throttle.0.disabled="1"
II) Тонкие настройки в sysctl.conf
В этом файле очень много параметров, при этом регулировать мы будем те, что относятся к тонким настройкам сети. В качестве образца берется этот конфиг. А конкретно эта его часть:
код
01 # Kernel Tuning
02 net.inet.ip.intr_queue_maxlen=1024
03 #
04 # TCP/IP Tuning
05 kern.ipc.maxsockbuf=16777216
06 kern.ipc.somaxconn=1024
07 #
08 net.inet.tcp.recvspace=131072
09 net.inet.tcp.recvbuf_auto=1
10 net.inet.tcp.recvbuf_inc=16384
11 net.inet.tcp.recvbuf_max=4194304
12 #
13 net.inet.tcp.sendspace=65536
14 net.inet.tcp.sendbuf_auto=1
15 net.inet.tcp.sendbuf_inc=8192
16 net.inet.tcp.sendbuf_max=4194304
17 #
18 net.inet.tcp.hostcache.expire=1
19 net.inet.tcp.mssdflt=1460
20 net.local.stream.recvspace=65536
21 net.local.stream.sendspace=65536
Напоминаю, что править этот файл необходимо через меню System|Advanced|sysctl.conf Просто находим на страничке в колонке MIB нужный нам параметр (например net.inet.ip.intr_queue_maxlen) и смотрим какое значение ему присвоено в колонке Value. Если оно отличается то того, что приведено в примере выше - то нажимаем на значек гаечного ключа и исправляем Value. Если каких-то параметров нет, то нажимаем в самом нижу плюсик и вводим новый параметр. После окончания правки жмем Apply.
III) Тонкие настройки в rc.conf
Тут пока что можно настроить лишь управление режимами энергосбережения процессора. Для этого нужно переменной powerd_flags присвоить значение
код
1 -a adp -n adp -p 100 -i 20 -r 80
Пояснения к этим параметрам:
цитата (http://forum.ixbt.com/topic.cgi?id=11:43718:4803#4797): по сравнению с параметрами по умолчанию процессор начинает переключаться на более низкие частоты когда нагрузка на все его ядра падает ниже 20% (против 50%) и начинает повышать частоту когда нагрузка возрастает выше 80% (против 75%) и все это при повышенной частоте снятия показаний загрузки (раз в 100мс против раза в 250мс). Все это приводит к уменьшению числа переключений между уровнями EIST.