Netsuite 中的脚本执行指令计数超出错误

Script Execution Instruction Count Exceeded error in Netsuite

我有一个计划脚本,它执行一些计算并更新销售订单上的自定义 header 字段,每 30 分钟运行一次。

随着 Netsuite 中订单数量的增加,我开始收到错误提示 "An unexpected error has occurred"

执行时间:677.15s 脚本使用:75 Error:SSS_INSTRUCTION_COUNT_EXCEEDED” 脚本执行指令计数超出。 堆栈跟踪:预定

请帮助我摆脱这个错误。

p.s: 没有针对上述问题的套件答案。

如果我在一个需要很长时间才能完成的循环中有一些逻辑,我通常会收到此错误。另一个常见的原因是无限循环。

NetSuite has put internal mechanisms in place to detect “runaway scripts” that include infinite loops. Once caught, these scripts will be terminated and an SSS_INSTRUCTION_COUNT_EXCEEDED error message is thrown. Should you receive this error, NetSuite recommends that you examine the for loops in your script to ensure that they contain either a terminating condition or a condition that can be met.

您还可以考虑以下几点

NetSuite 管理使用 nlapiLogExecution(type, title, details)

治理模型旨在防止不合理的过度日志记录,这会对共享同一数据库的其他 NetSuite 客户的性能产生负面影响。治理模型无意影响适当使用 nlapiLogExecution() 的公司(或脚本)。

治理模型如下:

在 60 分钟的时间段内,公司最多可以在其所有脚本中调用 nlapiLogExecution() 100,000 次。

如果 NetSuite 在 60 分钟内检测到给定脚本的日志记录过多(并将公司推向接近 100,000 nlapiLogExecution() 调用的限制),NetSuite 会将违规脚本的日志级别更改为更高级别。有问题的脚本将继续执行,但是,其日志级别将从“调试”变为“审计”,或“审计”变为“错误”,或“错误”变为“紧急”,具体取决于脚本。

脚本执行日志的容量由同一数据库上的客户共享。为了进一步防止过多的日志记录,脚本执行日志受每个 NetSuite 数据库实例的总存储限制的约束。在每个 NetSuite 服务器上,如果存储日志的数据库 table 达到此限制,所有日志(跨该服务器上的所有客户)都将被清除。为此,NetSuite 建议您使用自定义记录存储信息。

例子

公司 ABC 在 60 分钟内有 10 个脚本 运行。如果 10 个脚本中有一个调用

 nlapiLogExecution('DEBUG', 'My log', x.getID()) 

仅 20 分钟内 70,000 次,NetSuite 将提高脚本的日志级别。

日志级别的更改将出现在脚本的“脚本部署”页面的“日志级别”字段中(见图)。在下图中,如果违规脚本的日志级别最初设置为调试,NetSuite 会将日志级别提高到审核。这意味着读取

的代码行
nlapiLogExecution('DEBUG', 'My log', x.getID()) 

将继续执行,但不会记录任何内容,因为脚本的日志级别已提高到审核。

通知脚本所有者

如果 NetSuite 检测到一个脚本的日志记录过多,则会通知该脚本的所有者。脚本所有者收到警告,该脚本是他或她公司的主要贡献者,可能超过 100,000 个日志记录阈值(对于给定的 60 分钟时间段)。

NetSuite 通过电子邮件发送通知并将日志条目添加到脚本的执行日志中。电子邮件和 NetSuite 生成的日志都会提醒脚本所有者脚本的日志级别已提高。

参考资料:Netsuite Help Center[脚本记录治理]

NetSuite 中没有适当的文档来说明允许的脚本行数。正如@rockstar 所说

NetSuite has put internal mechanisms in place to detect “runaway scripts” that include infinite loops

我遇到了同样的错误,即使没有任何无限循环。

您应该采取的第一种方法是尝试通过减少循环或不必要的脚本语句的数量来优化您的脚本。

如果这不可能或仍然没有帮助,您可以在处理一定数量的数据后 yield 您的脚本来重置脚本语句的使用。