最近两周官网出现一个问题,就是访问速度很慢,开始寻找是某个业务文件被清除了找不到,然后去修改代码,再次上线的时候又出现了相同问题。然后将日志功能开启,今天出现问题去查日志发现出现 java.io.IOException: 打开的文件过多 这个错误,查找资料,说在linux情况下每个应用程序打开系统文件的资源是有限的,使用命令查看通过lsof -p ${pid} | wc -l
查看单个进程实际打开的文件句柄数 发现57.意思就是java应用程序在并发的情况下只能最高打开57个文件资源。所以出现了这个系统错误。为什么重新启动服务就好了,过段时间还是出现这个问题就是因为业务代码一直在循环等待系统资源,一直获取不到,当重新启动服务器的时候就释放了资源。那么接下以下解决办法:
1.使用redis去做消息队列,因为业务简单所以可以使用redis的list数据结构去做
2.使用RabbitMQ,因为服务器上没有RabbitMQ环境所以放弃了这个选择。
3.直接将这个业务文件读进内存中,缺点:只有系统结束获取手动释放才会释放掉内存(虽然不多7MB)
铭记:并发情况下服务器对于系统的文件资源有限,应对办法有提高当前应用获取文件资源的最大数(高并发也应对不了), 或将业务拆离开来,使用消息队列或装文件进系统内存
标签:文件,网站,业务,并发,内存,服务器,资源 From: https://www.cnblogs.com/binjianhuastudy/p/18066704