Ticket #120 (closed 优化: fixed) — at Version 3

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 (last modified by chenchongqi) (diff)

现象

在重启的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"/>
    
  • 其他相关减少访问量的措施

2013-3-25分割线
这几个expires其实不是lru缓存相关,具体细节可参考resin文档,实际上是这样屏蔽lru缓存的:

    <resin:if test="${isResinProfessional}">
      <cache path="cache" memory-size="64M" enable="false">
        <!-- Vary header rewriting for IE -->
        <rewrite-vary-as-private/>
      </cache>
    </resin:if>

近期lru锁导致阻塞的情况又有出现,屏蔽后该问题消失。

Change History

comment:1 Changed 14 years ago by chenchongqi

  • Version set to 报价库5.0

comment:2 Changed 14 years ago by chenchongqi

  • Status changed from new to closed
  • Resolution set to fixed

商城的服务器已经都配置完毕,报价前台这边加了缓存后这个现象已经没有再出现,暂时不去动配置。

comment:3 Changed 13 years ago by chenchongqi

  • Description modified (diff)
Note: See TracTickets for help on using tickets.