Gae for java的re startup问题
最近一段时间,发现gae上request的cpu占用明显的多了,cpu占用的配合比之以前增加了好几倍。看后台的日志,大量的request持续了较长的时间,占用了异常多的cpu。这些request都报出了
“com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue <init>: Failed to start reference finalizer thread. Reference cleanup will only occur when new references are created.”
这样的异常。Gae 开发者解释说这个异常抛出是正常的,原因是Gae是不允许起后台的线程的;GAE捕获了这个异常并输出到INFO级别,并且,理论上这个异常也不会对性能产生影响。
但是为什么异常出现的request,耗时都特别长呢?原来这个异常通常是出现在GAE重新加载你的web应用的时候。也就是说,这种request到来的时候,GAE启动了一个新的web container!这个过程是很耗时的,需要load很多相关的class。现在看来,当第一个请求进来的时候,GAE会起一个container来加载应用,这个instance会持续一定的时间,如果在这段时间有新的的请求,就由这个instance来处理了。如果一段时间内(这个时间现在貌似在2分钟左右)没有新的request到来,GAE就会关掉你的web server销毁这个instance。当这个instance销毁之后,一个新的request到来,就又会启动新的instance了。google 最近应该是对这方面的策略做了一些改动,或许是生存时间之类的参数变短了,总之现在大量的请求到来的时候需要新的instance,导致耗费了大量的CPU和较慢的响应。
java还是太重了,不适合这种速生速死的应用方式。GAE的技术人员已经声称会改善这个问题;自己写个cron job每一分钟去访问自己的服务也可以极大的减少web应用重启的次数。另外,减少jar包依赖对于减少重启时间也是有帮助的。
