ZFS и размер кэша

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:01:21

Ковыряю второй день сабж и никак не могу достичь нужного результата.

А именно хочется как можно больше памяти ему выделить под кэш.

Из экспериментов выяснилось что размер кэша зависит не только от переменной vfs.zfs.arc_max, точнее похоже толком и не зависит от неё, зато очень хорошо зависит от vm.kmem_size - если поставить =999M можно достичь размера кэша около 900 мегов. Чуть больше - всё, кэш больше 400 метров не получается.

В "с" пока не силен, прошу помощи у знающих. Остановился на месте в исходниках где происходит размер максимального кэша.

Как я понял нельзя создать кэш больше чем 1/8 kmem, а дальше не врублюсь что за вычисления происходят.

Код: Выделить всё

#ifdef _KERNEL
        /*
         * On architectures where the physical memory can be larger
         * than the addressable space (intel in 32-bit mode), we may
         * need to limit the cache to 1/8 of VM size.
         */
        arc_c = MIN(arc_c, vmem_size(heap_arena, VMEM_ALLOC | VMEM_FREE) / 8);
#endif
#endif
        /* set min cache to 1/32 of all memory, or 16MB, whichever is more */
        arc_c_min = MAX(arc_c / 4, 64<<18);
        /* set max to 1/2 of all memory, or all but 1GB, whichever is more */
        if (arc_c * 8 >= 1<<30)
                arc_c_max = (arc_c * 8) - (1<<30);
        else
                arc_c_max = arc_c_min;
        arc_c_max = MAX(arc_c * 6, arc_c_max);
#ifdef _KERNEL
        /*
         * Allow the tunables to override our calculations if they are
         * reasonable (ie. over 16MB)
         */
        if (zfs_arc_max >= 64<<18 && zfs_arc_max < kmem_size())
                arc_c_max = zfs_arc_max;
        if (zfs_arc_min >= 64<<18 && zfs_arc_min <= arc_c_max)
                arc_c_min = zfs_arc_min;
#endif
        arc_c = arc_c_max;
        arc_p = (arc_c >> 1);

        /* if kmem_flags are set, lets try to use less memory */
        if (kmem_debugging())
                arc_c = arc_c / 2;
        if (arc_c < arc_c_min)
                arc_c = arc_c_min;

        zfs_arc_min = arc_c_min;
        zfs_arc_max = arc_c_max;

        arc_anon = &ARC_anon;
        arc_mru = &ARC_mru;
        arc_mru_ghost = &ARC_mru_ghost;
        arc_mfu = &ARC_mfu;
        arc_mfu_ghost = &ARC_mfu_ghost;
        arc_size = 0;

        mutex_init(&arc_anon->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
        mutex_init(&arc_mru->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
        mutex_init(&arc_mru_ghost->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
        mutex_init(&arc_mfu->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
        mutex_init(&arc_mfu_ghost->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
        list_create(&arc_mru->arcs_list, sizeof (arc_buf_hdr_t),
            offsetof(arc_buf_hdr_t, b_arc_node));
        list_create(&arc_mru_ghost->arcs_list, sizeof (arc_buf_hdr_t),
            offsetof(arc_buf_hdr_t, b_arc_node));
        list_create(&arc_mfu->arcs_list, sizeof (arc_buf_hdr_t),
            offsetof(arc_buf_hdr_t, b_arc_node));
        list_create(&arc_mfu_ghost->arcs_list, sizeof (arc_buf_hdr_t),
            offsetof(arc_buf_hdr_t, b_arc_node));

        buf_init();

        arc_thread_exit = 0;
        arc_eviction_list = NULL;
        mutex_init(&arc_eviction_mtx, NULL, MUTEX_DEFAULT, NULL);
        bzero(&arc_eviction_hdr, sizeof (arc_buf_hdr_t));

        arc_ksp = kstat_create("zfs", 0, "arcstats", "misc", KSTAT_TYPE_NAMED,
            sizeof (arc_stats) / sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL);

        if (arc_ksp != NULL) {
                arc_ksp->ks_data = &arc_stats;
                kstat_install(arc_ksp);
        }

        (void) thread_create(NULL, 0, arc_reclaim_thread, NULL, 0, &p0,
            TS_RUN, minclsyspri);

#ifdef _KERNEL
        arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
            EVENTHANDLER_PRI_FIRST);
#endif

        arc_dead = FALSE;

#ifdef _KERNEL
        /* Warn about ZFS memory requirements. */
        if (((uint64_t)physmem * PAGESIZE) < (256 + 128 + 64) * (1 << 20)) {
                printf("ZFS WARNING: Recommended minimum RAM size is 512MB; "
                    "expect unstable behavior.\n");
        } else if (kmem_size() < 256 * (1 << 20)) {
                printf("ZFS WARNING: Recommended minimum kmem_size is 256MB; "
                    "expect unstable behavior.\n");
                printf("             Consider tuning vm.kmem_size or "
                    "vm.kmem_size_min\n");
                printf("             in /boot/loader.conf.\n");
        }
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:02:00

Архитектура у меня i386, т.к надо чтобы система могла работать с любым процом.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:10:59

Код: Выделить всё

sysctl -a | grep zfs
vfs.zfs.arc_min: 268435456
vfs.zfs.arc_max: 1073741824
vfs.zfs.mdcomp_disable: 0
vfs.zfs.prefetch_disable: 0
vfs.zfs.zio.taskq_threads: 0
vfs.zfs.recover: 0
vfs.zfs.vdev.cache.size: 10485760
vfs.zfs.vdev.cache.max: 16384
vfs.zfs.cache_flush_disable: 0
vfs.zfs.zil_disable: 0
vfs.zfs.debug: 0
kstat.zfs.misc.arcstats.hits: 122667
kstat.zfs.misc.arcstats.misses: 10500
kstat.zfs.misc.arcstats.demand_data_hits: 1407
kstat.zfs.misc.arcstats.demand_data_misses: 1934
kstat.zfs.misc.arcstats.demand_metadata_hits: 119471
kstat.zfs.misc.arcstats.demand_metadata_misses: 6197
kstat.zfs.misc.arcstats.prefetch_data_hits: 1
kstat.zfs.misc.arcstats.prefetch_data_misses: 2149
kstat.zfs.misc.arcstats.prefetch_metadata_hits: 1788
kstat.zfs.misc.arcstats.prefetch_metadata_misses: 220
kstat.zfs.misc.arcstats.mru_hits: 13728
kstat.zfs.misc.arcstats.mru_ghost_hits: 6
kstat.zfs.misc.arcstats.mfu_hits: 107150
kstat.zfs.misc.arcstats.mfu_ghost_hits: 0
kstat.zfs.misc.arcstats.deleted: 133
kstat.zfs.misc.arcstats.recycle_miss: 7
kstat.zfs.misc.arcstats.mutex_miss: 10
kstat.zfs.misc.arcstats.evict_skip: 0
kstat.zfs.misc.arcstats.hash_elements: 11080
kstat.zfs.misc.arcstats.hash_elements_max: 11080
kstat.zfs.misc.arcstats.hash_collisions: 1064
kstat.zfs.misc.arcstats.hash_chains: 827
kstat.zfs.misc.arcstats.hash_chain_max: 3
kstat.zfs.misc.arcstats.p: 290876584
kstat.zfs.misc.arcstats.c: 374457680
kstat.zfs.misc.arcstats.c_min: 268435456
kstat.zfs.misc.arcstats.c_max: 1073741824
kstat.zfs.misc.arcstats.size: 374475776
kstat.zfs.misc.arcstats.c: 374457680 - насколько понял это то что ограничивает кэш, и где то в коде выше вычисляется.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:23:59

Продолжаем разговор, вычисляется походу тут вверху

Код: Выделить всё

        /*
         * On architectures where the physical memory can be larger
         * than the addressable space (intel in 32-bit mode), we may
         * need to limit the cache to 1/8 of VM size.
         */
        arc_c = MIN(arc_c, vmem_size(heap_arena, VMEM_ALLOC | VMEM_FREE) / 8);
#endif
#endif
        /* set min cache to 1/32 of all memory, or 16MB, whichever is more */
        arc_c_min = MAX(arc_c / 4, 64<<18);
        /* set max to 1/2 of all memory, or all but 1GB, whichever is more */
        if (arc_c * 8 >= 1<<30)
                arc_c_max = (arc_c * 8) - (1<<30);
        else
                arc_c_max = arc_c_min;
        arc_c_max = MAX(arc_c * 6, arc_c_max);
#ifdef _KERNEL
        /*
         * Allow the tunables to override our calculations if they are
         * reasonable (ie. over 16MB)
         */
        if (zfs_arc_max >= 64<<18 && zfs_arc_max < kmem_size())
                arc_c_max = zfs_arc_max;
        if (zfs_arc_min >= 64<<18 && zfs_arc_min <= arc_c_max)
                arc_c_min = zfs_arc_min;
#endif
        arc_c = arc_c_max;

Код: Выделить всё

arc_c = MIN(arc_c, vmem_size(heap_arena, VMEM_ALLOC | VMEM_FREE) / 8);
Эт чо? o_O
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:26:01

Код: Выделить всё

arc_c_min = MAX(arc_c / 4, 64<<18);
Эт чо значит? типа выбрать максимальное? типа если arc_c / 4 меньше 64 то 18? есть у кого нить дока по основам с?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:32:23

МММ

Код: Выделить всё

        /*
         * Allow the tunables to override our calculations if they are
         * reasonable (ie. over 16MB)
         */
Это типа прислушаться к настройкам если вдруг они подходят? какие злые программеры :/
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:37:10

Забыл...

файл с кодом

/usr/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: ZFS и размер кэша

Непрочитанное сообщение zg » 2008-06-24 17:48:00

LMik писал(а):

Код: Выделить всё

arc_c_min = MAX(arc_c / 4, 64<<18);
Эт чо значит? типа выбрать максимальное? типа если arc_c / 4 меньше 64 то 18? есть у кого нить дока по основам с?
<< сдвиг влево 18 раз, примерно так

Код: Выделить всё

0000 0000 | 0000 0000 | 0000 0000 | 0100 0000 
эту единицу сдвинуть 18 раз влево и получится второй аргумент

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 17:57:19

zg писал(а):
LMik писал(а):

Код: Выделить всё

arc_c_min = MAX(arc_c / 4, 64<<18);
Эт чо значит? типа выбрать максимальное? типа если arc_c / 4 меньше 64 то 18? есть у кого нить дока по основам с?
<< сдвиг влево 18 раз, примерно так

Код: Выделить всё

0000 0000 | 0000 0000 | 0000 0000 | 0100 0000 
эту единицу сдвинуть 18 раз влево и получится второй аргумент
:crazy:
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: ZFS и размер кэша

Непрочитанное сообщение zg » 2008-06-24 18:01:38

LMik писал(а): :crazy:
ну можно проще: 2^6 * 2^18 = 2^24 = 16777216

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-24 20:22:27

zg писал(а):
LMik писал(а): :crazy:
ну можно проще: 2^6 * 2^18 = 2^24 = 16777216
интересно....
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-25 9:46:11

Код: Выделить всё

        if (zfs_arc_max >= 64<<18 && zfs_arc_max < kmem_size())
                arc_c_max = zfs_arc_max;
        if (zfs_arc_min >= 64<<18 && zfs_arc_min <= arc_c_max)
                arc_c_min = zfs_arc_min;
Если zfs_arc_max больше 16 мегов И zfs_arc_max < kmem_size()

Это И или ИЛИ?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-25 9:48:45

по логике наверное И
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: ZFS и размер кэша

Непрочитанное сообщение zg » 2008-06-25 9:58:36

LMik писал(а):по логике наверное И
да, && - логическое И, & бинарное И, || - логическое ИЛИ, | - бинарное ИЛИ

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-25 10:05:32

Код: Выделить всё

arc_p = (arc_c >> 1);
??
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: ZFS и размер кэша

Непрочитанное сообщение zg » 2008-06-25 10:15:26

LMik писал(а):

Код: Выделить всё

arc_p = (arc_c >> 1);
??
читай (int) arc_c / 2

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-25 11:26:33

При загрузке пишет правильное кол-во памяти в arc_c

Но со временем срабатывает

if (kmem_debugging())
arc_c = arc_c / 2;

что за функция такая где её порыть мона кто нить знает?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-06-25 13:13:44

:evil: ну что за хрень, не хочет эта сволочь жрать больше 800 мегов памяти.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-08-04 16:05:34

vm.kmem_size="1536M"

Кто-нибудь в курсе как можно поставить больше чем 1.5 гига? Ставлю 2G и ядро валится в панику.

paradox может ты в курсе мочему ядро не может больше памяти себе взять?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ZFS и размер кэша

Непрочитанное сообщение terminus » 2008-08-04 16:14:56

http://www.opennet.ru/base/net/tune_freebsd.txt.html

может это поможет. Это стенограмма доклада Игоря Сысоева о тюнинге FreeBSD
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-08-04 16:26:13

terminus писал(а):http://www.opennet.ru/base/net/tune_freebsd.txt.html

может это поможет. Это стенограмма доклада Игоря Сысоева о тюнинге FreeBSD
Не, это я видел и так. Там больше гига вроде он не выделял на ядро.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение zingel » 2008-08-04 20:28:24

Кто-нибудь в курсе как можно поставить больше чем 1.5 гига? Ставлю 2G и ядро валится в панику
Зачем:?

P.s.

Код: Выделить всё

/*
 * Virtual addresses of things.  Derived from the page directory and
 * page table indexes from pmap.h for precision.
 * Because of the page that is both a PD and PT, it looks a little
 * messy at times, but hey, we'll do anything to save a page :-)
 */

#define VM_MAX_KERNEL_ADDRESS   VADDR(KPTDI+NKPDE-1, NPTEPG-1)
#define VM_MIN_KERNEL_ADDRESS   VADDR(PTDPTDI, PTDPTDI)

#define KERNBASE                VADDR(KPTDI, 0)

#define UPT_MAX_ADDRESS         VADDR(PTDPTDI, PTDPTDI)
#define UPT_MIN_ADDRESS         VADDR(PTDPTDI, 0)

#define VM_MAXUSER_ADDRESS      VADDR(PTDPTDI, 0)

#define USRSTACK                VM_MAXUSER_ADDRESS

#define VM_MAX_ADDRESS          VADDR(PTDPTDI, PTDPTDI)
#define VM_MIN_ADDRESS          ((vm_offset_t)0)

/* virtual sizes (bytes) for various kernel submaps */
#ifndef VM_KMEM_SIZE
#define VM_KMEM_SIZE            (12 * 1024 * 1024)
#endif

это к тому, что нужно понимать, что дальше головы прыгнуть не получится, чудес не бывает.
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-08-05 9:20:18

zingel писал(а):
Кто-нибудь в курсе как можно поставить больше чем 1.5 гига? Ставлю 2G и ядро валится в панику
Зачем:?
Хочется чтобы 2 гига простаивавшей без дела памяти отдались на ZFS.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-08-05 9:27:14

Где в этом коде место которое надо перепрыгнуть?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: ZFS и размер кэша

Непрочитанное сообщение LMik » 2008-08-05 10:46:17

Чем в ядре ограничен размер я не пойму? :evil:
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!