У меня есть несколько многопоточных приложений на моем сервере, основанных на FreeBSD 7.2, поэтому мне нужно увеличить kern.threads.max_threads_per_proc до 4000 (значение по умолчанию - 1500). Я изменил его, используя "sysctl kern.threads.max_threads_per_proc = 4096", и он выглядит нормально, но после перезагрузки этот параметр снова имеет значение по умолчанию. Я также пытался использовать /boot/loader.conf, но он все еще возвращается к значению по умолчанию.
Вот что содержится в loader.conf:
kern.maxdsiz=1073741824
kern.maxtsiz=1073741824
kern.maxssiz=268435456
kern.maxproc=10000
kern.maxprocperuid=9000
kern.threads.max_threads_per_proc=4000
И даже с этими настройками "sysctl kern.threads.max_threads_per_proc" после перезагрузки показывает значение по умолчанию (1500).
Подскажите, пожалуйста, как это изменить навсегда?
Существует два разных метода настройки параметров ядра - параметры загрузчика и sysctl.
Параметры загрузчика сохранены в файле /boot/loader.conf - они экспортируются загрузчиком в среду ядра и действуют во время загрузки ядра. После загрузки вы можете увидеть эти значения через kenv
команда. Эту среду можно изменить с помощью команды kenv, но это полезно только для файлов, которые читаются модулями ядра. E. g. вы можете установить kern.hwpmc.nbuffers = 32, а затем - модуль kldunload / kldload hwpmc. Но в целом после изменения /boot/loader.conf необходимо перезагрузить компьютер.
sysctl переменные. Многие значения sysctl могут быть изменены во время выполнения через sysctl
команда. Чтобы повторно применить изменения sysctl после перезагрузки, их можно сохранить в файле /etc/sysctl.conf.
Многие настраиваемые параметры загрузчика (но не все) имеют соответствующие доступные только для чтения sysctl с тем же именем. Но в общем случае между настройками загрузчика и sysctl не существует сопоставления 1: 1. E. g. у многих sysctl нет загрузчика, настраиваемого с таким же именем, и их нельзя изменить с помощью loader.conf.
kern.threads.max_threads_per_proc
это только sysctl и должен быть сохранен в /etc/sysctl.conf
Что ж, прежде всего спасибо за все ваши ответы. Конечно, с ними все в порядке, но причина моей проблемы была немного глубже, в исходном коде ядра :)
Я пытаюсь пошагово объяснить свое решение, что я нашел. Итак, как сказал @citrin kern.threads.max_threads_per_proc
необходимо установить в sysctl.conf. Но это не помогает изменить значение больше 1500 (кстати, это максимальное значение ядра и значение по умолчанию). Итак, это связано с тем, что в системе есть еще один предел, который отменяет любое из значений, определенных пользователем. Я не знал, где именно, поэтому попытался найти что-то в исходниках ядра.
Я нашел это значение в исходниках ядра: /usr/src/sys/kern/kern_thread.c
. Он содержит такой код:
int max_threads_per_proc = 1500;
SYSCTL_INT(_kern_threads, OID_AUTO, max_threads_per_proc, CTLFLAG_RW,
&max_threads_per_proc, 0, "Limit on threads per proc");
Я изменил это значение на 5000 и построил новое ядро с GENERIC
конфигурацию и установил ее. Для меня это было небольшим сюрпризом, потому что в sysctl.conf у меня был установлен лимит потока 4096, но рабочее значение было 5000, как в исходниках. Хотя значения ядра каким-то образом переопределяют определенные пользователем, это все еще вызывает вопросы, но сейчас моя проблема решена, ограничение потока было постоянно увеличено.
Еще раз спасибо за ответы.
Ваш /boot/loader.conf
заслужили? loader.conf (5) утверждает, что /boot/loader.rc
должен содержать следующие строки:
include /boot/loader.4th start
/boot/loader.4th в свою очередь загружает /boot/defaults/loader.conf
который, в свою очередь, может загрузить /boot/loader.conf
если что-то вроде этого включено:
loader_conf_files="/boot/device.hints /boot/loader.conf /boot/loader.conf.local"