集算器内存爆满 麻烦帮忙看看
集算器版本:
社区版本:20230520
使用方式:java 远程计算
服务器:32u 64g 此服务器只安装了集算器 跟 jdk 无任何其它应用程序
jvm 内存设置:-Xms60g -Xmx60g
jdk 版本:1.8.0_34
对应的执行 spl 语句:
==now()
=file(“/data/soft/esProc/file/Performance_Spl/LINEITEM.ctx”).open().cursor@m (L_SHIPDATE,L_QUANTITY, L_EXTENDEDPRICE,L_DISCOUNT,L_TAX,L_RETURNFLAG,L_LINESTATUS;L_SHIPDATE>=date($B_L_SHIPDATE) && L_SHIPDATE
=A2.groups(L_RETURNFLAG, L_LINESTATUS,L_SHIPDATE; sum(L_QUANTITY):sum_qty, sum(L_EXTENDEDPRICE):sum_base_price, sum(dp=L_EXTENDEDPRICE*(1-L_DISCOUNT)):sum_disc_price, sum(dp*L_TAX):sum_charge, avg(L_QUANTITY):avg_qty, avg(L_EXTENDEDPRICE):avg_price, avg(L_DISCOUNT):avg_disc, count(1):count_order)
=A3.run(L_RETURNFLAG, L_LINESTATUS,L_SHIPDATE,sum_charge+=sum_disc_price)
return A4
表的数据量:8830000
并发查询次数:100
服务器现象:假死 无响应 用 jmap -heap 查看 内存以及爆忙 ,然后强行 gc 查看 gc 日志已经提示没有可释放的内存了。
用 MAT 分析当时的内存快照如下:
这是我们 spl 写法有问题 还是配置问题导致 还是说 服务器配置就这样 就是这么个现象?
并发 100 次,平均每个脚本的内存可用量不到 300 兆
脚本本身又用了的多线程计算,n 线程计算占用的内存基本是单线程的 n 倍,这种状况的测试出现内存不足是正常的
这里的 n 线程基本单线程的 n 倍 有个疑问 多线程去计算 不是去分摊数据量去计算的么? 为啥是翻倍操作 麻烦解答下
就拿这个脚本来说,如果是两个线程,则文件会被分成两段,每个线程对相应的段的数据做读取、汇总计算。
游标大概每次读取 1 万条数据然后累积到分组结果集上,两个线程则每次读取的数据是单线程的两倍,结果集也是两个。
最后两个线程都计算完成后则会把得到的两个分组结果再汇总一下得到最终的结算结果。
哦 原理是这么理解 “翻倍”的意思 多谢解答