Назад | Перейти на главную страницу

Почему параметр arc_max не соблюдается в ZFS в Linux?

Я запускаю 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

IMHO параметры в / 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

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

источник: https://stackoverflow.com/a/18808311

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

echo 3 > /proc/sys/vm/drop_caches

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

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

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

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

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

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

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

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

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

нет ">>"

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

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

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

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