Вопрос к гуру тюнинга памяти о memory pool-ах


Главная Форумы POWER Systems AIX/Hardware Вопрос к гуру тюнинга памяти о memory pool-ах

В этой теме 13 ответов, 3 участника, последнее обновление  Sever 5 года/лет, 3 мес. назад.

  • Автор
    Сообщения
  • #16538

    uxTuaHgp
    Участник

    # vmstat -v

    12 [b]memory pools[/b]

    Расскажите, что это за пулы и от чего зависит их количество, а то как-то в манах и интернетах вразумительного не много.

  • #16540

    andrewk
    Участник

    вся память разделена на n-ное количество пулов памяти. количество пулов зависит от общего объема установленной памяти, но сколько макс может быть в одном пуле — хз. В зависимости от количества пулов lrud плодит столько же тредов и каждый тред lrud обрабатывает отдельный пул. Собственно — просто оптимизация работы пейджинга.

    Все, как всегда, можно посмотреть в kdb:

    :/root# vmstat -v
    3 memory pools

    (0)> mempool *
    VMP MEMP NB_PAGES FRAMESETS NUMFRB
    F1000F0009540000 00 000 00A546F0 000 001 002 003 0098E658
    F1000F0009540500 00 001 00A53C00 004 005 006 007 0098EEED
    F1000F0009540A00 00 002 00A53C20 008 009 00A 00B 0098EE13

    (0)> p *
    SLOT NAME STATE PID PPID ADSPACE CL #THS

    pvproc+001000 4 lrud ACTIVE 0040008 0000000 0000000870007190 0 0004

    (0)> tpid 0040008
    SLOT NAME STATE TID PRI RQ CPUID CL WCHAN

    pvthread+000400 4 lrud SLEEP 040009 010 0 0 vmpfh+01CEC0
    pvthread+001200 18 lrud SLEEP 120025 010 0 0
    pvthread+001100 17 lrud SLEEP 110023 010 0 0
    pvthread+001000 16 lrud SLEEP 100021 010 0 0

    (0)> mempool 0

    Memory Pool [0] [F1000F0009540000]
    > valid
    eye catch……… 6D656D70564D0000 eye catch 2……. 6D656D7065564D4D
    next memory pool………. 09540500 number of frames…… 000000A546F0
    owning vmpool…………. 00000000 owning vmpool…………. 020A92F0
    memp RAS block…. F1000A01800F1780
    LRU RAS block….. F1000A01800F1800 PSM RAS block….. F1000A01800F1900

  • #16541

    uxTuaHgp
    Участник

    Пулы видимо связаны с memory affinity?
    То есть нити lrud обрабатывают пулы памяти наиболее близко лежащие к конкретным CPU?

  • #16542

    andrewk
    Участник

    возможно, IBM и заимплементировала какой-то подобный алгоритм, но формально — нет, не связаны. У меня на одном p6 595, где нет никаких SRAD’ов еще, 20 memory pool’ов. На 795м с таким же количеством памяти (1 ТБ) и 14 SRAD’ами — 37 memory pool’ов.

  • #16543

    uxTuaHgp
    Участник

    SRAD, насколько я понял имеет место быть только при включенной enchanced_memory_affinity
    если фичу выключить lssrad ничего красивого не показывает, однако memory_affinity то никто не отменял.

  • #16544

    andrewk
    Участник

    SRAD имеет место быть всегда на «больших» машинах (от 770й и дальше). Команда lssrad показывает лишь Affinity Domains — сколько памяти рядом с какими процессорами.

  • #16545

    andrewk
    Участник

    Introduction:
    Starting with AIX V4.3.3, real memory is divided into one or more memory pools depending on the amount of real memory and the number of CPUs in an MP system.
    The number of memory pools will be the maximum of #of CPUs/8 or RAMinGB/16, but not more than the # of CPUs and not less than 1. Memory pools are divided into one or
    more framesets which allows concurrent memory allocation out of a memory pool.
    Each memory pool has its own page replacement daemon, lrud (Least Recently Used Daemon).
    Memory allocation is done round-robin across the memory pools where two pages per pool are allocated before moving to the next memory pool.
    It is not recommended to change the number of memory pools or number of framesets per memory pool without advice from AIX development.

    Memory pools:
    To determine the number of memory pools on a machine, use:
    — AIX 5L V5.2 and later: vmstat -v | grep “memory pools”
    Note: The number of memory pools shown by vmo -a might not represent the actual number of active memory pools, thus vmstat must be used.
    — AIX 5L V5.1 and earlier: vmtune -a | grep mempools
    The number of memory pools can be changed with:
    — AIX 5L V5.2 and later: vmo -r -o mempools=number_of_memory_pools
    — AIX 5L V5.1 and earlier: vmtune -m number_of_memory_pools
    Changes to the number of memory pools requires bosboot and reboot. While bosboot must be run manually on AIX 5L V5.1 and earlier, the vmo command on
    AIX 5L V5.2 and later prompts for running bosboot automatically.
    The number of memory pools cannot be changed with vmtune command on AIX 5L V5.2 and later, changes can only be done with vmo.

    Framesets:
    Each memory pool furthermore consists of one or more framesets. The default is two
    framesets per memory pool. This allows concurrent memory allocation out of a single
    memory pool. The number of concurrent memory allocations out of one memory pool is equal to the number of framesets in this pool.
    The number of framesets in the first memory pool on a system might be different to the number of framesets in all other memory pools.
    To determine the number of framesets on a machine:
    — AIX 5L V5.2 and later: vmo -a | grep framesets
    — AIX 5L V5.1 and earlier: vmtune -a | grep total_frame_sets
    As for the number of active memory pools, vmo -a might not show the actual number of active framesets per memory pool.
    The number of framesets per memory pool can be changed with:
    — AIX 5L V5.2 and later: vmo -r -o framesets=number_of_framesets
    — AIX 5L V5.1 and earlier: vmtune -v number_of_framesets
    The number of framesets per memory pool cannot be changed with vmtune on AIX 5L V5.2, changes can only be done with vmo.

    LRU Buckets:
    Rather than scanning the entire page frame list of a memory pool to find pages to steal the page frame list is divided into buckets of page frames. The page replacement algorithm will scan the frames in the bucket and then start over on that bucket for a second scan. Then it will move on to the next bucket.
    The default number of frames in a bucket is 131072 and can be changed with vmo/vmtune command.
    Reducing the number of frames in an LRU bucket can reduce scanning overhead and latency in page replacement on large memory machines.

  • #16546

    andrewk
    Участник

    AIX memory affinity support

    AIX® provides the capability to allocate memory for a process from the module containing the processor that caused the page fault. You can use this capability if memory affinity support is enabled on your system and by setting the MEMORY_AFFINITY environment variable. Memory affinity is enabled by default in AIX 5.2, but you can disable it.

    IBM® POWER® processor-based platform SMP hardware systems contain modules that are capable of supporting single, dual, or multiple processor chips depending on the particular system. Each of these modules contain multiple processors and the system memory is attached to these modules. While any processor can access all of the memory in the system, a processor has faster access, and higher bandwidth when addressing memory that is attached to its own module rather than memory attached to the other modules in the system.

    When memory affinity is enabled, each module has its own vmpool, which contains one or more memory pools. Each memory pool has its own page replacement daemon, lrud. The amount of memory in each pool is based on how much memory is available in the module or allocated to the VMM by the hypervisor layer.

    If you are using AIX 5.2 and memory affinity is disabled, the number of memory pools is based on the amount of memory and the number of CPUs in the system.
    To disable memory affinity support on AIX 5.2, you can use the following vmo command:

    vmo -o memory_affinity=0

    Note: A bosboot and a reboot are required in order for it to take effect.
    The default value is 1, which means that memory affinity support is enabled.
    Enabling memory affinity support tells the operating system to organize its data structures along module boundaries. The default memory allocation policy rotates among the MCMs. In order to obtain preferential local MCM memory allocation, an application must export the MEMORY_AFFINITY environment variable as follows:

    MEMORY_AFFINITY=MCM

    This behavior is propagated across a fork. However, for this behavior to be retained across a call to the exec function, the variable must be contained in the environment string passed to the exec function call.

  • #16548

    Sever
    Участник

    IMHO сейчас функция соблюдения memory affinity отдана гипервизору. Его задача изначально «правильно» распределить ресурсы при первичном запуске партиций. Если связки память-процессоры потеряют «близость», то уже на уровне ОС что либо изменить возможности не будет.

  • #16551

    andrewk
    Участник

    в общем — да. самый кошерный способ — это выключить полностью систему (shutdown, а не reboot) и включить ее снова. тогда ресурсы LPAR’а будут снова перераспределены. В AIX есть aso (Active System Optimizer), который по идее должен оптимизировать все это размещение, но он кажется больше нацелен на отдельные процессы, а не на оптимизацию всей системы.

  • #16555

    uxTuaHgp
    Участник

    Вроде enchanced affinity умеет в фоне во время простоев процессоров перемещать данные между SRAD-ами?
    У нас даже баг был такой, что система падала при попытке перемещения, после чего нам рекомендовали отключить эту фичу и перешить микрокод.

  • #16559

    andrewk
    Участник

    да, этим занимается ASO. но вопрос несколько в другом. например, при старте LPAR’а ему выделены 2 процессора и 24 ГБ памяти из 1й книжки, 4 процессора из 2й и 48 ГБ из 3й. ASO может переместить данные одного процесса на первую книжку (если они туда поместятся). Но никакой ASO не в состоянии переместить выделенные из 3й книжки 48 ГБ памяти «перевыделить» из 2й книжки, если они там освободились. Это можно сделать только выключением и включением LPAR’а, но при этом опять не гарантируется, что в результате получится оптимальная конфигурация.

  • #16563

    uxTuaHgp
    Участник

    мдааа… дремуче…
    нарожали модульных систем, а потом мучайся.

  • #16588

    Sever
    Участник

    Касательно memory affinity на уровне ОС.
    Тут небольшое непонимание относительно того, что система делает для достижения близости ресурсов.
    ОС не занимается перемещением памяти, а производится переключение задачи(процесса) на ноду, на которой эта память располагается.

Для ответа в этой теме необходимо авторизоваться.