среда, 19 сентября 2012 г.

Анатомия ZFS часть VI

При написании данного цикла статей использовался документ ZFS On-Disk Specification,Sun Microsystems

1.4.         Adaptive Replacement Cache (ARC)

Адаптивный замещающий кэш (Adaptive Replacement Cache, ARC) – совершенно новое слово в технологиях кэширования*.
Первоначальный алгоритм разработан Мегиддо и Модха (N. Megiddo, D. Modha) в 2003 году (представлен на FAST). Он реализован в ZFS с несколькими существенными отличиями:
·        Согласно модели первоначального алгоритма, любая страница является выгружаемой. Это делает алгоритм вытеснения очень простым – выгружается всегда последняя страница кэша. В ARC используется более сложная модель: часть страниц остается заблокированной на основе подсччета количества ссылок на них. Блокировка вытеснения снимается лишь в отсутствие внешних ссылок на страницу. Существуют периоды, когда вытеснение страниц запрещается. В это время изменение размеров кэша запрещено. С целью избежания неограниченного роста кэша реализовано так называемое «охлаждение кэша», основанное на замедлении загрузки кэша пока запрос на пространство не сможет быть удовлетворен
·        Первоначальный алгоритм использует кэш фиксированного размера. Страницы вытесняются когда кэш полон и начинают фиксироваться кэш-промахи. В ARC используется кэш переменного размера, однако используемый с таким расчетом, чтобы освобождать память по первому требованию в случае поступления запросов на память от операционной системы. Иными словами, кэш будет сокращаться в случае исчерпания памяти, доступной операционной системе
·        Первоначальная модель предполагает фиксированный размер страниц. Модель ARC использует страницы переменного размера (от 512 байт до 128 Кбайт), что позволяет очень просто удовлетворять запросы на память – достаточно освободить страницу необходимого размера. Это позволяет лучше использовать оперативную память и заполнять ее более полно в процессах загрузки и вытеснения страниц**.

ARC использует две модели освобождения страниц – консервативную и агрессивную:

typedef enum arc_reclaim_strategy { 
 ARC_RECLAIM_AGGR, /* Aggressive reclaim strategy */ 
 ARC_RECLAIM_CONS /* Conservative reclaim strategy */ 
 } arc_reclaim_strategy_t;

Консервативная модель используется в обычном режиме работы, агрессивная задействуется в случаях, когда давление на память со стороны операционной системы растет.Интервал проверки возможности увеличения размеров кэша по умолчанию составляет 60 секунд. Страничный буфер ARC может находиться в одном из 6 возможных состояний:

· ARC_anon - анонимный
· ARC_mru  - недавно использовался, кэширован
· ARC_mru_ghost            - давно использовался, больше не в кэше
· ARC_mfu           - часто использовался, в настоящее время в кэше
· ARC_mfu_ghost            - часто использовался, больше не в кэше
· ARC_l2c_only   - существует в кэше второго вроня, но не в одном из других состояний

Когда буфер не имеет ни одной внешней ссылки, он присоединяется к одному из данных списков. Только буферы без ссылок могут быть удалены или вытеснены. В каждом из списков данные разделены на группы – метаданные и собственно данные.
Анонимные буферы – это буферы, с которыми не ассоциированы никакие DVA (см. Главу 1.2.1). Данные буферы содержат грязные копии блоков, которые должны быть записаны в стабильный пул. По определению, данные буферы считаются ссылаемыми (на них существуют ссылки) и являются частью списка, который не может быть освобожден (ARC_mru). В общем случае, они получают DVA при записи и помещаются в список ARC_mru.
ARC использует модель интеллектуальной адаптивной предвыборки и быстрого прогрева (turbo warmup).
Мы не будем в деталях обсуждать механизмы предвыборки, заметим лишь, что требования по оперативной памяти к ARC достаточно высоки, однако это не мешает эффективно использовать ARC на системах с объемом оперативной памяти 1-2 Гб.
При нормальных условиях ARC, используя механизмы быстрого прогрева, достаточно быстро заполняет свободную оперативную память. Такое же поведение характерно и для кэшей UFS, разница, однако, в том, что память, занимаемая буферами UFS, считается (и показывается) свободной. Следует помнить, однако, что ZFS освобождает память по первому требованию, следовательно, данная память может считаться условно свободной.
ZFS использует кэширование на двух уровнях –файловом уровне и уровне vdev. Используя DTrace, ZFS определяет паттерны чтения программных модулей, и затем формирует очереди предвыборки в соответствие с этими паттернами. Таким образом обеспечивается интеллектуальная предвыборка данных в соответствие с запросами приложений.
В некоторых приложениях, использующих собственные механизмы кэширования и/или нуждающихся непосредственно в свободной памяти, существует механизм уменьшения предпочитаемого размера ARC до заданной величины.

Это ограничение устанавливается параметром zfs:zfs_arc_max файла /etc/system, размер задается в байтах, например: 

set zfs:zfs_arc_max=1073741824
Существует утилита  Бена Роквуда (Ben Rockwood, benr@cuddletech.com), arc_summary.pl, написанная на perl, позволяющая получать аггрегированную статистику работы ARC:
 
root @ pegasus / # arc_summary.pl
System Memory:
         Physical RAM:  1491 MB
         Free Memory :  346 MB
         LotsFree:      23 MB
 
ZFS Tunables (/etc/system):
 
ARC Size:
         Current Size:             198 MB (arcsize)
         Target Size (Adaptive):   474 MB (c)
         Min Size (Hard Limit):    64 MB (zfs_arc_min)
         Max Size (Hard Limit):    474 MB (zfs_arc_max)
 
ARC Size Breakdown:
         Most Recently Used Cache Size:          49%    236 MB (p)
         Most Frequently Used Cache Size:        50%    237 MB (c-p)
 
ARC Efficency:
         Cache Access Total:             76283
         Cache Hit Ratio:      91%       69456          [Defined State for buffer]
         Cache Miss Ratio:      8%       6827           [Undefined State for Buffer]
         REAL Hit Ratio:       80%       61217          [MRU/MFU Hits Only]
 
         Data Demand   Efficiency:    95%
         Data Prefetch Efficiency:    23%
 
        CACHE HITS BY CACHE LIST:
          Anon:                       11%        8207                   [ New Customer, First Cache Hit ]
          Most Recently Used:         22%        15867 (mru)            [ Return Customer ]
          Most Frequently Used:       65%        45350 (mfu)            [ Frequent Customer ]
          Most Recently Used Ghost:    0%        16 (mru_ghost) [ Return Customer Evicted, Now Back ]
          Most Frequently Used Ghost:  0%        16 (mfu_ghost) [ Frequent Customer Evicted, Now Back ]
        CACHE HITS BY DATA TYPE:
          Demand Data:                67%        47080 
          Prefetch Data:               0%        556 
          Demand Metadata:            20%        13925 
          Prefetch Metadata:          11%        7895 
        CACHE MISSES BY DATA TYPE:
          Demand Data:                35%        2407 
          Prefetch Data:              26%        1802 
          Demand Metadata:            18%        1257 
          Prefetch Metadata:          19%        1361 
---------------------------------------------
 
Данная утилита является одной из наиболее удобных и используется автором для мониторинга систем, использующих ZFS.

1.4.         Тома ZFS (ZVOL)

Тома ZFS (ZVOL) предоставляют механизм создания логических устройств. Тома ZFS экспортируются как блочные устройства и могут использоваться подобно другим блочным устройствам:

root @ pegasus / # zfs list |grep test
root @ pegasus / # zpool status data2
  pool: data2
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        data2       ONLINE       0     0     0
          c4t0d0    ONLINE       0     0     0
        logs
          c4t1d0    ONLINE       0     0     0

errors: No known data errors
root @ pegasus / # zfs create -V 1g data2/test1
root @ pegasus / # zfs create -V 1g data2/test2
root @ pegasus / # zfs list | grep test
data2/test1                       1G  3.00G    16K  -
data2/test2                       2G  3.00G    16K  -

root @ pegasus / # newfs /dev/zvol/dsk/data2/test2       
newfs: construct a new file system /dev/zvol/rdsk/data2/test2: (y/n)? y
Warning: 2082 sector(s) in last cylinder unallocated
/dev/zvol/rdsk/data2/test:      4194270 sectors in 683 cylinders of 48 tracks, 128 sectors
        2048.0MB in 43 cyl groups (16 c/g, 48.00MB/g, 11648 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
 3248288, 3346720, 3445152, 3543584, 3642016, 3740448, 3838880, 3937312,
 4035744, 4134176
root @ pegasus / # mount -F ufs /dev/zvol/dsk/data2/test /test1
root @ pegasus / # df –h | grep test1
/dev/zvol/dsk/data2/test   1.9G   2.0M   1.9G     1%    /test1
root @ pegasus / # umount /test1
root @ pegasus / # zfs destroy data2/test2

Тома ZFS представлены как объекты типа DMU_OST_ZVOL. Объект ZVOL имеет очень простой формат и содержит два объекта: объект свойств и объект данных, DMU_OT_ZVOL_PROP и DMU_OT_ZVOL соответственно. Оба объекта имеют статически назначенный ID. Объекты описаны ниже:
· DMU_OT_ZVOL_PROPZAP-объект, содержащий атрибуты тома, такие, например, как размер (volsize, может быть изменен динамически) и др.
· DMU_OT_ZVOL – объект содержит виртуальное блочное устройство

 ____________________
* Данная статья основана на исходных текстах ARC, доступных по ссылке http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/zfs/arc.c
** См. также "ARC: A Self-Tuning, Low Overhead Replacement Cache" by N. Megiddo & D. Modha, FAST 2003