我正在尝试运行一个管道作业,它在我在amazon上动态构建的从机上运行scala测试。
设置计算机-->在设置的计算机上生成代码-->运行测试
当我的测试开始时,几分钟后我遇到“打开的文件太多”错误,我的工作就结束了。
我试图改变奴隶机的限制,但我做的每件事似乎都会被忽视,只要我通过詹金斯的工作。
注意:当我在从机上手动运行同一个命令时,它的工作就像一个符咒,我确实看到,这些限制是为我在系统上定义的jenkins用户正确定义的。
我就是这样设置的(从机是CentOS 7.2)
作为根用户,我更改了/etc/security/limits.conf文件并添加了:
* hard nofile 100000
* soft nofile 100000
jenkins hard nofile 100000
jenkins soft nofile 100000
我还确保/etc/security/limits.d/下没有任何内容可以覆盖这些值。(我最初用这些值创建了一个/etc/security/limits.d/30-jenkins.conf,但没有帮助)
我已确保/etc/pam.d/login具有以下行:
session required pam_limits.so
重新启动后,我确保从jenkins用户运行'ulimit-a'确实显示了新值。
我创建了一个简单的管道作业:
node('master') {
stage('master-limits') {
sh('ulimit -a')
}
}
node('swarm') {
stage('slave-limits') {
sh('ulimit -a')
}
}
运行时,我得到以下输出:
[Pipeline] stage
[Pipeline] { (master-limits)
[Pipeline] sh
00:00:00.053 [ulimit-test] Running shell script
00:00:00.305 + ulimit -a
00:00:00.306 time(seconds) unlimited
00:00:00.306 file(blocks) unlimited
00:00:00.306 data(kbytes) unlimited
00:00:00.306 stack(kbytes) 8192
00:00:00.306 coredump(blocks) 0
00:00:00.306 memory(kbytes) unlimited
00:00:00.306 locked memory(kbytes) 64
00:00:00.306 process 64111
00:00:00.306 nofiles 65536
00:00:00.306 vmemory(kbytes) unlimited
00:00:00.306 locks unlimited
00:00:00.306 rtprio 0
[Pipeline] stage
[Pipeline] { (slave-limits)
[Pipeline] sh
00:00:00.348 [ulimit-test] Running shell script
00:00:00.606 + ulimit -a
00:00:00.606 time(seconds) unlimited
00:00:00.606 file(blocks) unlimited
00:00:00.606 data(kbytes) unlimited
00:00:00.606 stack(kbytes) 8192
00:00:00.606 coredump(blocks) 0
00:00:00.606 memory(kbytes) unlimited
00:00:00.606 locked memory(kbytes) 64
00:00:00.606 process 257585
00:00:00.606 nofiles 4096
00:00:00.606 vmemory(kbytes) unlimited
00:00:00.606 locks unlimited
00:00:00.606 rtprio 0
从结果中可以看出,尽管我已经将slave的限制改为100000,但是slave的限制仍然显示为“4096”。
我的swarm插件作为服务运行,配置如下:
[Unit]
Description=Jenkins slave daemon
After=network.target
[Service]
User=jenkins
ExecStart=/usr/java/jdk1.8.0_112/bin/java -jar /var/lib/jenkins/swarm-client-3.3.jar -fsroot /var/lib/jenkins -username [email protected] -password * -name swarm -master http://jenkins.com -executors 1 -mode exclusive -labels swarm -disableSslVerification
ExecStop=/usr/bin/killall -w -s 2 java
[Install]
WantedBy=multi-user.target
我使用Jenkins 2.62和swarm插件来按需设置奴隶。
我在主服务器和从服务器上都使用JAVA 1.8.0u112。
这个问题与基于Ubuntu的slave或基于CentOS的slave一致。
我遗漏了什么吗?
最佳答案
在我开始阅读systemd init系统之前,这个问题也一直困扰着我。它似乎不遵守您在/etc/security/limits.conf文件中设置的任何限制
相反,您需要编辑systemd配置文件,如下所示:
[Unit]
Description=Jenkins slave daemon
After=network.target
[Service]
User=jenkins
LimitNOFILE=100000
ExecStart=/usr/java/jdk1.8.0_112/bin/java -jar /var/lib/jenkins/swarm-client-3.3.jar -fsroot /var/lib/jenkins -username [email protected] -password * -name swarm -master http://jenkins.com -executors 1 -mode exclusive -labels swarm -disableSslVerification
ExecStop=/usr/bin/killall -w -s 2 java
[Install]
WantedBy=multi-user.target
在这里找到答案:https://serverfault.com/a/678861
关于linux - Jenkins从属使用管道忽略了系统定义的限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44283799/