产品名: Dr.Sum Datalizer
版本: Ver5.x、Ver4.x、Ver3.x
<现象>
客户端
执行大数据量的汇总表或报表下载时,出现页面无响应的现象。用户页面和维护页面无法打开,或者点击[登录]按钮没有反应。
服务器
CPU使用率高,可能会出现OutOfMemory错误。
<原因>
Datalizer 是一个基于 Java 的 Web 应用程序,它在“堆内存”上运行,堆内存是 Java 虚拟机上的内存空间。
执行Datalizer的汇总表的过程也是在这个堆内存中进行的。具体处理流程如下:
1.当汇总定义文件执行时,Datalizer Server 接收执行请求。
2.根据汇总定义的内容生成 SELECT 语句并发布到 Dr.Sum Server。
3.Dr.Sum Server 选择数据。
4.将SELECT结果返回给Datalizer Server,Datalizer Server会生成一个报表。
5.将生成的报表返回给客户端,并输出到屏幕或文件(CSV、Excel、PDF)。
步骤【4】的处理是在Datalizer Server分配的堆内存中执行的,但是当堆内存的空闲空间不足时,使用的内存通过 Java 执行垃圾回收(以下称“GC”)来释放。
在GC执行过程中,CPU负载较高,导致服务器机器自身响应速度变慢。
如果即使在执行 GC 后也无法确保所需的内存,则无法继续处理,并且后续处理也可能失败或无法正常运行。
<现象发生时的对策>
确认日志中是否输出了“OutOfMemoryError”,这是GC释放堆内存后的错误。 如果输出此错误,则后续处理很可能无法正常执行,因此请重新启动所有 Datalizer Server 服务。
如果未输出OutOfMemoryError,则可能是集计的处理和GC释放内存的处理仍在进行。 在这种情况下,集计可能会过段时间完成,但是在GC处理的时点,CPU 使用率会很高,响应会很慢。 另外,虽然当前没有输出 OutOfMemoryError ,但在后续处理进行中GC无法分配内存,可能会输出。 如果一段时间后该处理还没有完成,或者如果您想立即改善响应,请重新启动 Datalizer Server 服务。
如果服务无法停止的话,请使用任务管理器或OS 命令来强制终止Datalizer 任务。
无论哪种情况,当您重新启动 Datalizer Server 时,所有进程都会被破坏,并且正在实行的集计处理也会被全部取消。
<回避方法>
1.明细报表减少一些非必要的项目,减少出力的列数。
2.设置检索条件,分文件下载。例如时间、分类等项目。
3.通过【按钮操作控制】的设置,实现已点图标(CSV、Excel、PDF)无效化,避免多次请求。
设置画面:[统计表共用设定]-[设定]-[共用系统设置]-[按钮操作控制]
4.可以增加堆内存的容量,看下载速度是否有改善。
具体设定步骤如下:
①在SMS左侧的菜单中单击[系统管理]-[设定]-[堆设置],从[进程一览]中选择目标服务。
②输入内存容量 (MByte) 到[设置大小],然后单击[设定]按钮。
※更改后需要重新启动服务才能生效。
增加堆内存的容量,在某些情况下可以改善性能,但实际需要多少堆内存很难计算。因为它取决于要获取的数据的长度、布局中排列的行/列数以及统计结果的数量。因此,建议逐渐增加当前的内存设置量,比如1GB→2GB,然后是4GB→8GB。如果还是无法正常动作,请在可以使用可能的空闲内存范围内考虑继续增加。