NC6报表计算常见问题演讲人魏享林时间2019年7月6日个人介绍姓名:魏享林部门:高端BG-技术服务支持部职务:技术支持专家领域:10年NC开发经验,7年技术支持服务经验,擅长全系统性能优化,对NC系统架构、J2ee架构有比较深的了解,善于从细节着手,快速定位系统中的环境、配置问题及代码错误。目录CONTENTS报表计算调度机制123报表计算卡死问题报表计算效率问题-PART01-报表计算调度机制报表计算调度机制报表计算调度相关数据库表节点信息表➢相关数据表存放在AE数据源中➢从NC产品查看表记录的路径:语义模型(预置)---工具---性能监控---集群调度管理报表计算调度相关数据库表模块信息表报表计算调度相关数据库表调度参数表报表计算调度相关数据库表调度任务表(bi_schd_jobqueue、bi_schd_taskqueue)报表计算调度机制心跳线程获取要计算的任务的方法计算线程更改计算任务状态的方法-PART02-报表计算卡死问题排查步骤检查AE数据源配置➢所有账套共用一个AE数据源➢语义模型、自由报表定义信息也保存在AE数据源中检查AE数据源配置多帐套、was环境下,AE数据源要与账套数据源隔离,并配成双数据源报错日志如下解决方案如下:➢再创建一个数据源,数据库用户同原来AE数据源用户名相同➢将这个数据配成双数据源➢将这个数据源选成AE数据源检查AE数据源配置➢文件服务器、搜索服务器等专属服务器不能进行报表计算➢不配置AE数据源,即可控制不做报表计算➢直接修改nchome\resources\smart\datasource.xml配置了AE数据源未配置AE数据源检查bi_schd_host表是否有重复记录➢要确保hostid值是唯一的➢默认表上有唯一索引,不会出现重复记录➢删除重复记录,并创建唯一索引,不用重启中间件即生效deletefrombi_schd_hostwhererowidonin(selectmax(rowid)frombi_schd_hostgroupbyhostid);createindexi_bi_schd_host_0onbi_schd_host(hostid)tablespacennc_index01;判断bi_schd_taskqueue表是否有对应计算任务记录NMC查看SQL返回记录数,一般为1将SQL拿到plsql中执行,看是否能查到记录判断bi_schd_taskqueue表是否有对应计算任务记录➢如果在plsql中运行SQL查不出记录,那个计算就会卡住➢出现这个问题是由于添加计算任务的操作的事务出了问题,事务未提交➢同AE此处特殊的事务处理机制有关➢NC63X下同AE事务处理有关的补丁单帐套下打此补丁多帐套下打此补丁判断bi_schd_host表openstatus是否为1➢程序中未将openstatus改成0,但有时就会出现为0的情况➢计算调度中对此值的判断是没有必要的➢如果想控制某些server不参与计算,可以修改bi_schd_module表记录➢有补丁,补丁修改方式是不判断这个字段的值判断bi_schd_taskqueue表是否有对应计算任务记录➢Currloadweight值由bi_schd_taskqueue表计算得到➢执行如下SQL,将currloadweight值修改过来updatebi_schd_taskqueuesetrunstate=0whererunstate=1andstarttimeisnullupdatebi_schd_hostsetcurrloadweight=0➢有补丁,补丁修改方式在心跳线程中定时执行调整bi_schd_taskqueue表的SQL判断bi_schd_module表是否限制了节点范围➢用Bi_schd_module表的hosts字段可以指定能运行某一模块的节点范围➢为空时表示任何节点都可以运行➢导过库或者服务器做过迁移,容易出现这个问题判断计算线程是否卡死➢从NMC中找到计算线程的方法从线程堆栈中找到TableInputLocalCalThread,就说明是计算线程com.ufsoft.iuforeport.repdatainput.TableInputLocalCalThread.onCompleted(TableInputLocalCalThread.java:185)nc.bs.pub.bi.clusterscheduler.JobQueueService.completeJob(JobQueueService.java:106)nc.bs.pub.bi.clusterscheduler.Scheduler.completeTask(Scheduler.java:606)nc.bs.pub.bi.clusterscheduler.TaskExecutor.task(TaskExecutor.java:186)nc.bs.pub.bi.clusterscheduler.TaskExecutor.execute(TaskExecutor.java:77)nc.bs.pub.bap.toolkit.AppExecutor.doRun(AppExecutor.java:25)➢判断计算线程是否卡死方法:线程运行时间超过几小时,且线程堆栈不变判断计算线程是否卡死➢UfoVal初始化卡死问题会造成计算、汇总、合并、调整全部卡死线程卡死时的线程堆栈判断计算线程是否卡死➢HashMap未做同步处理引起的线程卡死问题✓IBMJDK下易出现问题✓链表结构变成圆环结构✓NC中各模块都可能出现问题NC63X补丁-PART03-报表计算效率问题获取报表计算日志的方法➢什么时候需要获取日志✓计算错误一定要分析日志✓某些效率问题也需要分析日志➢调整报表计算日志级别需要调整的模块是iufo,日志级别需要调到debug➢计算日志文件的位置日志文件位于nchome\nclogs\server\scheduler\TableInputLocalCal****.log排查步骤判断报表计算效率是否正常的标准公式类型公式数量大约耗时总账取数公式1万个0.5-1分钟Mselect他表取数公式1万个5-10分钟➢此处公式数为实际提交计算的公式数➢动态区计算量不是最后计算有数的行数,也不是语义模型查出的行数计算调度导致计算效率低问题➢用户感觉到的报表计算时间=在计算队列中排队的时间+真正计算的时间➢报表计算监控界面能看到真正计算的时间,判断是不是计算调度的问题计算调度导致计算效率低问题---调度任务记录过多➢bi_schd_taskqueue表记录过多,查找计算任务的SQL执行较慢➢程序设计不太合理,已完成的任务和待计算的任务混在一个表中➢SQL查询条件不规范,无法使用索引➢最好的解决方案是定期清除这个表的记录➢SQL执行时间控制在50ms以内truncatetablebi_schd_jobqueue;truncatetablebi_schd_taskqueue;createorreplaceproceduredeleteSchdTableDataasbegindeletefrombi_schd_jobqueuewheretsD5’)可以再增加两列G、H列,在G、H列上定义公式G5:H5=mselect(‘repcode1->C5:D5’);C5=G5F5=H5应用方案不合理导致计算效率问题---getdata函数使用技巧➢不要直接使用报表语义模型提供者无法直接利用参数,中间结果集可能非常大应用方案不合理导致计算效率问题---getdata函数使用技巧➢不要直接使用报表语义模型提供者只能对查出的中间结果集再做参数做过滤,中间结果集先做成临时表,再对临时表按参数条件过滤应用方案不合理导致计算效率问题---getdata函数使用技巧➢不要直接使用报表语义模型提供者✓用报表语义模型提供者做语义模型及取数公式✓将IUFO计算的日志级别调成debug,做报表计算✓从报表计算日志文件中取得语义模型的SQL✓修改语义模型,使用语义脚本,使用从日志中取得的SQL应用方案不合理导致计算效率问题---getdata函数使用技巧➢行条件与参数条件的合理使用✓getdata函数中既可以使用行条件,又可以使用参数条件✓iufo对行条件与参数条件的处理方式不相同•行条件是对语义模型查出的所有行,IUFO对行条件表达式做计算,看返回结果是不为true,如果为true,则此行作为结果返回,行条件过滤是在IUFO进行的•参数条件是将参数条件中的参数值传给语义模型,即过滤是在语义模型完成的应用方案不合理导致计算效率问题---getdata函数使用技巧➢行条件与参数条件的合理使用✓iufo表达式计算效率比数据库差几十倍✓Getdata函数仅行条件不同时,语义模型只需要执行一遍✓行条件、参数条件的合理取舍•如果语义模型返回结果集特别大,那么IUFO做表达式计算的次数就非常多,这时优先使用参数条件,让返回的结果集减少,让计算操作尽量在数据库端完成•如果语义模型运行非常慢,这时就应该优先考虑减少语义模型的运行次数,优先使用参数条件服务一点通(内部版)服务一点通(客户版)服务官方微信