Чому не встановлено параметр arc_max на ZFS в Linux?


20

Я запускаю ZoL 0.6.2 від їх PPA на Ubuntu 12.04. Він розміщений на хості з 16 Гб пам'яті, призначеним для запуску деяких віртуальних машин за допомогою KVM / Libvirt. Через деякий час ZoL використовує шалений об'єм пам'яті, досягаючи 98% використання оперативної пам’яті під час роботи деяких віртуальних машин. Це призводить до того, що нові процеси відмовляються починати "не в змозі виділити пам'ять". Я навіть не можу запустити всі свої VM, які раніше, ніж використовувати 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

Параметри IMHO в / sys / module / zfs / параметрах можуть бути встановлені лише в 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 (лише 8K після make static; strip -s killmem)
Тіно,

У Ubuntu 16.04 мені потрібно було запустити update-initramfs -u -k allперед перезавантаженням, щоб розповсюдити ці налаштування /etc/modprobe.d/zfs.conf.
lechup

@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-х парах рейду 1 '2TB WD негрів на 2-ГГц 4-річному процесорі на коробці з 64 ГБ) - будьте обережні, у вас раптом не буде кешів і будь-яких процеси читання даних будуть витягувати необроблений диск, тому ви, мабуть, побачите, як IO чекає стрибок на деякий час, поки кеш не буде перенаселений.


Ах круто! Чи можете ви пояснити, чому "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 кешування файлів віртуальної машини (віртуальні диски). Щоб уникнути цього, я завжди встановлював властивість основного кеша на "метадані" у файлових системах, що містять віртуальні диски.

Логіка полягає в тому, що гостьова ОС краще підказує, які області її дисків кешувати.


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.