freebsd 7.2 kern.threads.max_threads_per_proc 重启后没有改变

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)。

请告诉我如何才能永久改变这一点?

答案1

有两种不同的方法来调整内核参数——加载器可调参数和 sysctl。

  1. 加载程序可调参数保存在文件 /boot/loader.conf 中 - 它们由加载程序导出到内核环境并在内核启动时生效。启动后,您可以通过kenv命令查看这些值。此环境可以通过 kenv 命令更改,但这仅适用于内核模块读取的可调参数。例如,您可以设置 kern.hwpmc.nbuffers=32,然后设置 kldunload/kldload hwpmc 模块。但一般来说,您需要在更改 /boot/loader.conf 后重新启动。

  2. sysctl 变量。许多 sysctl 值可以在运行时通过命令更改sysctl。要在重启后重新应用 sysctl 更改,可以将其保存在 /etc/sysctl.conf 文件中。

许多加载器可调参数(但不是全部)都有相应的同名只读 sysctl。但一般来说,加载器可调参数和 sysctl 之间没有 1:1 映射。例如,许多 sysctl 没有同名的加载器可调参数,并且无法通过 loader.conf 进行更改。

kern.threads.max_threads_per_proc仅是 sysctl,应保存在 /etc/sysctl.conf 中

答案2

好吧,首先感谢你的回答。当然,答案都是对的,但我的问题原因更深,在内核源代码中 :)

我尝试一步一步解释我的解决方案以及我发现的问题。因此,就像 @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,就像在源代码中一样。虽然内核值以某种方式覆盖了用户定义,因此,这仍然会引起问题,但现在我的问题已经解决,线程限制已永久增加。

再次感谢您的回答。

答案3

是你的/boot/loader.conf貴賓嗎?加载器.conf(5)指出/boot/loader.rc需要包含以下几行:

包括/boot/loader.4th
 开始

/boot/loader.4th如果包含如下内容,则反过来加载,/boot/defaults/loader.conf而这些加载又可能会加载:/boot/loader.conf

loader_conf_files="/boot/device.hints /boot/loader.conf /boot/loader.conf.local"

相关内容