我有一个长时间运行的进程,最终会达到最大打开文件限制。我知道如何在它失败后更改它,但是有没有办法从命令行更改正在运行的进程?
我的 MongoDB 数据库在负载下遇到问题,日志中出现以下错误:
[initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
[initandlisten] can't create new thread, closing connection
Run Code Online (Sandbox Code Playgroud)
我得出的结论是,我需要提高 1024 的“ulimit -u”或“最大进程”设置,并且使用率可能已经超过了启动的 Web 前端(不知道如何检查) .
我编辑了 /etc/security/limits.conf 以添加最后两行(前两行已经存在):
* soft nofile 350000
* hard nofile 350000
* soft nproc 30000
* hard nproc 30000
Run Code Online (Sandbox Code Playgroud)
然后我重新启动了系统(顺便说一句,我应该这样做,还是重新启动 mongod 服务就足够了?)
重新启动后,查看 mongod 进程的进程限制,似乎软限制已被忽略:
$ cat /proc/2207/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 …Run Code Online (Sandbox Code Playgroud) 想知道 CentOS 6 中一个目录中可以存储的文件数量是否有限制。有一个特定的目录可能有数百万个子目录。
除了存储容量之外,目录中可以包含的文件数量是否有限制?(我在这里假设“文件”可以表示文件或目录)。
非常感谢!
任何人都可以解释(或知道来源)提供有关limits.conf 中项目的详细信息吗?手册页没有提供太多细节。
例如它说:
rtprio
maximum realtime priority allowed for non-privileged processes (Linux 2.6.12 and higher)
priority
the priority to run user process with (negative values boost process priority)
Run Code Online (Sandbox Code Playgroud)
这些有什么不同?他们可以采取什么价值观?他们默认是什么?
有些项目是显而易见的,但我在哪里可以找到更好的解释(默认值、范围、它们的实际含义等):
data
maximum data size (KB)
fsize
maximum filesize (KB)
memlock
maximum locked-in-memory address space (KB)
cpu
maximum CPU time (minutes)
nice
maximum nice priority allowed to raise to (Linux 2.6.12 and higher) values: [-20,19]
Run Code Online (Sandbox Code Playgroud)
超过 CPU 时会发生什么?进程被杀死?只有一个进程或整个用户被禁止使用 CPU?这是一个会话还是每分钟的最长时间?
我试图找到答案,但我能找到的只是一个几乎没有提供任何细节的手册页。
有类似的问题:Cgroups, limit memory per user,但该解决方案在“现代”系统中不起作用,其中 cgroups 层次结构由 systemd 管理。
简单的解决方案——模板 user-UID.slice——将不起作用,因为它不受支持,请参阅https://github.com/systemd/systemd/issues/2556。
有没有办法达到预期的效果——基于每个用户管理 CPU 和/或内存资源?
UPD:为了历史起见,我将保留我的解决方案,但systemctl set-property应在登录时调用,使用pam_exec,请参阅https://github.com/hashbang/shell-etc/pull/183。在这种方法中,用户登录和限制设置之间没有时间窗口。
我的解决方案。接口org.freedesktop.login1.Manage的/org/freedesktop/login1对象发出UserNew(u uid, o object_path)信号。我编写了一个简单的守护进程,它侦听信号,并且每次发出信号时都设置CPUAccounting=true为刚刚登录用户的切片。
我想要:
据我所知,我应该能够在/etc/security/limits.conf(或/etc/security/limits.d/*)中做到这一点:
* soft rss 64000000
* hard nofile 50000
* soft nofile 1024
Run Code Online (Sandbox Code Playgroud)
但是,我找不到一种无需重新启动即可重新加载这些值的方法。我已经读到登录时会重新加载这些值;当我这样做时它有效,su - user但它不起作用ssh user@localhost。
我在 /etc/pam.d 中有 pam_limits.so:
/etc/pam.d/login:session required pam_limits.so
/etc/pam.d/sshd:session required pam_limits.so
/etc/pam.d/su:session required pam_limits.so
Run Code Online (Sandbox Code Playgroud)
我在 sshd_config 中有 PAM:
/etc/ssh/sshd_config:UsePAM yes
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用ulimitand设置值sysctl,但我想测试它/etc/security/limits.conf是否在做正确的事情而无需重新启动。
当人们使用 ssh 登录而不重新启动时,如何确保设置了这些值?
我们最近在一些服务上达到了最大打开文件限制。还有很多其他限制。有没有办法监控进程与这些限制的接近程度,以便我们可以在需要提高限制或修复根本原因时收到警报?同样,是否可以查看这些事件的日志,以便我们知道何时发生崩溃是因为达到了这些限制之一?
我有一些问题网络客户端发送数据太快。
我想减慢它们的速度,使用 iptables,或者可能使用 tc。
我见过 iptables 解决方案,如:
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
但我认为该限制适用于符合规则的所有内容,而不是每个客户端地址。
有没有办法让这个规则限制每个客户端地址的数据包?
在共享服务器 (Debian Jessie) 上,有一些内存限制(和其他限制,例如进程数)适用于在/etc/security/limits.conf.
然而,这些限制似乎不适用于由 cron 启动的进程,有时人们的 cron 工作会意外地破坏所有其他人的性能。
有什么方法可以将限制应用limits.conf到 cron 作业吗?或者,如果这不可能,至少对所有用户的 cron 作业实施一些限制?
Cron 似乎在 cron cgroup 中运行所有作业,而不是在用户的 cgroup 中,因此这也不是一种简单的方法:(