Я запускаю 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 одно из следующих условий должно быть выполнено для адаптации параметра.