如何在 debian 中规避“打开文件过多”

如何在 debian 中规避“打开文件过多”

如果我想立即查看 apache2 服务器的所有相关日志文件,我使用

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

但由于现在这些文件太多了,我想增加该限制。

如何为一个 ssh 会话增加它?我怎样才能在全球范围内增加它?

我可以看到我的机器上的打开文件限制为 1024:

ulimit -n
1024

答案1

重要的是要知道有两种限制:

  • A硬限制只能由 root 进行配置。这是软限制的最高可能值(限制)。
  • A软限制普通用户即可设置。这是实际生效的限制。

单个会话的解决方案

在 shell 中设置软限制:

ulimit -Sn 2048

此示例将实际限制提高到 2048,但仅当硬限制(检查:)ulimit -Hn相同或更高时该命令才会成功。如果您需要更高的值,请使用以下方法之一提高硬限制。这些限制是按进程设置的,并且由新生成的进程继承,因此在同一 shell 中执行此命令后运行的任何内容都将具有新的限制。

在单个会话中更改硬限制

这并不容易,因为只有 root 可以更改硬限制,并且切换到 root 后您必须切换回原始用户。这是解决方案sudo

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

全系统解决方案

在 Debian 和许多其他使用的系统中,pam_limits您可以/etc/security/limits.conf/etc/security/limits.d. conf 文件包含描述。示例行:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

webadmins这将为登录后组内的用户设置硬限制和默认软限制。

其他限制

硬限制值受到打开文件描述符值的全局限制的限制,/proc/sys/fs/file-max在现代 Linux 发行版中默认情况下该值相当高。该值受到NR_OPEN内核编译期间使用的值的限制。

难道就没有更好的解决办法吗?

也许您可以检查*log您提供的所有文件是否tail -f都是真正需要监视的活动文件。其中一些文件可能已关闭以进行日志记录,您只需打开少量文件即可。

答案2

我的 Apache error.log 中有 PHP 警告:

failed to open stream: Too many open files in ...

所以我发现,apache 在启动时单独设置这个值(在我的 Ubuntu 14.04 上)。它配置在/etc/apache2/envvars.它说:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

所以我不得不调整第三行。

相关内容