Ticket #58 (closed 用户报障: 已处理)

Opened 13 years ago

Last modified 12 years ago

论坛服务器应用进程打开文件数限制

Reported by: dingjianyong Owned by: dingjianyong
Priority: 重要的(3) Milestone:
Component: 时尚网论坛 Version:
Keywords: Cc:
Due Date: 10/05/2013

Description

发现女性网论坛机器重启频率很高(约1-2小时重启一次),重启的时候内存溢出,抛出错误。

jdk log如下:
java.lang.OutOfMemoryError? GC overhead limit exceeded
java.io.FileNotFoundException? pc_route/route.txt.md5 (Too many open files)

error log如下:
java.lang.NullPointerException?
com.danga.MemCached?.MemCachedClient?$NIOLoader.doMulti(MemCachedClient?.java:2207)

错误原因:没有对resin进程的启动用户设置【可以同时打开的文件数目】。此参数在默认的情况下为1024。 由于没有设置,所以当resin进程某个请求需要打开文件达到限制,则抛出错误,故而重启。

解决方案:
“open files (-n) 1024 ”是Linux操作系统对一个进程打开的文件句柄数量的限制(包含打开的SOCKET数量).这个值可用ulimit 命令来修改。

Change History

comment:1 Changed 13 years ago by dingjianyong

  • Summary changed from 论坛服务器进程连接数限制导致内存溢出 to 论坛服务器应用进程打开文件数限制

comment:2 Changed 13 years ago by dingjianyong

仔细查阅log发现,出现的error log包括
java.lang.OutOfMemoryError:GC overhead limit exceeded
java.lang.OutOfMemoryError?: Java heap space
Too many open files
每次重启所抛出的log会不一致,主要为上述三种。
为了进一步研究为何会出现上述几种不同类型的log,进行了进一步研究。

经研究,是danga.memcached2.0.1存在nio管道句柄泄漏问题,会产生大量软引用的selector对象,当jvm内存不足时,试图回收这些对象,但是由于GC在进行回收时,需要通过算法检查是否回收软应用对象。GC占用大量时间为释放很小空间的时候,就会抛出GC overhead limit exceeded错误。如果刚好MC线程池扩张,就会出现java.lang.OutOfMemoryError?: Java heap space错误。如果jvm内存依然足够,这些软引用的selector都不会释放,打开文件数就有可能达到上限。所以报Too many open files。

comment:3 Changed 12 years ago by dingjianyong

  • Status changed from new to closed
  • Type changed from 故障 to 用户报障
  • Resolution set to 已处理
Note: See TracTickets for help on using tickets.