Почему настройка arc_max не работает в ZFS в Linux?


20

Я использую ZoL 0.6.2 из их PPA на Ubuntu 12.04. Он находится на хосте с 16 ГБ памяти, предназначенной для запуска некоторых виртуальных машин с использованием KVM / Libvirt. Через некоторое время ZoL использует безумный объем памяти, достигая 98% использования оперативной памяти при работе некоторых виртуальных машин. Это приводит к тому, что новые процессы отказываются запускаться «невозможно выделить память». Я даже больше не могу запустить все свои виртуальные машины, которые до использования ZFS использовали около 40-50% оперативной памяти.

Насколько я понимаю, без подстройки ZoL должен освободить память, как только системе не хватит памяти. Ну, это не так. Поэтому я решил установить arc_maxзначение 1 ГБ.

# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max

Тем не менее, он не освобождает память.

Как видно из приведенной ниже статистики ARC, она использует больше памяти, чем настроено (сравните c= 7572030912с c_max= 1073741824).

Что я здесь не так делаю?

# cat /proc/spl/kstat/zfs/arcstats
4 1 0x01 84 4032 43757119584 392054268420115
name                            type data
hits                            4    28057644
misses                          4    13975282
demand_data_hits                4    19632274
demand_data_misses              4    571809
demand_metadata_hits            4    6333604
demand_metadata_misses          4    289110
prefetch_data_hits              4    1903379
prefetch_data_misses            4    12884520
prefetch_metadata_hits          4    188387
prefetch_metadata_misses        4    229843
mru_hits                        4    15390332
mru_ghost_hits                  4    1088944
mfu_hits                        4    10586761
mfu_ghost_hits                  4    169152
deleted                         4    35432344
recycle_miss                    4    701686
mutex_miss                      4    35304
evict_skip                      4    60416647
evict_l2_cached                 4    0
evict_l2_eligible               4    3022396862976
evict_l2_ineligible             4    1602907651584
hash_elements                   4    212777
hash_elements_max               4    256438
hash_collisions                 4    17163377
hash_chains                     4    51485
hash_chain_max                  4    10
p                               4    1527347963
c                               4    7572030912
c_min                           4    1038188800
c_max                           4    1073741824
size                            4    7572198224
hdr_size                        4    66873056
data_size                       4    7496095744
other_size                      4    9229424
anon_size                       4    169150464
anon_evict_data                 4    0
anon_evict_metadata             4    0
mru_size                        4    1358216192
mru_evict_data                  4    1352400896
mru_evict_metadata              4    508928
mru_ghost_size                  4    6305992192
mru_ghost_evict_data            4    4919159808
mru_ghost_evict_metadata        4    1386832384
mfu_size                        4    5968729088
mfu_evict_data                  4    5627991552
mfu_evict_metadata              4    336846336
mfu_ghost_size                  4    1330455552
mfu_ghost_evict_data            4    1287782400
mfu_ghost_evict_metadata        4    42673152
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_hdr_miss              4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_free_on_write                4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    66583
memory_indirect_count           4    7657293
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    427048272
arc_meta_limit                  4    2076377600
arc_meta_max                    4    498721632

# free -m
             total       used       free     shared    buffers     cached
Mem:         15841      15385        456          0         75         74
-/+ buffers/cache:      15235        606
Swap:            0          0          0

Ответы:


22

ИМХО параметры в / sys / module / zfs / parameters могут быть установлены только на 0/ 1- disabled/ enabled. " Исправление: зависит от параметра

Я в той же лодке, желая ограничить использование памяти zfs, и кажется, что нужно создать файл /etc/modprobe.d/zfs.conf и ввести туда параметр и требуемое значение. Это изменение вступит в силу после перезагрузки.

echo "options zfs zfs_arc_max=34359738368" >> /etc/modprobe.d/zfs.conf

Для воздействия на работающий модуль можно изменить параметр zfs_arc_max.

echo "34359738368" > /sys/module/zfs/parameters/zfs_arc_max

Обратите внимание на использование >для замены содержимого файла в отличие от добавления в файл с >>.

источник: /programming//a/18808311


1
Дуга ZFS не сжимается сразу. Однако (ZFSonLinux) он восстанавливается, в то время как приложения выделяют эту память - как обычно. Если вам нужно что-то затормозить в памяти, взгляните на github.com/hilbix/killmem (только через 8 тысяч make static; strip -s killmem)
Тино,

В Ubuntu 16.04 мне нужно было запустить update-initramfs -u -k allперед перезагрузкой, чтобы распространить эти настройки /etc/modprobe.d/zfs.conf.
Лечуп

@lechup: в Ubuntu 16.04 я добавил options zfs zfs_vdev_scheduler=cfqв свой /etc/modprobe.d/zfs.conf . Я перезагрузился, и это сработало; планировщик был теперь cfq вместо noop . Можете ли вы уточнить, почему update-initramfs -u -k allэто необходимо?
Мартин Велес

@MartinVelez Я знаю, что это странно, но без этого на моей машине изменения не были распространены после перезагрузки ... Я пытался распространить другую опцию, zfs_arc_maxвозможно, этот ключ как-то кэшируется в initramfs?
lechup

5

http://fibrevillage.com/storage/169-zfs-arc-on-linux-how-to-set-and-monitor-on-linux

эта статья очень хорошая

начиная с версии ZoL 0.6.2 вы можете установить c_max во время выполнения, однако размер ARC не будет выпущен автоматически. для принудительного освобождения оперативной памяти необходимо экспортировать zpool.


4

После того, как вы измените размер дуги, вам нужно сбросить кэш.

echo 3 > /proc/sys/vm/drop_caches

и подождите (ваша подсказка не вернется сразу, но другие процессы продолжат работать). Кэши будут медленно выгружаться (2,5 минуты для моего кеша объемом 24 ГБ на 2 парах черных WD 1-го размера 2 ТБ на 4-летнем процессоре 2 ГГц на 64 ГБ памяти) - будьте осторожны, у вас внезапно не останется никаких кешей и процессы, считывающие данные, будут извлекать необработанный диск, так что вы, вероятно, увидите некоторое время ожидания ввода-вывода, пока кэш не будет заполнен.


Ах, круто! Не могли бы вы объяснить, почему '3' в качестве значения для записи в эту запись procfs?
gertvdijk

Очистить только PageCache: # sync; echo 1 > /proc/sys/vm/drop_caches Очистить зубные протезы и иноды: # sync; echo 2 > /proc/sys/vm/drop_caches Очистить PageCache, зубные протезы и иноды:# sync; echo 3 > /proc/sys/vm/drop_caches
математика

2

Одной из проблем, с которой вы можете столкнуться, является ZFS-кеширование файлов виртуальной машины (виртуальных дисков). Чтобы избежать этого, я всегда устанавливаю для свойства primarycache значение «метаданные» в файловых системах, содержащих виртуальные диски.

Логика заключается в том, что гостевая ОС лучше подсказывает, какие области ее дисков кэшировать.


0

AFAIK для адаптации параметра должно быть выполнено одно из следующих условий.

  1. В работающей системе: экспортируйте все zpools, удалите модули zfs, повторно включите модуль zfs (по определению это невозможно сделать, если / находится на zfs).
  2. Восстановите образ initramfs при изменении параметра, чтобы после перезагрузки он работал. Это необходимо, поскольку местоположение файла zfs.conf еще не смонтировано в данный момент в процессе загрузки.

0

У вас есть один лишний " >" слишком много.

Команда должна быть

echo 1073741824 > /sys/module/zfs/parameters/zfs_arc_max

не " >>"

>>означает «добавить в» (существующий список).
>означает «перезаписать» (значение).

Вот почему код команды в вашем вопросе не будет работать.


Это уже было частью принятого ответа настоящего. serverfault.com/a/602457/135437
gertvdijk

Этот пост - запутанный беспорядок, мистер Даунвотс. Автор говорит целую кучу вещей, только касаясь правильного ответа, проходя мимо конца беспорядка, не заявляя, «это причина» или эквивалентный. Настолько запутанный, что я не получил ответ от этого поста. Я видел причину из вопроса. Мой пост был отклонен по причине.
Лицемер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.