`
bugyun
  • 浏览: 556882 次
社区版块
存档分类
最新评论

解决Nginx出现“Too many open files”的问题【转】

 
阅读更多

转:https://www.xiaoz.me/archives/13011

 

最近发现https://imgurl.org/ 自建CDN节点偶尔出现无法打开的情况,查看服务器负载不高,nginx连接数大概在1024后就无法处理,按理说nginx处理1024左右的并发还是绰绰有余的,但就是出现无法打开的情况,查看nginx错误日志,出现大量的“Too many open files”错误,大致意思就是说nginx无法打开更多的文件,看来问题并不在并发数上面。

出现这个错误可能是由于系统的ulimit限制和nginx自身的配置有关系,先来了解下概念。

什么是ulimit?

ulimit命令用来限制系统用户对shell资源的访问。如果不懂什么意思,下面一段内容可以帮助你理解:

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

简单来说,ulimit描述符可以对用户打开的文件数量进行限制(不止限制打开文件数量),让单个用户不至于打开较多的文件,导致系统奔溃或者资源不足的情况。

查看ulimit

既然知道了ulimit是做什么的,首先要先知道系统底层限制到底是多少,ulimit的参数如下:

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

由于上述nginx错误是无法打开过多的文件,那么我们直接使用ulimit -n查看同一时间最多可开启的文件数。

[root@bwh-cdn conf]# ulimit -n
1024

从上述命令可以看出限制的1024个文件,这就导致nginx尝试打开更多的文件(超出1024个)的时候出现错误“Too many open files”

解决办法

修改ulimit限制

直接执行命令ulimit -n 65535修改打开文件数,65535指的是需要同一时间最多打开多少个文件,请根据自身情况适当修改。

ulimit命令修改只对当前的shell有效,退出后失效,如果需要永久生效,需要修改/etc/security/limits.conf这个文件,在底部加入下面的配置:

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535 
* hard nofile 65535
  • *:代表全局
  • soft:代表软件
  • hard:代表硬件
  • nproc:是代表最大进程数
  • nofile:是代表最大文件打开数

修改完毕后,再次执行命令:ulimit -n可以看到设置已经生效:

[root@rakcdn conf]# ulimit -n
65535

修改nginx打开文件限制

修改nginx.conf加入一行,并重载nginx配置:nginx -s reload

worker_rlimit_nofile 65535;

worker_rlimit_nofile这个参数的含义是:“为nginx工作进程改变打开最多文件描述符数目的限制。用来在不重启主进程的情况下增加限制。”

总结

上述操作修改了2个地方,一个是ulimit限制,一个是nginx的worker_rlimit_nofile限制。修改后nginx读取更多的文件轻轻松松。

此文部分内容参考了:

分享到:
评论

相关推荐

    访问应用很慢,访问Nginx时,报错:accept() failed (24 Too many open files).docx

    "解决 Nginx 访问慢和 accept() failed 错误的方法" 在本文中,我们将讨论 Nginx 访问慢和 accept() failed 错误的解决方案。...通过这些方法,可以解决 Nginx 连接过多的问题,提高系统的性能和稳定性。

    nginx fastdfs.docx

    搭建 Nginx 与 FastDFS 的组合,是一种常见的文件存储和分发解决方案。FastDFS 是一个开源的轻量级分布式文件系统,而 Nginx 作为高性能的 Web 服务器和反向代理服务器,两者结合能够提供稳定、高效的文件上传和下载...

    Tengine(Nginx)配置参考

    设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。 worker_rlimit_nofile 100000; #全局错误日志及PID文件 #error_log logs/...

    高性能服务器集群的架设及优化笔记.docx

    * 解决服务端 too many open files 问题:使用 ulimit -n 30000 选项,解决服务端 too many open files 问题。 服务器集群架设是高性能网站的关键技术。通过服务器集群架设、优化和 troubleshoot,可以提高网站的...

    一些优化Nginx服务器的技巧简介

    增加此值可以防止在高负载下出现too many open files的错误,但同样需要注意操作系统的限制。 ### 总结 在优化Nginx服务器的过程中,应根据实际应用场景和服务器硬件资源进行合理配置。上述配置中,HTTP模块和...

    解析服务器常见错误代码500、501、502、503、504、505

    一:500错误 1、500 Internal Server Error 内部... b、如果是too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf,还是出现too many open

    Nginx性能配置[参照].pdf

    提高这个值可以允许Nginx处理更多的并发连接,避免“too many open files”的错误。 3. **events模块**: - **worker_connections**:设置每个工作进程的最大并发连接数,不应超过系统允许的最大socket连接数。 -...

    Nginx配置优化详解

    `worker_rlimit_nofile`设定每个工作进程可打开的最大文件数,提高这个值可以避免“too many open files”的问题。 接下来是`events`模块,这是处理客户端连接的核心。`worker_connections`定义了一个工作进程可...

    Nginx服务器配置性能优化方案

    `worker_rlimit_nofile`设定每个工作进程的最大文件描述符数量,提高并发能力,避免“too many open files”的问题。确保其值大于操作系统默认限制。 其次,`events`模块是连接处理的核心。`worker_connections`...

    服务器集群及优化笔记

    3. 分析性能瓶颈,例如ab测试中可能出现的"too many open files"错误,可以通过调整ulimit增加文件描述符限制。 4. 调整Nginx配置,如设置keepalive_timeout为0,避免在高并发下过多占用TCP连接。 5. 观察服务器打开...

    如何对AIX、ORACLE、WebLogic和WebSphere进行调优

    大并发时后台报too many open files - 这个问题是由于系统打开文件数量限制导致的。 - 可以通过调整操作系统的文件描述符限制来解决,例如使用`ulimit -n`命令。 ##### 3. 修改`/ehr/weblogic11/user_projects/...

    Python Web框架Tornado运行和部署

    注意,为了防止"Too many open files"错误,可能需要增加每个进程允许的最大文件句柄数。 2. **进程和端口**: 由于Python的全局解释器锁(GIL),为了充分利用多核CPU,通常需要运行多个Python进程。Tornado提供...

Global site tag (gtag.js) - Google Analytics