使用 Ubuntu 18.04.4 LTS (Linux 5.3.0-62-generic) 时,我经常遇到“打开文件过多”错误。例如,我必须关闭 Web 浏览器才能使用/构建/编译 Android Studio。
硬件配置:
- 处理器 Intel Core i7-5820K(6 核/12 个虚拟核)
- 32 转 RAM
- 双启动 Ubuntu / Windows 7
- 系统位于 SSD / Ext4 部分,数据位于 HDD / NTFS 部分(共享 win/lin)
配置和系统状态:
$ 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) 127862
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 4096
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) 500000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
$ lsof | wc -l
194775
$ cat /etc/security/limits.conf
# [... commented lines ]
* soft nofile 500000
* hard nofile 500000
* soft nproc 500000
* hard nproc 500000
root soft nofile 500000
root hard nofile 500000
root soft nproc 500000
root hard nproc 500000
# End of file
对于 PID 3353 (Java / Android Studio)
$ lsof -p 3353 | wc -l
875
$ cat /proc/sys/fs/file-nr
14144 0 2097152
我不明白为什么会出现这个错误?!;-(
请帮忙
ulimit -n
和 /etc/security/limits.conf之间的限制是什么?
在 /etc/security/limits.conf 中,所有用户的限制为 500000。
使用ulimit -n
,限制为 4096
如果 X > 4096 则返回ulimit -n X
错误:
ulimit: open files: cannot modify limit: operation not permitted
答案1
您看到此错误是因为明显超出了打开文件的限制。
如果你看看该命令的输出
lsof | grep -F ' REG '|wc -l
您将看到有多少常规文件处于打开状态。这个数字肯定大于您的限制 4096。
了解哪个用户遇到此错误也很重要,因为 Linux 不仅针对整个系统设置了限制,还针对单个用户设置了限制。
为了解决这个问题,一旦你找到了罪魁祸首,你就应该增加特定用户和/或整个系统的限制。
在 /etc/security/limits.conf 中,您应该写入软限制和硬限制
username soft nofile 799972
username hard nofile 1048576
其中 username 是您的用户名
之后您应该重新登录操作系统,或者更好的是,重新启动计算机。