Websphere caconfiguration/IBM JVM:纯 java 的工作速度比 tomcat 慢得多
Websphere caonfiguration/ IBM JVM: pure java works much more slower that in tomcat
大家好。我遇到了下一个问题:
处理需要使用 WAS 和 tomcat 在不同环境中部署的项目。
WAS docer img 使用:common/base-ibm-websphere:8.0.0.10
- 8.0 架构:x86_64
Name IBM WebSphere Application Server
Version 8.0.0.10
ID BASE
Build Level cf101502.03
Build Date 1/16/15
Package com.ibm.websphere.DEVELOPERSILAN.v80_8.0.10.20150116_1534
Architecture x86-64 (64 bit)
Installed Features IBM 64-bit SDK for Java, Version 6
EJBDeploy tool for pre-EJB 3.0 modules
Embeddable EJB container
Stand-alone thin clients and resource adapters
Tomcat docker 使用的 img: common/base-tomcat:7
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Server VM (build 24.80-b11, mixed mode)
从一开始就假设 WAS 出了点问题,因为它对最简单的请求要慢得多(慢 8 倍):
long startMethodTime = System.nanoTime();
long endMethodTime;
long operationStartTime;
long operationEndTime;
Long result = 0L;
Long resultSet = 0L;
operationStartTime = System.nanoTime();
List<ResultDTO> testDAOList = new ArrayList<ResultDTO>();
for (int i = 0; i < 200000; i++) {
ResultDTO testClass = new ResultDTO();
testClass.setBody(String.valueOf(new Random().nextDouble()));
testClass.setResult(String.valueOf(new Random().nextInt()));
testClass.setSubject(String.valueOf(new Date()));
testDAOList.add(testClass);
}
operationEndTime = System.nanoTime();
String operationTime = String.valueOf(((operationEndTime - operationStartTime) / 1000000));
LOGGER.error("Creation object in cycle=" + operationTime);
operationStartTime = System.nanoTime();
for (ResultDTO testDAO : testDAOList) {
result += testDAO.getResult().length();
}
operationEndTime = System.nanoTime();
operationTime = String.valueOf((operationEndTime - operationStartTime)/ 1000000);
LOGGER.error("Incrementation in the loop of objects=" + operationTime);
operationStartTime = System.nanoTime();
Set<ResultDTO> sortedResults = new TreeSet<ResultDTO>(
new Comparator<ResultDTO>() {
public int compare(ResultDTO r1, ResultDTO r2) {
int firstCompValue = (r1.getResult().length() + r1.getSubject().length()) % 2;
int secondCompValue = (r2.getResult().length() + r2.getSubject().length()) % 2;
return firstCompValue - secondCompValue;
}
}
);
sortedResults.addAll(testDAOList);
operationEndTime = System.nanoTime();
operationTime = String.valueOf((operationEndTime - operationStartTime) / 1000000);
LOGGER.error("Sort the Set of Objects=" + operationTime);
for (ResultDTO testDAO : sortedResults) {
resultSet += testDAO.getBody().length();
}
//Creation of 100 default objects
long hundredObjectsCreationTime = 0;
for (int i = 0; i < 100; i++) {
operationStartTime = System.nanoTime();
ResultDTO testClass = new ResultDTO();
testClass.setBody(String.valueOf(new Random().nextDouble()));
testClass.setResult(String.valueOf(new Random().nextInt()));
testClass.setSubject(String.valueOf(new Date()));
operationEndTime = System.nanoTime();
hundredObjectsCreationTime += (operationEndTime - operationStartTime);
}
LOGGER.error("100 objects creation time = " + hundredObjectsCreationTime);
endMethodTime = System.nanoTime();
operationTime = String.valueOf((endMethodTime - startMethodTime) / 1000000);
LOGGER.error("Test method duration = " + operationTime);
它在 x8 的 WAS 上执行比在 Tomcat 上慢。
组合测试结果:
Tomcat:
2018-03-26 21:39:44,347 ERROR [c.v.e.r.r.AboutResource] Creation object in cycle=1006
2018-03-26 21:39:44,381 ERROR [c.v.e.r.r.AboutResource] Incrementation in the loop of objects=33
2018-03-26 21:39:44,411 ERROR [c.v.e.r.r.AboutResource] Sort the Set of Objects=29
2018-03-26 21:39:44,411 ERROR [c.v.e.r.r.AboutResource] 100 objects creation time = 405100 - microsec
2018-03-26 21:39:44,411 ERROR [c.v.e.r.r.AboutResource] Test method duration = 1070
WAS:
[26/03/18 22:26:39:944 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Creation object in cycle=8408
[26/03/18 22:26:40:069 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Incrementation in the loop of objects=124
[26/03/18 22:26:40:373 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Sort the Set of Objects=303
[26/03/18 22:26:40:377 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] 100 objects creation time = 3384400
[26/03/18 22:26:40:377 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Test method duration = 8841
在 WAS 端仅配置堆大小(大于 enoph)和数据库连接(与此问题无关)。
ON调优IBM jVM/WAS配置时首先要注意什么? (现在我已经在研究 IBM 手册,可能你会节省我的时间以避免冒烟测试不同的无效 JVM 属性)。
IBM Java 和 HotSpot 之间的一些默认设置不同,因此微基准测试(一些请求)非常不准确。最好做一个长时间的负载测试。话虽如此,这可能是很多事情。我建议您尝试的第一件事是将 -Xquickstart
设置为 generic JVM argument:
The IBM® JIT compiler is tuned for long-running applications typically used on a server. You can use the -Xquickstart command-line option to improve the performance of short-running applications, especially for applications in which processing is not concentrated into a few methods. (https://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/tools/jitpd_short_run.html)
如果这没有帮助,那么下一步就是 enable verbosegc with -Xverbosegclog:${SERVER_LOG_ROOT}/verbosegc.%seq.log,20,50000
and check the proportion of time in garbage collection with the free IBM GCMV tool。
如果这显示的不多,请提供有关您的操作系统的更多信息。
发现问题。
启用的调试端口使 WAS java 性能降低了 8 倍!!!
至少在 docker.
中的 WAS 8.0.0.10
大家好。我遇到了下一个问题: 处理需要使用 WAS 和 tomcat 在不同环境中部署的项目。 WAS docer img 使用:common/base-ibm-websphere:8.0.0.10 - 8.0 架构:x86_64
Name IBM WebSphere Application Server
Version 8.0.0.10
ID BASE
Build Level cf101502.03
Build Date 1/16/15
Package com.ibm.websphere.DEVELOPERSILAN.v80_8.0.10.20150116_1534
Architecture x86-64 (64 bit)
Installed Features IBM 64-bit SDK for Java, Version 6
EJBDeploy tool for pre-EJB 3.0 modules
Embeddable EJB container
Stand-alone thin clients and resource adapters
Tomcat docker 使用的 img: common/base-tomcat:7
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Server VM (build 24.80-b11, mixed mode)
从一开始就假设 WAS 出了点问题,因为它对最简单的请求要慢得多(慢 8 倍):
long startMethodTime = System.nanoTime();
long endMethodTime;
long operationStartTime;
long operationEndTime;
Long result = 0L;
Long resultSet = 0L;
operationStartTime = System.nanoTime();
List<ResultDTO> testDAOList = new ArrayList<ResultDTO>();
for (int i = 0; i < 200000; i++) {
ResultDTO testClass = new ResultDTO();
testClass.setBody(String.valueOf(new Random().nextDouble()));
testClass.setResult(String.valueOf(new Random().nextInt()));
testClass.setSubject(String.valueOf(new Date()));
testDAOList.add(testClass);
}
operationEndTime = System.nanoTime();
String operationTime = String.valueOf(((operationEndTime - operationStartTime) / 1000000));
LOGGER.error("Creation object in cycle=" + operationTime);
operationStartTime = System.nanoTime();
for (ResultDTO testDAO : testDAOList) {
result += testDAO.getResult().length();
}
operationEndTime = System.nanoTime();
operationTime = String.valueOf((operationEndTime - operationStartTime)/ 1000000);
LOGGER.error("Incrementation in the loop of objects=" + operationTime);
operationStartTime = System.nanoTime();
Set<ResultDTO> sortedResults = new TreeSet<ResultDTO>(
new Comparator<ResultDTO>() {
public int compare(ResultDTO r1, ResultDTO r2) {
int firstCompValue = (r1.getResult().length() + r1.getSubject().length()) % 2;
int secondCompValue = (r2.getResult().length() + r2.getSubject().length()) % 2;
return firstCompValue - secondCompValue;
}
}
);
sortedResults.addAll(testDAOList);
operationEndTime = System.nanoTime();
operationTime = String.valueOf((operationEndTime - operationStartTime) / 1000000);
LOGGER.error("Sort the Set of Objects=" + operationTime);
for (ResultDTO testDAO : sortedResults) {
resultSet += testDAO.getBody().length();
}
//Creation of 100 default objects
long hundredObjectsCreationTime = 0;
for (int i = 0; i < 100; i++) {
operationStartTime = System.nanoTime();
ResultDTO testClass = new ResultDTO();
testClass.setBody(String.valueOf(new Random().nextDouble()));
testClass.setResult(String.valueOf(new Random().nextInt()));
testClass.setSubject(String.valueOf(new Date()));
operationEndTime = System.nanoTime();
hundredObjectsCreationTime += (operationEndTime - operationStartTime);
}
LOGGER.error("100 objects creation time = " + hundredObjectsCreationTime);
endMethodTime = System.nanoTime();
operationTime = String.valueOf((endMethodTime - startMethodTime) / 1000000);
LOGGER.error("Test method duration = " + operationTime);
它在 x8 的 WAS 上执行比在 Tomcat 上慢。 组合测试结果:
Tomcat:
2018-03-26 21:39:44,347 ERROR [c.v.e.r.r.AboutResource] Creation object in cycle=1006
2018-03-26 21:39:44,381 ERROR [c.v.e.r.r.AboutResource] Incrementation in the loop of objects=33
2018-03-26 21:39:44,411 ERROR [c.v.e.r.r.AboutResource] Sort the Set of Objects=29
2018-03-26 21:39:44,411 ERROR [c.v.e.r.r.AboutResource] 100 objects creation time = 405100 - microsec
2018-03-26 21:39:44,411 ERROR [c.v.e.r.r.AboutResource] Test method duration = 1070
WAS:
[26/03/18 22:26:39:944 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Creation object in cycle=8408
[26/03/18 22:26:40:069 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Incrementation in the loop of objects=124
[26/03/18 22:26:40:373 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Sort the Set of Objects=303
[26/03/18 22:26:40:377 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] 100 objects creation time = 3384400
[26/03/18 22:26:40:377 UTC] 00000018 SystemOut O ERROR [c.v.e.r.r.AboutResource] Test method duration = 8841
在 WAS 端仅配置堆大小(大于 enoph)和数据库连接(与此问题无关)。
ON调优IBM jVM/WAS配置时首先要注意什么? (现在我已经在研究 IBM 手册,可能你会节省我的时间以避免冒烟测试不同的无效 JVM 属性)。
IBM Java 和 HotSpot 之间的一些默认设置不同,因此微基准测试(一些请求)非常不准确。最好做一个长时间的负载测试。话虽如此,这可能是很多事情。我建议您尝试的第一件事是将 -Xquickstart
设置为 generic JVM argument:
The IBM® JIT compiler is tuned for long-running applications typically used on a server. You can use the -Xquickstart command-line option to improve the performance of short-running applications, especially for applications in which processing is not concentrated into a few methods. (https://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/tools/jitpd_short_run.html)
如果这没有帮助,那么下一步就是 enable verbosegc with -Xverbosegclog:${SERVER_LOG_ROOT}/verbosegc.%seq.log,20,50000
and check the proportion of time in garbage collection with the free IBM GCMV tool。
如果这显示的不多,请提供有关您的操作系统的更多信息。
发现问题。 启用的调试端口使 WAS java 性能降低了 8 倍!!! 至少在 docker.
中的 WAS 8.0.0.10