我有两台 CentOS 5 服务器,规格几乎相同。当我登录并执行 时ulimit -u
,在一台机器上我得到unlimited
,在另一台机器上我得到77824
。
当我运行如下 cron 时:
* * * * * ulimit -u > ulimit.txt
我得到了相同的结果(unlimited
,77824
)。
我正在尝试确定这些设置的位置,以便我可以更改它们。它们没有在我的任何配置文件中设置(.bashrc
、/etc/profile
等)。无论如何,这些都不会影响 cron)或/etc/security/limits.conf
(为空)。
我搜索了谷歌,甚至还做了grep -Ir 77824 /
,但至今没有找到任何结果。我不明白这些机器怎么会预设不同的限制。
我其实不是在考虑这些机器,而是在考虑另一台(CentOS 6)机器,它的限制为1024
,这个限制太小了。我需要运行具有更高限制的 cron 作业,而我所知道的唯一设置方法是在 cron 作业本身中。没问题,但我宁愿在系统范围内设置它,这样就不会那么容易被黑客攻击。
感谢您的帮助。这看起来应该很容易(但事实并非如此)。
编辑--已解决
好的,我搞明白了。这似乎是 CentOS 6 或我的机器配置的问题。在 CentOS 5 配置中,我可以设置/etc/security/limits.conf
:
* - nproc unlimited
这将有效地更新帐户和 cron 限制。但是,这在我的 CentOS 6 机器上不起作用。相反,我必须这样做:
myname1 - nproc unlimited
myname2 - nproc unlimited
...
一切按预期进行。也许 UID 规范也有效,但通配符 (*) 在这里肯定不行。奇怪的是,通配符确实适用于限制nofile
。
我仍然很想知道默认值实际上来自哪里,因为默认情况下,这个文件是空的,我不明白为什么两个 CentOS 盒子有不同的默认值,它们具有相同的硬件并且来自同一个提供商。
答案1
这些“默认”限制适用于:
- 这Linux 内核在开机时间(至
init
或systemd
过程), - 遗产,从父进程的限制(在
fork(2)
时间), - 聚丙烯酰胺 当用户会话打开时(可以替换内核/继承的值),
systemd
尤其是它所管理的流程,- 这过程本身(可以替换 PAM 和内核/继承的值,请参阅
setrlimit(2)
)。
普通用户的进程无法提高硬限制。
Linux 内核
在启动时,Linux 会为init
(或systemd
)进程设置默认限制,然后所有其他(子)进程都会继承这些限制。要查看这些限制:cat /proc/1/limits
。
例如,内核默认最大文件描述符数(ulimit -n
)为 1024/1024(软、硬),以及已提出在 Linux 2.6.39 中为 1024/4096。
默认最大进程数你谈论的是仅限于大约:
Total RAM in kB / 128
对于 x86 架构来说(至少),但发行版有时会更改默认内核值,因此检查你的内核源代码对于kernel/fork.c
,fork_init()
。“进程数”限制在那里称为 RLIMIT_NPROC。
聚丙烯酰胺
通常,为了确保登录时的用户身份验证,PAM 与一些模块一起使用(请参阅/etc/pam.d/login
)。
在 Debian 上,负责设置限制的 PAM 模块位于这里:/lib/security/pam_limits.so
。
该库将从/etc/security/limits.conf
和读取其配置/etc/security/limits.d/*.conf
,但即使这些文件为空,pam_limits.so 可能使用硬编码值您可以在源代码中检查。
例如,在 Debian 上,库已修复因此默认情况下,最大进程数(nproc
)是无限的,并且最大文件数(nofile
)为 1024/1024:
case RLIMIT_NOFILE: pl->limits[i].limit.rlim_cur = 1024; pl->limits[i].limit.rlim_max = 1024;
所以,检查你的 CentOS 的 PAM 模块源代码(寻找 RLIMIT_NPROC)。
但是,请注意,许多进程将不会通过 PAM(通常,如果它们不是由登录用户启动,例如守护进程和 cron 作业)。
systemd
如今,systemd
它被广泛使用,它可以替代init
并且还可以配置特定的限制值,特别是对它自己管理和创建的进程/守护进程。
其默认使用的某些限制可以在 中手动配置/etc/systemd/system.conf
。 文档中提供了更多信息。
答案2
在 RHEL6(CentOS6)上“最大用户进程数”默认设置为 1024。
您可以在文件中更改此值:
/etc/security/limits.d/90-nproc.conf
看https://bugzilla.redhat.com/show_bug.cgi?id=432903如果你想抱怨一下:)
答案3
互联网上关于这方面的信息很糟糕,这是我为 debian linux 制作的 limits.conf 文件,显示了所有可能的选项及其最大“安全”限制,并进行相应的调整。
这些是您可以设置的最高值,有些东西被散列了,激活这些东西会导致您出错并且无法登录到您的控制台,修改注释掉的选项需要您自担风险,但您不需要(大多数情况下默认值是无限制的)
我希望这对某些人有用,因为我无法在任何地方找到此信息,对这个文件进行了 4 个小时的研究。
==== FILE START =====
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
#- a user name
#- a group name, with @group syntax
#- the wildcard *, for default entry
#- the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#- NOTE: group and wildcard limits are not applied to root.
# To apply a limit to the root user, <domain> must be
# the literal username root.
#
#<type> can have the two values:
#- "soft" for enforcing the soft limits
#- "hard" for enforcing hard limits
#
#<item> can be one of the following:
#- core - limits the core file size (KB)
#- data - max data size (KB)
#- fsize - maximum filesize (KB)
#- memlock - max locked-in-memory address space (KB)
#- nofile - max number of open files
#- rss - max resident set size (KB)
#- stack - max stack size (KB)
#- cpu - max CPU time (MIN)
#- nproc - max number of processes
#- as - address space limit (KB)
#- maxlogins - max number of logins for this user
#- maxsyslogins - max number of logins on the system
#- priority - the priority to run user process with
#- locks - max number of file locks the user can hold
#- sigpending - max number of pending signals
#- msgqueue - max memory used by POSIX message queues (bytes)
#- nice - max nice priority allowed to raise to values: [-20, 19]
#- rtprio - max realtime priority
#- chroot - change root to directory (Debian-specific)
#
#<domain> <type> <item> <value>
#
#* soft core 0
#root hard core 100000
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#ftp - chroot /ftp
#@student - maxlogins 4
# -- Defaults:
#(core) core file size (blocks, -c) 0 (ulimit -Hc or -Sc)
#(data) data seg size (bytes, -d) unlimited
#(priority) scheduling priority (-e) 0
#(fsize) file size (blocks, -f) unlimited
#(sigpending) pending signals (-i) 378197
#(memlock) max locked memory (kbytes, -l) 64
# max memory size (kbytes, -m) unlimited
#(nofile) open files (-n) 65536
# pipe size (512 bytes, -p) 8
#(msgqueue) POSIX message queues (bytes, -q) 819200
#(rtprio) real-time priority (-r) 0
#(stack) stack size (kbytes, -s) 8192
#(cpu) cpu time (seconds, -t) unlimited
#(nproc) max user processes (-u) 378197
# virtual memory (kbytes, -v) unlimited
#(locks) file locks (-x) unlimited
# -- root Limits:
root - core -1
root - data -1
root - fsize -1
root - memlock -1
root - nofile 999999
root - stack -1
root - cpu -1
root - nproc -1
root - priority 0
root - locks -1
root - sigpending -1
root - msgqueue -1
root - rtprio -1
root - maxlogins -1
root - maxsyslogins -1
#root - rss -1
#root - as -1
#root - nice 0
#root - chroot -1
#All Users:
# -- Hard Limits
* hard core -1
* hard data -1
* hard fsize -1
* hard memlock -1
* hard nofile 999999
* hard stack -1
* hard cpu -1
* hard nproc -1
* hard priority 0
* hard locks -1
* hard sigpending -1
* hard msgqueue -1
* hard rtprio -1
* hard maxlogins -1
* hard maxsyslogins -1
#* hard rss -1
#* hard as -1
#* hard nice 0
#* hard chroot -1
# -- Soft Limits
* soft core -1
* soft data -1
* soft fsize -1
* soft memlock -1
* soft nofile 999999
* soft stack -1
* soft cpu -1
* soft nproc -1
* soft priority 0
* soft locks -1
* soft sigpending -1
* soft msgqueue -1
* soft maxlogins -1
* soft maxsyslogins -1
* soft rtprio -1
#* soft rss -1
#* soft as -1
#* soft nice 0
#* soft chroot -1
#randomuser:
# -- Soft Limits
randomuser soft core -1
randomuser soft data -1
randomuser soft fsize -1
randomuser soft memlock -1
randomuser soft nofile 999999
randomuser soft stack -1
randomuser soft cpu -1
randomuser soft nproc -1
randomuser soft priority 0
randomuser soft locks -1
randomuser soft sigpending -1
randomuser soft msgqueue -1
randomuser soft maxlogins -1
randomuser soft maxsyslogins -1
randomuser soft rtprio -1
#randomuser soft rss -1
#randomuser soft as -1
#randomuser soft nice 0
#randomuser soft chroot -1
# End of file
答案4
内核/fork.c
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
64 位线程大小为 8192
grep -i total /proc/meminfo
MemTotal: 8069352 kB
现在我除以 4 得到总数(以 kb 为单位)
echo $((8069352/4))
2017338
现在我得到了页数
echo $((8 * 8192 / 4096)
16
最终结果是
echo $((2017338/16))
126083
这样你就得到了thread-max参数,默认用户进程限制是一半
init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
从 root 执行 ulimit
ulimit -u
62932
echo $((62932*2))
125864 #we are near