Назад | Перейти на главную страницу

freebsd 7.2 kern.threads.max_threads_per_proc не меняется после перезагрузки

У меня есть несколько многопоточных приложений на моем сервере, основанных на 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.

  1. Параметры загрузчика сохранены в файле /boot/loader.conf - они экспортируются загрузчиком в среду ядра и действуют во время загрузки ядра. После загрузки вы можете увидеть эти значения через kenv команда. Эту среду можно изменить с помощью команды kenv, но это полезно только для файлов, которые читаются модулями ядра. E. g. вы можете установить kern.hwpmc.nbuffers = 32, а затем - модуль kldunload / kldload hwpmc. Но в целом после изменения /boot/loader.conf необходимо перезагрузить компьютер.

  2. 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"