【问题标题】:Page Reads - Memory or coding issue?页面读取 - 内存或编码问题?
【发布时间】:2013-01-07 20:22:44
【问题描述】:

根据 MSDN 文档,Page Reads/sec 是尝试解决系统问题是内存不足还是编码问题/内存泄漏的好方法。

我正在寻找其他人的一些建议,以及寻找更多信息的方法。

我在我的机器上运行以下命令(Windows 7. 64 Bit. 4GB Ram)

1. InteliJ 10 (Tomcat for my Web Services & JSP for the front end)
2. Oracle 11g

我正在尝试确定问题出在哪里/问题所在 - 所以我在 JMeter 中创建了一个脚本来运行以稍​​微限制系统以创建数据并在系统中搜索数据。

运行性能监视器 10 分钟我的数据如下:

Page Reads/Sec (Average): 26.841
Pages Input/Pages Fault = Hard Fault % = 5%
Pages Fault/sec (Avg) = 2300

MSDN 表示,超过 5 页读取/秒的持续值通常是内存短缺的有力指标,但这是一个持续值,而不是平均值。它会出现几次峰值,但从长远来看,它似乎在 0-3 之间,其中一些峰值非常大。

我认为可能是内存泄漏问题;但是,在检查代码并检查流是否已关闭(文件/输入/数据库连接/等)后,我不太确定。

此数据是否更多地指向内存不足、服务中的内存泄漏或配置问题?

编辑 1:查看堆

我目前只能访问我的开发系统,不能访问生产系统。需要与其他人协调才能让我访问日志并在系统上使用 jvisualVM。

但是,我上周和今天确实对开发系统进行了一些堆转储。减去 String 和 char[],类的使用没有什么疯狂的。查看监视器,我在开发中的堆大小为 463,863,最大值约为 480。使用的波动在 415 和 450 之间。

使用 Eclipse 内存分析器和堆转储上的“疑似泄漏报告”显示 3 个问题嫌疑人。

 1. One instanceo f "org.apache.jasper.servlet.JspServlet" loaded by "org.apache.catalina.loader.StandardClassLoader"  Occupies 18.70%  The memory is accumulated in one instance of "java.util.concurrent.ConcurrentHashMap$Segment[]

 2. The thread org.apache.tomcat.util.threads.TaskThread @ http-apr-8080-exec-19 keeps local variables with total size 12.30%.  The memory is accumulated in one instance of "org.apache.tomcat.util.threads.TaskThread" loaded by "org.apache.catalina.loader.StandardClassLoader"

 3. The thread org.apache.tomcat.util.threads.TaskThread @http-apr-8080-exec-24 keeps local variables with total size 10.72%.  The m emory is accumulated in one instance of "org.apache.tomcat.util.threads.TaskThread'  loaded by "org.apache.catalina.loader.StandardClassLoader"

我的印象(可能是错误的)其中一些是正常的,因为 TomCat 最初会加载很多东西并存储它。

【问题讨论】:

  • 什么是症状,无论如何 - 即什么是慢的?总体响应时间?吞吐量?
  • 基本上在系统使用一段时间后(尽管没有特定的时间/吞吐量似乎是一致的),系统的响应时间和吞吐量都会变慢。最终,TomCat 停了下来,需要退回服务。
  • 如果系统在启动 tomcat 后恢复速度,则排除了 Oracle。可以在tomcat进程上使用jvisualvm,看看java堆的使用情况吗?

标签: java performance oracle memory-leaks


【解决方案1】:

您可以做的一件事是查看任务管理器并观察您的 Java 相关进程占用了多少内存。

总结所有 Private Working Set 内存,例如前 10 个内存密集型进程(无论它们是否与 Java 相关)。如果此值接近或大于您的物理内存容量的 75%,如果您运行的是禁用 PAE 的 32 位操作系统(您没有说明您的操作系统),这可能是物理内存限制。

如果您的私有工作集总和使用的物理内存远少于您的总物理内存,则可能不是与此相关的问题。也可能是与 Oracle 数据库相关的大量磁盘 I/O;更多内存将允许您的系统在 RAM 中缓存磁盘页面,从而显着加快读取速度,因为它将您的 RAM 视为一种磁盘(但 RAM 比硬盘快 20 到 50 倍)。

【讨论】:

  • 前 10 名的私有工作集(这是 JVM 和其他杂项)只有大约 1250/4080,大约是容量的 30%。我将开始调查是否是与 Oracle 相关的大量磁盘 I/O 使用以及 CRUD 相关活动。
【解决方案2】:

如果您要诊断 Oracle 数据库,MSDN 是一个非常糟糕的指导来源:SQL Server 的体系结构差异太大而无法相关。你应该阅读the Concepts manual

Oracle 中的数据字典有 views which provide various insights into the performance of the system。现在与您相关的是 V$SGA_TARGET_ADVICE;这将向您显示增加或减少系统内存的预期效果。 Find out more

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多