Что демонстрируют vm.kvm_size и vm.kmem_size?

Описание

Этот вопрос обычно появляется прямо за желанием улучшить распределение памяти в ядре.
Для начала стоит осознать, как в общем смотрится виртуальное адресное место FreeBSD. В его нижней части размещен текущий процесс, а верхнюю постоянно занимает ядро. Отрезок виртуального персонального места, занятый ядром, — kernel virtual memory (KVM) он же kernel virtual address space (KVA) — ограничен адресами KERNBASE снизу и VM_MAX_KERNEL_ADDRESS сверху. Эти величины изменяются только от площадки к площадке, а vm.kvm_size возвращает их разность:

vm.kvm_size = VM_MAX_KERNEL_ADDRESS - KERNBASE

На жив машине ядро фиксирует конец применяемой части KVM в переменной ядра kernel_vm_end. Отрезок от kernel_vm_end до VM_MAX_KERNEL_ADDRESS и есть свободная часть KVM:

vm.kvm_free = VM_MAX_KERNEL_ADDRESS - kernel_vm_end

Разумеется, что переменные vm.kvm_size и vm.kvm_free чисто информационные, настраивать их нельзя.

В KVM есть участок, который ядро употребляет для динамического распределения памяти средством malloc(9) и zone(9). Длина этого участка рассчитывается при загрузке системы по формуле:

vm.kmem_size = min(max(max(VM_KMEM_SIZE, Physical_memory / VM_KMEM_SIZE_SCALE), VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)

Смотрится жутковато, но сущность обычная: vm.kmem_size_{min,max} задает диапазон для автонастройки, которая сводится к выбору большего из VM_KMEM_SIZE (это #define) и ОЗУ / vm.kmem_size_scale.

Также можно жестко указать vm.kmem_size из loader.conf. Наконец, при любых настройках kmem_size не может быть более двух размеров ОЗУ.

Обратите внимание, что kmem — это участок виртуального адресного пространства, а не физической памяти. Именно поэтому ядро может упасть в панику «kmem_map too small», хотя ОЗУ еще в избытке, если какая-то из подсистем ядра пытается выделить слишком много памяти для своих нужд. Типичный пример этого — виртуальный диск, созданный с помощью «mdmfs -M».

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *