有什么方法可以确定 iSeries 上单个作业的内存消耗吗?
-
22-07-2019 - |
题
我们有多种 .Net 应用程序,它们通过 ODBC 和 DB2 Connect 连接到位于 V5R4 的 iSeries LPAR。我们还有一些在机器上本地运行的批处理作业(主要是 COBOL、RPG 和直接 CL)。在一天中的某些时段,我们会遇到大量页面错误,并正在尝试确定哪些应用程序可能导致问题。
无需购买市场上数十种昂贵工具中的任何一种(即iDoctor),有什么方法可以查看每个作业消耗的内存量。我们的大多数作业都用完了池 2,当我们向该池添加内存时,我们确实看到了性能的提高,而仅仅查看 wrksyssts 并没有多大帮助。我们希望隔离有问题的作业,并查看是否可以进行一些修改以提高性能并减少不必要的内存利用率。
解决方案
如果你不介意 Java 或其 jvm 或做一些编码......
获取以下内容(全部适用于 Windows、Linux、AIX、Solaris 等...苹果?):
- 格罗维 因为我有点讨厌爪哇的顽强
- JT开放 这是 IBM 的开源版本 IBM Java 工具箱 附带 系统访问 以及您应该通过服务器收到的信息
请记住,JTOpen 只是一个普通的旧 Java 库,因此您可以使用 任何jvm语言 可以访问普通的java库。我使用 Groovy 是因为我喜欢它。别担心,Groovy 很好。
开始。
import com.ibm.as400.access.*
// how many seconds to run
secs = 20
sys = new AS400("theserver", "paulg", "dotnet4evah")
job = new Job(sys, "jobname", "jobusername", "jobnumber")
job.load()
println "Stats for ${job.toString()}"
// this might look horrible
println "total CPU time\tpage faults/sec\tdisk IO ops/sec"
while (secs--) {
job.loadStatistics()
print "${job.getCPUUsed()/1000}\t\t"
print "${job.getValue(Job.ELAPSED_PAGE_FAULTS)}\t\t"
println "${job.getValue(Job.ELAPSED_DISK_IO)}"
job.resetStatistics()
Thread.sleep(1000)
}
sys.disconnectAllServices()
就是这样。还有许多其他的工作价值 玩. 。我从来没有必要费心处理这些工作统计数据,所以我不知道重置统计数据是否正确。
为了创建 Job 对象,实际知道作业编号和作业的其他详细信息是一件痛苦的事情。这就是为什么 职位列表 真是太好了。你也可以 运行 CL 命令 从你的脚本中如果有用的话。
我认为 IBM 使用这个库来构建 Ops Navigator,所以也许您已经使用它有一段时间了。
其他提示
这似乎有点帮助:
-- 在 iSeries Navigator 中,展开我的连接 > 连接 > 工作管理 > 内存池 > 活动池或共享池。-- 右键单击要使用的内存池,然后单击“作业”。-- 自定义视图以包含页面错误列
至少我可以看到哪些工作存在故障问题。下次出现问题时,我们将看看它是否有助于找到有问题的应用程序。