我正在运行Ubuntu Linux(2.6.28-11-generic#42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009 i686 GNU/Linux),似乎命令"ulimit -t"无法正常工作.我跑了:
ulimit -t 1; myprogram
'myprogram'是无限循环的地方.我预计程序会在1秒后中断,但它并没有停止.我在Linux Fedora安装上尝试了同样的事情,它按预期工作.
是否有一些配置必须设置才能正常工作?
- tsf
需要根据我自己的服务器需求"计算"最佳ulimit和fs.file-max值.请不要与"如何在各种Linux发行版中设置这些限制"问题发生冲突.
我在问:
实际上我可以在网上找到一些旧的参考资料:http: //www.faqs.org/docs/securing/chap6sec72.html "我们拥有的每4M内存就像256一样合理:即128 MB的机器RAM,将其设置为8192 - 128/4 = 32 32*256 = 8192"
任何最新的参考表示赞赏.
我有一个Perl脚本,它执行各种安装步骤来为我们公司设置开发盒.它运行各种shell脚本,其中一些由于低于所需的ulimit
s(特别-s
是我的情况下的堆栈大小)而崩溃.
因此,我想设置一个ulimit
适用于children
从我的主Perl中启动的所有脚本(),但我不知道如何实现这一点 - 任何尝试从脚本中调用ulimit只会将其设置为特定的子壳,立即退出.
我知道我可以ulimit
在运行Perl脚本之前调用或使用/etc/security/limits.conf
但我不希望用户知道任何这些 - 他们应该只知道如何运行脚本,这应该为他们处理所有这些.
我也可以在ulimit
每次运行命令时运行,这样ulimit -s BLA; ./cmd
但我不想每次都复制它,我觉得那里有一个更好,更清洁的解决方案.
另一个疯狂的"解决方法"是创建一个名为BLA.sh的包装脚本,它将设置ulimit并调用BLA.pl,但同样,这是我的脑海中的黑客,现在我有2个脚本(我甚至可以制作BLA.pl使用"ulimit -s BLA; ./BLA.pl --foo"调用自己,并根据它是否看到--foo或不同而采取不同的行为,但这甚至比以前更黑.
最后,显然我可以安装BSD :: Resource,但我想避免使用外部依赖.
那么,什么是的 Perl脚本内设置的ulimit,使之适用于所有的孩子呢?
谢谢.
当进行一些服务器代码,我写了一个压力测试,我发现,即使我的描述符句柄调用close()(和验证错误的结果)的描述符没有被释放,最终导致accept()方法返回一个错误"打开文件太多".
现在我明白这是因为ulimit,我不明白为什么如果我在每个同步接受/读/发送周期后调用close(),我会遇到它?
我通过运行带有lsof的监视来验证描述符实际上是在那里:
ctsvr 9733 mike 1017u sock 0,7 0t0 3323579 can't identify protocol ctsvr 9733 mike 1018u sock 0,7 0t0 3323581 can't identify protocol ...
当然,大约有1000个左右.此外,使用netstat检查我可以看到没有挂起的TCP状态(没有WAIT或STOPPED或任何东西).
如果我只是从客户端执行单个connect/send/recv,我会注意到套接字确实保留在lsof中; 所以这甚至不是负载问题.
服务器在Ubuntu Linux 64位计算机上运行.
有什么想法吗?
我的目的是在golang程序中设置ulimit -n,这样我就不必在全局范围内设置它,而是在程序中限制它.
找到systemcalls setrlimit并获得相同的rlimit.(http://linux.die.net/man/2/setrlimit)
但是当我尝试同样的示例程序时,我在设置值时收到错误说无效参数.
package main
import (
"fmt"
"syscall"
)
func main() {
var rLimit syscall.Rlimit
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
if err != nil {
fmt.Println("Error Getting Rlimit ", err)
}
fmt.Println(rLimit)
rLimit.Max = 999999
rLimit.Cur = 999999
err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
if err != nil {
fmt.Println("Error Setting Rlimit ", err)
}
err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
if err != nil {
fmt.Println("Error Getting Rlimit ", err)
}
fmt.Println("Rlimit Final", rLimit)
}
Run Code Online (Sandbox Code Playgroud)
获得的输出是:
george@george-Not-Specified ~/work/odesk/progium/trial $ …
Run Code Online (Sandbox Code Playgroud) 我使用duplicity来备份一些文件.我现在正在尝试恢复到我的Mac来测试备份,但是得到以下错误:
> duplicity me@backupserver.io/backup_dr ~/restored_files
Max open files of 256 is too low, should be >= 1024.
Use 'ulimit -n 1024' or higher to correct.
Run Code Online (Sandbox Code Playgroud)
所以我尝试:
sudo ulimit -n 1024
Run Code Online (Sandbox Code Playgroud)
看起来很好,然后运行:
> ulimit -a
...
open files (-n) 256
...
Run Code Online (Sandbox Code Playgroud)
你如何实际获得改变的限制?我没有运气谷歌:(
我写了一个简单的程序来限制它的数据大小为65Kb,并验证相同我分配一个超过65Kb的虚拟内存,逻辑上如果我正在做所有正确(如下)malloc调用应该失败,不是吗?
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[])
{
struct rlimit limit;
/* Get max data size . */
if (getrlimit(RLIMIT_DATA, &limit) != 0) {
printf("getrlimit() failed with errno=%d\n", errno);
return 1;
}
printf("The soft limit is %lu\n", limit.rlim_cur);
printf("The hard limit is %lu\n", limit.rlim_max);
limit.rlim_cur = 65 * 1024;
limit.rlim_max = 65 * 1024;
if (setrlimit(RLIMIT_DATA, &limit) != 0) {
printf("setrlimit() failed with errno=%d\n", errno);
return 1;
}
if (getrlimit(RLIMIT_DATA, &limit) != …
Run Code Online (Sandbox Code Playgroud) 我们有一个 3 节点的 Kafka 集群部署,总共有 35 个主题,每个主题有 50 个分区。总的来说,我们已经配置了replication factor=2
. 我们看到一个非常奇怪的问题,Kafka 节点间歇性地停止响应并显示错误:
ERROR Error while accepting connection (kafka.network.Acceptor)
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
at kafka.network.Acceptor.accept(SocketServer.scala:460)
at kafka.network.Acceptor.run(SocketServer.scala:403)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
我们已经部署了最新的 Kafka 版本并使用 spring-kafka 作为客户端:
kafka_2.12-2.1.0(CentOS Linux 版本 7.6.1810(核心))
lsof -p <kafka_pid>|wc -l
,我们得到的打开描述符总数只有 7000 左右。lsof|grep kafka|wc -l
,我们将获得大约 150 万个开放 FD。我们已经检查过它们都只属于 Kafka 进程。lsof|grep kafka|wc -l
会回到 7000。我们已尝试将文件限制设置为非常大,但仍然出现此问题。以下是为 kafka 进程设置的限制:
cat /proc/<kafka_pid>/limits
Limit …
Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 12上遇到Tomcat7打开文件过多的问题,所以我将打开文件数量的硬限制和软限制分别从4096和1024增加到16384.现在我没有收到任何更多的错误打开文件,但整体CPU%似乎已经上升.增加max文件的数量是否也有一些CPU时间成本?如果没有,为什么不设置极高的ulimit?