#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, которую я захватил.