关于网站最近出现504错误的总结,too open many files in system

如果你有耐心看完这篇文章,也许会给你带来真正的益处。

网站出现504错误,如果你用阿里云CDN的话还会报

504 Gateway Time-out The gateway did not receive a timely response from the upstream server or application. Powered by Tengine

这样一句错误提示,通过从网络上查询504代码,意思就是网关超时。直接的意思就是无法访问到我们的服务器。网络上的解决办法五花八门,各有各的说话,但是我服务器用的环境登陆啥的都显示正常。

所有只能通过日志去发现问题。于是不懂日志的我,只能在网站频繁出504错误的时候去看网站的日志,通过日志我发现这样一条MYSQL的信息:

too open many files in system。如果你懂英语,很明白这句话是什么意思,就是系统打开的文件数过多。为什么系统会打开文件数过多?其实无论是windows还是linux每运行一个系统都会打开文件,但是并不是我们所说的那个文件的意思,而是叫做文件描述符的东西,或者叫做句柄,这个概念我是第一次碰到,先了解下什么事文件描述符或者句柄。

一般的,在Windows中我们常常叫句柄,而在linux中我们叫文件描述符,因为我网站的环境是linux,那么接下来我会用文件描述符来说。

文件描述符网络上的定义是这样的,是内核通过文件描述符来访问文件。然后不同的描述符可以打开相同的文件。这里很抽象,我是这么理解的,每个人都可能打开这个文件,每个人相当于一个单独的ID,就会给每个人的访问分配一个文件描述符。

然后无论是windows还是linux都有文件描述符的限制,比如linux的句柄有的默认是1024,阿里云ESC默认的文件描述符是65535,但实际上句柄可以调节到很大,可以通过命令:# cat /proc/sys/fs/file-max 进行查看。

上面的句柄或者文件描述符不明白的可以继续自己百度一下,进行详细的了解。

而真正解决问题是从这里开始的,为什么回报too open many files in system?

网上的很多文章都跟我说是因为系统限制的文件描述符太小,需要进行文件描述符的扩大,比如改成655300,等等,但是改了以后呢?随着时间的推移,文件数打开的必定越拉越大,越来越多,这根本不是解决问题最好的方法!那么,还是那个问题,我喜欢刨根问底,为什么会变大?之前为什么没有问题呢?

直到,我了解到mysql的一个关键参数,table_open_ cache,这才是让文件描述符不够的原因所在。来,我们看一下这位大神!

table_open_ cache字面意思就是打开表的高速缓存。来看看英文的解释。作用呢就是每当访问MYSQL的一个表时,如果缓存中有空间,那么就将这个查询缓存放到这个里面,这样可以更快的访问到表的内容。

所以,网络上的各种教程来了,什么根据打开表的数量进行调节,比如MYSQL打开表500个就调节成512甚至是1024,或者说开到2048或者更大!我很是生气没有读过MYSQL英文文档的人说这些话,不过我也没有读过,但是我注意到有人引用了文档中的一句话:If table_open_cache is set too high, MySQL may run out of file descriptors and refuse connections, fail to perform queries, and be very unreliable. 来,复制粘贴-翻译。

如果table_open_cache设置得太高,MySQL可能会用尽文件描述符并拒绝连接,无法执行查询,并且非常不可靠!

也就是说,这个table_open_cache会占用文件描述符!所以说,盲目的加单table_open_cache会占用文件描述符,并且会占用着一直不会释放,直到你给他分配的空间占满为止!

所以,那些说加多大多大的,简直是不负责任!对这个没有了解之前,你怎么可以教别人加大呢?除非他系统确实更改过这个文件描述符,不然以linux来说,65535,不超一天很快会被占满,比如查询网站访问量高半天都不到数据库就会宕掉!所以,英文的描述是:设置的太高,非常不可靠!

所以,我就默默的将这个参数调节到了64M,这是默认的大小,除非你调节了系统的文件描述符或句柄数大小,否则默认我觉得就能解决目前我遇到的问题。

然后通过lsof -n | grep 123 -c 命令可以查看某ID打开句柄大小。123是ID。

那么很多人可能会问了,那没有缓存岂不是慢了?其实我们完全可以调节query_cache_size这个参数的大小来解决,当然我是针对程序而言,毕竟我不是专业的DBA,还需要你去观察数据库运行的状态去适当的调节。以上文章是泰安人才网www.tarczp.com小编遇到的问题解决方法,这也是网络上你绝对搜索不到

CSDN首发,希望可以帮助到用LNMP为环境的人!

在这里还要注明一下,虽然我们可以通过调节table_open_cache的大小来减小这种文件描述符的大小,但是如果调节的很小的话,又会影响什么呢?

调节的过小,势必会影响一直会打开表的操作,要知道频繁打开表的操作会对服务器的性能有一定的影响,比较明显的就是内存和CPU方面,如果你发现CPU经常占满100%或者内存过大,那么这个参数可以根据你当前打开表的最大数量进行调节,比如你的表打开数量为300,那么我们可以设置table_open_cache的大小为512,但是文件描述符的大小肯定会变得更大,超过MYSQL甚至是系统限定的文件描述符,这个时候就需要调节系统的参数。

比如linux可以调节的参数为:

修改配置文件/etc/security/limits.conf,加入:
* soft nofile 655350
* hard nofile 655350

这是我设置的最大的参数,并且设置:

[root@yejr]# sysctl -w fs.file-max=655350
[root@yejr]# sysctl -a | grep fs.file-max
fs.file-max = 655350

可以重启服务器后查看这些参数是否已经改变,否则就设置无效。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值