Ticket #120 (new 优化) — at Initial Version

Opened 14 years ago

Last modified 13 years ago

resin lru缓存锁竞争和重启的关系

Reported by: chenchongqi Owned by: yuanhuoqing
Priority: major Milestone:
Component: 报价库 Version: 报价库5.0
Keywords: resin, lru缓存, 重启 Cc:
Due Date:

Description

现象

在重启的jvm日志中,我们也发现和lru缓存相关的情况出现,具体现象是,大量的线程在等lru缓存:

"http-app-a-8081-2362$964202179" daemon prio=10 tid=0x0000002b57c3a800 nid=0x771b waiting for monitor entry [0x0000000049794000..0x00000000
49796a30]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.caucho.util.LongKeyLruCache.get(LongKeyLruCache.java:212)
        - waiting to lock <0x0000002ab5a0bf28> (a com.caucho.util.LongKeyLruCache)
        at com.caucho.db.store.BlockManager.getBlock(BlockManager.java:220)
        at com.caucho.db.store.Store.readBlock(Store.java:472)
        at com.caucho.db.store.RawTransaction.readBlock(RawTransaction.java:55)
        at com.caucho.db.store.Store.writeFragment(Store.java:1083)
        at com.caucho.server.cache.CacheInode$CacheOutputStream.write(CacheInode.java:283)
        at com.caucho.server.connection.ResponseStream.writeCache(ResponseStream.java:785)
        at com.caucho.server.connection.ResponseStream.writeNext(ResponseStream.java:452)
        at com.caucho.server.connection.ToByteResponseStream.flushByteBuffer(ToByteResponseStream.java:525)
        at com.caucho.server.connection.ToByteResponseStream.write(ToByteResponseStream.java:332)
        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
        at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:263)
        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
        - locked <0x0000002ae2946928> (a java.io.OutputStreamWriter)
        at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
        at com.caucho.vfs.i18n.JDKWriter$OutputStreamEncodingWriter.write(JDKWriter.java:154)
        at com.caucho.server.connection.ToByteResponseStream.flushCharBuffer(ToByteResponseStream.java:476)
        at com.caucho.server.connection.ToByteResponseStream.print(ToByteResponseStream.java:415)
        at com.caucho.server.connection.ResponseWriter.write(ResponseWriter.java:121)
        at com.caucho.server.connection.IncludeResponseStream.flushCharBuffer(IncludeResponseStream.java:155)
        at com.caucho.server.connection.ToByteResponseStream.flushBuffer(ToByteResponseStream.java:429)
        at com.caucho.server.connection.ToByteResponseStream.close(ToByteResponseStream.java:449)
        at com.caucho.server.connection.IncludeResponseStream.close(IncludeResponseStream.java:315)
        at com.caucho.server.connection.AbstractHttpResponse.finish(AbstractHttpResponse.java:2182)
        at com.caucho.server.connection.AbstractHttpResponse.close(AbstractHttpResponse.java:279)
        at com.caucho.server.webapp.RequestDispatcherImpl.include(RequestDispatcherImpl.java:544)
        at com.caucho.server.webapp.RequestDispatcherImpl.include(RequestDispatcherImpl.java:368)
        at com.caucho.jsp.PageContextImpl.include(PageContextImpl.java:1009)
        at com.caucho.jsp.PageContextImpl.include(PageContextImpl.java:962)
        at _jsp._price__jsp._jspService(_price__jsp.java:2101)

分析

  • 应用压力过大请求数量太多,it商城也偶尔出现这种情况
  • lru缓存配置不合理

处理

  • 考虑修改resin的cache配置,改成只缓存纯静态的文件,目前it商城已经修改了一台服务器,正在观察中。
          <!--
             - Sets timeout values for cacheable pages, e.g. static pages.
    原来是所有页面缓存5秒,其实动态jsp内容变动频繁,另外缓存时间也短,再加上原本resin之外页面有自己的缓存,这里就没太大必要
          <cache-mapping url-pattern="/" expires="5s"/>
            -->
          <cache-mapping url-pattern="*.gif" expires="60s"/>
          <cache-mapping url-pattern="*.jpg" expires="60s"/>
          <cache-mapping url-pattern="*.png" expires="60s"/>
    后面这两个是新加上的:
          <cache-mapping url-pattern="*.js" expires="60s"/>
          <cache-mapping url-pattern="*.css" expires="60s"/>
    
  • 其他相关减少访问量的措施
Note: See TracTickets for help on using tickets.