Сегменты malloc
Наборы функции malloc представляют собой дополнительные расширения стандартной функции распределения памяти на основе наборов.
Эти наборы предназначены для повышения производительности приложений, создающих много запросов на выделение небольшого объема памяти. Если это расширение включено, то запросы на выделение блоков памяти, размер которых соответствует заданному диапазону, обрабатываются наборами функции malloc. Все остальные запросы обрабатываются обычным образом стандартной программой распределения памяти.
По умолчанию наборы malloc отключены. Для работы с несколькими кучами нужно задать переменную среды MALLOCOPTIONS до запуска процесса.
Размер и состав набора
Набор состоит из блока памяти, который делится на заданное число меньших блоков равного размера, каждый из которых может быть выделен отдельно. Каждому набору соответствует свой номер. Первый набор имеет номер 0, второй набор - 1, третий - 2, и т.д. Первый набор имеет наименьший размер, размер каждого последующего набора больше, чем размер предыдущего, и вычисляется по описанной ниже формуле. В куче может быть не более 128 наборов.
Размер блока каждого набора кратен базовому размеру набора. Базовый размер набора - это размер первого набора. Размер блоков второго набора в два раза больше, размер блоков третьего набора - в три раза больше, и т.д. Таким образом, размер блока конкретного набора вычисляется по формуле:
размер блока = (номер набора + 1) *
базовый размер набораНапример, если базовый размер набора равен 16, то размер блока первого набора (набора 0) будет равен 16 байт, второго набора (набора 1) - 32 байта, третьего набора (набора 2) - 48 байт и т.д.
Для того чтобы адреса, возвращаемые функциями подсистемы malloc, были правильно выровнены для всех типов данных, базовый размер набора должен быть кратен 8 в 32-разрядной среде и 16 в 64-разрядной среде.
Размер набора вычисляется по следующей формуле:
размер набора = число блоков в наборе *
(значение malloc +
((номер набора + 1) * базовый размер набора))Приведенная выше формула позволяет вычислить фактический размер каждого набора. В этой формуле значение malloc описывает размер внутренней структуры malloc, необходимой для каждого блока набора. Размер внутренней структуры составляет 8 байт в 32-разрядных приложениях и 16 байт в 64-разрядных приложениях. Этот объем памяти не выделяется для пользовательских данных, однако включается в общий размер набора.
Число блоков в наборе, число наборов и базовый размер набора можно задать с помощью переменной среды MALLOCOPTIONS.
Выделение памяти из наборов
Блоки выделяются из одного из наборов, если включена функция наборов malloc, а запрос на выделение памяти соответствует диапазону объемов памяти для набора. В целях экономии память выделяется из наименьшего возможного набора.
Если при получении запроса все блоки набора уже выделены, функция malloc автоматически увеличит набор для обработки запроса. При увеличении набора к нему добавляется число блоков, равное первоначальному числу блоков. Это значение можно настроить с помощью переменной среды MALLOCOPTIONS.
Поддержка нескольких куч
Поддержка в функции malloc нескольких куч позволяет реализовать работу с несколькими кучами malloc для повышения производительности приложений с нитями в системах с несколькими процессорами. Функция наборов malloc поддерживает до 128 наборов в куче. Это позволяет подсистеме malloc поддерживать параллельное применение наборов malloc с несколькими кучами для увеличения производительности процессов, работающих в системах с несколькими процессорами, за счет применения наборов.
Включение поддержки наборов malloc
По умолчанию наборы malloc не применяются. Для их применения необходимо задать следующие переменные среды:
- MALLOCTYPE
- MALLOCOPTIONS
При использовании наборов malloc значение переменной среды
MALLOCTYPE должно указывать на распределитель по
умолчанию. При задании MALLOCOPTIONS=buckets перед запуском процесса
для работы с наборами malloc будут применяться параметры по умолчанию. Для того
чтобы указать пользовательские параметры для наборов malloc, задайте перед
запуском процесса MALLOCOPTIONS=buckets,options, где
options - список параметров конфигурации, разделенных
запятыми.
Опции настройки наборов malloc
Переменная среды MALLOCOPTIONS позволяет включить поддержку наборов malloc со следующими предопределенными опциями настройки:
number_of_buckets:n
bucket_sizing_factor:n
blocks_per_bucket:n
bucket_statistics:[stdout|stderr|pathname]
no_mallinfo Эти опции подробно обсуждаются в разделе MALLOCOPTIONS.
Значение переменной среды MALLOCOPTIONS задается в следующем формате:
MALLOCOPTIONS=[buckets,[ number_of_buckets:n | bucket_sizing_factor:n | blocks_per_bucket:n |
bucket_statistics:[stdout|stderr|pathname] | no_mallinfo],...]В определении может быть указано несколько опций (в любом порядке), разделенных запятыми, например:
MALLOCOPTIONS=buckets,number_of_buckets:128,bucket_sizing_factor:8,bucket_statistics:stderr
MALLOCOPTIONS=buckets,bucket_statistics:stdout,blocks_per_bucket:512
Для разделения опций настройки применяются запятые. При использовании других разделителей (например, пробелов) опции конфигурации будут интерпретированы неправильно.
Каждая опция конфигурации может быть указана в переменной MALLOCOPTIONS не более одного раза. Если какая-либо опция указана несколько раз, то будет применяться последнее из указанных значений.
Если для опции настройки указано неверное значение, функция наборов malloc запишет предупреждение в стандартный вывод сообщений об ошибках и продолжит работу с применением значения по умолчанию.
buckets, как
показано в следующем примере: MALLOCOPTIONS=number_of_buckets:8,buckets,bucket_statistics:stderrПараметры наборов malloc
- number_of_buckets:n
- Опция number_of_buckets:n задает число наборов в
куче, где n - число наборов. Значение
n относится ко всем кучам.
По умолчанию число наборов в куче равно 16. Минимальное значение - 1. Максимальное значение - 128.
- bucket_sizing_factor:n
- Опция bucket_sizing_factor:n задает
базовый размер набора, где n -
базовый размер набора в байтах.
Значение параметра bucket_sizing_factor должно быть кратно 8 в 32-разрядном приложении, и 16 в 64-разрядном приложении. По умолчанию применяется коэффициент размера набора 32 для 32-разрядных приложений и 64 для 64-разрядных приложений.
- blocks_per_bucket:n
- Опция blocks_per_bucket:n задает первоначальное
число блоков в каждом наборе, где n - число блоков. Это
значение применяется ко всем наборам.
Кроме того, значение
n указывает, на сколько блоков нужно расширить область памяти, когда
будет исчерпан запас блоков, выделенных первоначально.
По умолчанию для параметра blocks_per_bucket установлено значение 1024.
- bucket_statistics:[stdout|stderr|pathname]
- Если указана опция bucket_statistics, то подсистема
malloc выводит статистический отчет по наборам malloc по
завершении каждого процесса, вызывающего подсистему malloc. Этот отчет содержит
информацию о параметрах наборов и числе запросов на выделение памяти,
обработанных для каждого набора. Если включена поддержка нескольких куч malloc, то число запросов на
выделение памяти, указанное для каждого набора, представляет собой сумму всех
запросов на выделение памяти, выполненных для этого набора из всех куч.
Статистический отчет по наборам направляется в одно из следующих устройств вывода, в соответствии со значением опции bucket_statistics.
- stdout - стандартный вывод
- stderr - стандартный вывод ошибок
- полное-имя-файла - пользовательский файл
Если указан пользовательский файл, то статистические данные добавляются в конец файла.
Для процесса, выходные данные которого являются входными для другого процесса, не следует применять стандартный вывод.
По умолчанию опция bucket_statistics отключена.
Прим.: Для первого набора всегда будет показан по крайней мере один запрос на выделение памяти, соответствующий функции atexit, которая выдает статистический отчет. Статистические данные для процессов с нитями будут содержать дополнительные запросы на выделение памяти для некоторых наборов из-за вызовов подсистемы malloc из библиотеки pthreads. - no_mallinfo
- Если указать
MALLOCOPTIONS=no_mallinfo, параметр mallinfo отключается, и информация о куче, управляемой подсистемой malloc, не вносится в протокол.
Опции настройки наборов malloc по умолчанию
Приведенная ниже таблица содержит значения опций настройки наборов malloc, применяемые по умолчанию.
| Опция настройки | Значение по умолчанию (32-разрядное приложение) | Значение по умолчанию (64-разрядное приложение) |
|---|---|---|
| число наборов в куче | 16 | 16 |
| коэффициент размера набора | 32 байта | 64 Б |
| диапазон выделения памяти | 1 - 512 байт (включительно) | 1 - 1024 байт (включительно) |
| первоначальное число блоков в наборе | 1024 | 1024 |
| статистический отчет по наборам | отключена | отключена |
Стандартная конфигурация функции наборов malloc увеличивает производительность приложений, создающих большое число запросов на выделение небольшого объема памяти. Однако изменение конфигурации наборов с помощью переменной MALLOCOPTIONS иногда позволяет повысить производительность. Для изменения заданных по умолчанию значений необходимо знать требования приложения к оперативной памяти и особенности ее использования в приложении. Для оптимизации настройки наборов malloc можно воспользоваться опцией bucket_statistics.
Ограничения
Из-за различных требований и особенностей использования памяти применение наборов malloc может не повысить производительность некоторых приложений. По этой причине не рекомендуется включать поддержку наборов malloc во всей системе. Для максимальной производительности поддержку наборов malloc следует включать и настраивать для каждого приложения в отдельности.