今天新搭建了1臺jenkins,發佈前端代碼時報錯:
Error: EMFILE: too many open files
百度了一下,說是系統設置的最大打開文件數太小,修改了系統最大打開文件數,仍然報錯。 ssh進服務器手動執行jenkins腳本卻成功了,想到jenkins是一個進程(服務),通過進程去執行,是否該進程最大支持的文件數太小,查看發現只有4096,修改成65535後不再報錯。
以下是相關命令
查看系統最大打開文件數
[root@ruhr-gitlab ~]# ulimit -n
65535
查看全部限制
[root@ruhr-gitlab ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127020
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@ruhr-gitlab ~]#
臨時修改數量
[root@ruhr-gitlab ~]# ulimit -n 655350
[root@ruhr-gitlab ~]# ulimit -n
655350
永久修改數量(需重啓服務器)
[root@ruhr-gitlab ~]# vim /etc/security/limits.conf
#添加以下幾行
* soft nproc unlimited
* hard nproc unlimited
* soft nofile 655350
* hard nofile 655350
可以臨時和永久都修改,只要服務器不宕機或重啓,會一直生效,萬一宕機或重啓以後,因爲配置了/etc/security/limits.conf,所以也沒關係。
查看單個進程打開的文件數量上限
- 先找到進程PID
以jenkins爲例,PID是19369
[root@ruhr-gitlab ~]# ps -ef | grep jenkins
root 19369 1 16 13:49 pts/2 00:03:04 java -jar jenkins.war --httpPort=10010
root 9556 9261 0 14:09 pts/4 00:00:00 grep --color=auto jenkins
[root@ruhr-gitlab ~]#
- 查看進程能打開的文件數量上限
[root@ruhr-gitlab ~]# cat /proc/19369/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 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 127020 127020 processes
Max open files 4096 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 127020 127020 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
[root@ruhr-gitlab ]#
可以看到max_open_files是4096
修改單個進程打開的文件數量上限
修改/etc/security/limits.conf
和/etc/security/limits.d/20-nproc.conf
,完了重啓jenkins服務即可
[root@ruhr-gitlab ]# vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65535
root soft nproc unlimited
驗證
這裏實際生效的/etc/security/limits.conf
的配置。
它和/etc/security/limits.d/20-nproc.conf
的區別我還不太清楚,等弄清楚了再補充進來
[root@ruhr-gitlab ~]# cat /proc/9136/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 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes unlimited unlimited processes
Max open files 655350 655350 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 127020 127020 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
[root@ruhr-gitlab ~]#