Блокировка потоков WebSphere Dynacache

#caching #websphere #websphere-7

#кэширование #WebSphere #WebSphere-7

Вопрос:

Я запускаю веб-приложение на WebSphere Application Server 7.0.0.37, которое использует IBM DynaCache для хранения данных для выпадающих списков. Когда я добавляю нагрузку к коду, который повторяет список, я в конечном итоге вижу блокировку потоков при анализе кучи.

Вот код, который извлекает DistributedMap. Обратите внимание, я не кэширую InitialContext, поскольку IBM отметила, что он кэшируется для вас; тем не менее, я буду тестировать его по-прежнему, чтобы увидеть, устраняет ли это проблему, с которой я сталкиваюсь.

 public PinqCache() {
    if (getProviderTypeSpecialtyMap() != null) {
        getProviderTypeSpecialtyMap().clear();
    }
}

public DistributedMap getProviderTypeSpecialtyMap() {
    return getDistributedMapByName("/services/cache/provTypeSpecialty");
}

private DistributedMap getDistributedMapByName(String name) {
    InitialContext ic;
    DistributedMap dm = null;
    try {
        ic = new InitialContext();
        dm = (DistributedMap) ic.lookup(name);
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return dm;
}
  

Когда я просматриваю анализ потоков с помощью инструмента анализа потоков IBM, я вижу, что блокируется 41 поток. Вот трассировка стека из одного из заблокированных потоков:

 Thread Name = WebContainer : 3758
State = Blocked
Monitor = Waiting for Monitor Lock on com/ibm/ws/naming/jcache/Cache@0x0000000041FDBCC0/0x0000000041FDBCCC
Java Stack = 
at com/ibm/ws/naming/jcache/Cache.bind(Cache.java:374(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.processResolveResults(CNContextImpl.java:3738(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.doLookup(CNContextImpl.java:1861(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.doLookup(CNContextImpl.java:1762(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.lookupExt(CNContextImpl.java:1513(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.lookup(CNContextImpl.java:645(Compiled Code)) 
at com/ibm/ws/naming/util/WsnInitCtx.lookup(WsnInitCtx.java:166(Compiled Code)) 
at com/ibm/ws/naming/util/WsnInitCtx.lookup(WsnInitCtx.java:180(Compiled Code)) 
at javax/naming/InitialContext.lookup(InitialContext.java:436(Compiled Code)) 
at PinqCache.getDistributedMapByName(PinqCache.java:32(Compiled Code)) 
  

Существуют различные методы API, которые отображают блоки:

 com/ibm/ws/naming/jcache/Cache.lookup
com/ibm/ws/naming/jcache/Cache.bind
com/ibm/ws/naming/jcache/Cache.setLifetimeProperties
  

Мой вопрос в том, что может вызвать такую ситуацию, когда потоки блокируются при вызове InitialContext.lookup ?

— ОБНОВИТЬ —

Я добавил поток, которому принадлежит блокировка монитора.

     Thread Name = WebContainer : 3709
    State = Waiting on Condition
    Monitor = Owns Monitor Lock on com/ibm/ws/naming/jcache/Cache@0x0000000041FDBCC0/0x0000000041FDBCCC
    Java Stack = 
at com/ibm/ws/naming/jcache/Cache.getParentContext(Cache.java:1003(Compiled Code)) 
at com/ibm/ws/naming/jcache/Cache.bind(Cache.java:382(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.processResolveResults(CNContextImpl.java:3738(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.doLookup(CNContextImpl.java:1861(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.doLookup(CNContextImpl.java:1762(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.lookupExt(CNContextImpl.java:1513(Compiled Code)) 
at com/ibm/ws/naming/jndicos/CNContextImpl.lookup(CNContextImpl.java:645(Compiled Code)) 
at com/ibm/ws/naming/util/WsnInitCtx.lookup(WsnInitCtx.java:166(Compiled Code)) 
at com/ibm/ws/naming/util/WsnInitCtx.lookup(WsnInitCtx.java:180(Compiled Code)) 
at javax/naming/InitialContext.lookup(InitialContext.java:436(Compiled Code)) 
at com/hcsc/rtb/fs/DAO/pinqDs/PinqCache.getDistributedMapByName(PinqCache.java:32(Compiled Code))
  

— ОБНОВЛЕНИЕ 2 —

Мне удалось получить информацию из трассировки JNDI. Я включил некоторые из них, которые, по моему мнению, были актуальны; однако, очевидно, что здесь гораздо больше.

Я постоянно вижу приведенное ниже исключение. Мне пришлось удалить имя кластера для обеспечения конфиденциальности.

 [10/12/16 14:22:59:986 CDT] 00000084 CNContextImpl >  getNameInNamespace Entry
[10/12/16 14:22:59:986 CDT] 00000084 CNContextImpl <  getNameInNamespace Exit ********
[10/12/16 14:22:59:986 CDT] 00000084 NameSpace     3   lookupInternal
                                 lookupInternal, nsID=10, name=: this=com.ibm.ws.naming.ipbase.NameSpace@1c781c78[_nameSpaceID=10, _nameSpaceType=2, _contextsTable=java.util.HashMap@a5c8e52d[size=9], _bindingsTable=java.util.HashMap@7cd83d3c[size=24]], currContext=com.ibm.ws.naming.jndicos.CNContextImpl@27442744[contextID=t-shrdm-was70-2Cell01/clusters/rtb_uat2, nameInNamespace=********]
[10/12/16 14:22:59:986 CDT] 00000084 NameSpace     3   validateName
                                 Name is null or empty.
[10/12/16 14:22:59:987 CDT] 00000084 Cache         3   getParentContext
                                 javax.naming.InvalidNameException: A null or empty name is not allowed.
    at com.ibm.ws.naming.ipbase.NameSpace.validateName(NameSpace.java:1632)
    at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1115)
    at com.ibm.ws.naming.ipbase.NameSpace.intermediateCacheLookup(NameSpace.java:1101)
    at com.ibm.ws.naming.jcache.Cache.getParentContext(Cache.java:943)
    at com.ibm.ws.naming.jcache.Cache.bind(Cache.java:382)
    at com.ibm.ws.naming.jndicos.CNContextImpl.processResolveResults(CNContextImpl.java:3738)
    at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1861)
    at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1762)
    at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1513)
    at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:645)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:166)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:180)
    at javax.naming.InitialContext.lookup(InitialContext.java:436)
  

Комментарии:

1. Какой поток удерживает блокировку?

2. Я добавил поток, которому принадлежит блокировка монитора, в операционную систему. Я не уверен в инструменте IBM, чтобы понять, почему он ждет.

3. Можете ли вы следовать приведенным здесь инструкциям, чтобы получить пространство имен дампа и трассировку JNDI? www-01.ibm.com/support/docview.wss?uid=swg21143296 Это кластеризованная или единая среда JVM? Если кластерный, какова топология?

4. Александр, завтра утром я собираюсь провести тест производительности и попрошу записать это. Спасибо!

5. Я обновлю тикет с помощью трассировки JNDI, которую я захватил.