首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

急性者的 WebSphere 优化:如何通过 20% 的工作获得 80% 的性能改善-3

急性者的 WebSphere 优化:如何通过 20% 的工作获得 80% 的性能改善-3

实现 Jython 经验优化方法现在我们开始优化 WebSphere Application Server。Wikipedia.org 将经验方法 定义为“进行近似计算或回调某个值,或者进行某种决策的易学易用的过程”。这是进行快速而质量不高的优化的“入场券”。为什么使用 Jython 呢?硬核管理员使用命令行而非 GUI 来执行重复的定义良好的任务。引用我们一位开发专家的话,“生命太短,不足以用 tcl 编程。”
JVM 冗余垃圾回收 (GC)JVM 在堆中执行其工作的核心部分。对象不再使用时就是垃圾(技术术语是它们不再被引用)。对于任何家居,您可以通过看其垃圾来了解居住的是什么样的人!Verbose GC 有助于您确定您的内存堆是否太多或太大。
清单 3. 优化冗余 GC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#(c)copyright 2005
# sample code - not supported

# get help with this command in interactive mode: AdminConfig.help()

server1=AdminConfig.getid('/Node:tux1Node01/Server:server1/')
print server1
jvm = AdminConfig.list('JavaVirtualMachine', server1)
print ">>>>>  variable jvm is"
print jvm
print ">>>>>  AdminConfig.show(jvm)"
print AdminConfig.show(jvm)
print ">>>>>  change jvm settings"
AdminConfig.modify(jvm, [['verboseModeGarbageCollection','true' ]] )
AdminConfig.save()  
print ">>>>>  after save:"
print AdminConfig.show(jvm)

# on my system the output of verbose gc is in the file:
#  /opt/IBM/WebSphere/AppServer/profiles/default/logs/server1/native_stderr1.log
# your milage may vary if you change the log locations
#
# note - when using jython you must use the string 'true', see below.
#
#wsadmin>AdminConfig.modify(jvm, [['verboseModeGarbageCollection', 0 ]] )
#WASX7435W: Value 0 is converted to a boolean value of false.
#''
#wsadmin>AdminConfig.modify(jvm, [['verboseModeGarbageCollection', 1 ]] )
#WASX7435W: Value 1 is converted to a boolean value of false.
#''




要使用以上脚本,请执行下列操作:
  • 将其放在一个文件中并起一个有用的名字,例如 verboseGC_on.jython。
  • 确保 wsadmin.sh(或者 wsadmin,对于 Windows®)在您的命令路径中。
  • 在命令提示符下运行 wsadmin.sh -lang jython -f verboseGC_on.jython。
JVM 设置现在您已经配置了冗余 GC,您可以开始优化堆的大小。理想情况下 GC 周期应该:
  • 发生间隔大于 10 秒
  • 在 1 至 2 秒内完成
下面的脚本将更改堆的大小。其目标是使堆足够大,大到 GC 间隔大于 10 秒;而又足够小,小到持续时间仅为 1 到 2 秒。对于每个新的 JVM 版本,GC 算法将会得到改进,所以此优化应该会随着时间的流逝越来越容易。
清单 4. native_stderr1.log,其 GC 间隔 6893 毫秒,持续时间 456 毫秒
1
2
3
4
5
6
7
8
9
10
11
12
<AF[14]; Allocation Failure. need 528 bytes, 6893 ms since last AF>
<AF[14]; managing allocation failure, action=1 (0/183731208) (1668600/1668600)>
  <GC(14); freeing class sun.reflect.GeneratedMethodAccessor18(0x102391b8)>
  <GC(14); freeing class sun.reflect.GeneratedFieldAccessor1(0x104e9f48)>
..... lines deleted......
  <GC(14); freeing class sun.reflect.GeneratedFieldAccessor19(0x10129030)>
  <GC(14); unloaded and freed 20 classes>
  <GC(14); GC cycle started Tue Dec 27 16;18;13 2005
  <GC(14); freed 77240288 bytes, 42% free (78908888/185399808), in 436 ms>
  <GC(14); mark; 396 ms, sweep; 40 ms, compact; 0 ms>
  <GC(14); refs; soft 52 (age > 6), weak 89, final 88, phantom 0>
<AF[14]; completed in 456 ms>




清单 5. 将 JVM 堆增加到 512 MB - 1 GB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#(c)copyright 2005
# sample code - not supported

#AdminConfig.help()
server1=AdminConfig.getid('/Node:tux1Node01/Server:server1/')
print server1
jvm = AdminConfig.list('JavaVirtualMachine', server1)
print ">>>>>  variable jvm is"
print jvm
print ">>>>>  AdminConfig.show(jvm)"
print AdminConfig.show(jvm)
print ">>>>>  change jvm settings"
AdminConfig.modify(jvm, [['initialHeapSize', 512 ], ['maximumHeapSize', 1024 ]])
print ">>>>>  AdminConfig.show(jvm)"
print AdminConfig.show(jvm)
AdminConfig.save()




连接池设置小型(4 个 CPU)数据库服务器的“最佳状态”是提供 100-200 个连接。WebSphere 作为数据库服务器前面的一个连接集线器。连接池的大小限制了开放多少数据库连接来受理传入的页面请求。
清单 6 中的脚本将 Trade6 应用程序中使用的 JDBC 数据源的数据库连接池限制设置为 113。如果您的应用程序使用所有可用的连接,则大多数连接都可能有一个需求未能满足。您可以通过阅读 javacore 来检测此未满足的需求,或者通过增加连接数并查看什么时候应用服务器停止请求更多的连接。如果连接数等于或大于 WebSphere 客户端用户数,则应该检查应用程序是否存在不严谨的代码。
清单 6. 将 JDBC 连接池大小设置为 113
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#(c)copyright 2005
# sample code - not supported

server1=AdminConfig.getid('/Node:tux1Node01/Server:server1/')
print server1
jvm = AdminConfig.list('JavaVirtualMachine', server1)
print "-->  variable jvm is"
print jvm
print "-->  AdminConfig.show(jvm)"

myds=AdminConfig.getid('/DataSource:TradeDataSource/')
mydslist=AdminConfig.list('ConnectionPool',myds)
print "-->  before: "
print AdminConfig.show(mydslist)

AdminConfig.modify(myds, '[[connectionPool [[maxConnections 113]]]]')
AdminConfig.save()
#AdminConfig.modify(myds, '[[connectionPool [[minConnections 20]]]]')
#AdminConfig.save()
print "-->  after: "
mydslist=AdminConfig.list('ConnectionPool',myds)
print AdminConfig.show(mydslist)

# monitor connections at the database with the command
# watch -d -n 5 "db2 list applications | wc -l"
# or informix
# watch -d -n 5 "onstat -g ses | wc -l"
# this will include some irrelevant lines in count -- feel free to egrep them out




启用 Servlet 缓存WebSphere Application Server 内置了两个性能工具以帮助改进配置。Performance Adviser 会友好地建议您优化 servlet 缓存,如果您同意,它将使性能得以改善。下面的图 8 显示了性能查看器的图形输出。要访问免费的 IBM 联机 Education Assistant(它提供了有关如何使用 PMI 工具的教程),请查阅下面的。
清单 7. 启用 Servlet 缓存
1
2
3
4
5
6
7
8
server1=AdminConfig.getid('/Node:tux1Node01/Server:server1/')
print server1
mywebcont=AdminConfig.list('WebContainer', server1)
print AdminConfig.show(mywebcont)
print "now modify settings"
AdminConfig.modify(mywebcont, [['enableServletCaching', 'true']] )
AdminConfig.save()
print AdminConfig.show(mywebcont)




图 8. 性能查看器线程池计数此脚本适度地增加线程池以保证 CPU 能够接受。一个 CPU 可以驱动 50 到 75 Java 线程。该脚本很重要,因为它必须发现与 Web 容器相关的线程池。一些简单的 Jython 代码发现正确的标识符,然后为活动线程分配新的最小和最大值:
清单 8. 增加 WebContainer 的线程池大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server1=AdminConfig.getid('/Node:tux1Node01/Server:server1/')
# show all thread pools
# print AdminConfig.list('ThreadPool', server1)
# from all the ThreadPools take the WebContainer
# it will look something like this:
#webpool='WebContainer(cells/tux1Node01Cell/nodes/tux1Node01
#  cont...           /servers/server1|server.xml#ThreadPool_1113265230034)'
#
# here is how to find the thread pool with jython
#
tpList=AdminConfig.list('ThreadPool', server1).split(lineSeparator)
# now loop and find WebContainer
# the string.count() tests for a substring
# for production please add your own error handling
for tp in tpList:
        if tp.count('WebContainer') == 1:
                tpWebContainer=tp
#
# white space is significant in jython, so the un-indented line
# ends the code block
print tpWebContainer

print AdminConfig.show(tpWebContainer)

# now that we have the identifier to get to tpWebContainer
# adjust the settings
#
AdminConfig.modify( tpWebContainer, [['maximumSize', 75 ]] )
AdminConfig.save()
AdminConfig.modify( tpWebContainer, [['minimumSize', 50 ]] )
AdminConfig.save()

print AdminConfig.show(tpWebContainer)




高级优化思想:下一步优化什么有很多参数可以优化——一些可以使系统变得更快,一些则会使之变得更慢。要阅读优化佳作,请查阅下面的中的 SpecJAppServer2004 全面披露报告。
有大量创建脚本的资源——相信您会同意使用脚本是最好的方法。在您通过一两次使用管理 GUI了解了可用的参数范围后,将会考虑转为使用脚本。有关脚本的更多信息,请参阅下面的。
返回列表