故障排除和调试
附加文件大小限制
一项作业的所有附加文件的总大小限制为 4 GB。
文件访问和权限
确保使用 Windows 操作系统的工作人员可以访问文件
默认情况下,Windows® 操作系统上的工作进程安装为以 LocalSystem
身份运行的服务,因此它无法访问映射的网络驱动器。
网络通常配置为不允许以 LocalSystem
身份运行的服务访问 UNC 或映射的网络共享。在这种情况下,您必须在具有作为服务登录权限的不同用户下运行 mjs 服务。请参阅 MATLAB® Parallel Server™ 系统管理员指南中的设置用户 (MATLAB Parallel Server) 部分。
任务函数不可用
如果工作进程无法找到任务函数,它会返回错误消息
Error using ==> feval Undefined command/function 'function_name'.
运行该任务的工作进程无权访问函数 function_name
。一种解决方案是确保函数文件 function_name.m
的位置包含在作业的 AdditionalPaths
属性中。另一个解决方案是通过将 function_name.m
添加到作业的 AttachedFiles
属性来将函数文件转移给工作进程。
加载和保存错误
如果工作进程无法保存或加载文件,您可能会看到错误消息
??? Error using ==> save Unable to write file myfile.mat: permission denied. ??? Error using ==> load Unable to read file myfile.mat: No such file or directory.
在确定此错误的原因时,请考虑以下问题:
工作人员当前的文件夹是什么?
工作进程能找到该文件或文件夹吗?
工作进程以什么用户身份运行?
工作进程是否有权限读取或写入相关文件?
任务或作业保持排队状态
作业或任务可能会卡在排队状态。要调查此问题的原因,请查找调度程序的日志:
Spectrum LSF® 调度器可能会发送带有错误消息的电子邮件。
Microsoft® Windows HPC Server(包括 CCS)、LSF®、PBS Pro® 和 TORQUE 将输出消息保存在调试日志中。参见
getDebugLog
参考页。如果使用通用调度器,请确保提交函数将错误消息重定向到日志文件。
造成该问题的可能原因有:
由于许可错误,MATLAB 工作进程无法启动,可执行文件不在工作进程机器的默认路径上,或者没有安装在调度器预期的位置。
MATLAB 无法读取/写入调度程序的作业存储位置中的作业输入/输出文件。所有工作进程节点可能无法访问该存储位置,或者 MATLAB 运行的用户没有读取/写入作业文件的权限。
如果使用通用调度器:
在 MATLAB 工作进程启动之前,环境变量
PARALLEL_SERVER_DECODE_FUNCTION
未定义。解码函数不在工作进程的路径上。
没有结果或作业失败
任务错误
如果您的作业没有返回结果(即,fetchOutputs(job)
返回一个空的单元格数组),则很可能是该作业失败了,并且它的某些任务已设置其 Error
属性。
您可以使用以下代码来识别带有错误消息的任务:
errmsgs = get(yourjob.Tasks, {'ErrorMessage'}); nonempty = ~cellfun(@isempty, errmsgs); celldisp(errmsgs(nonempty));
此代码显示在作业对象 yourjob
中找到的任务的非空错误消息。
调试日志
如果您正在使用受支持的第三方调度器,则可以使用 getDebugLog
函数从调度器中读取特定作业或任务的调试日志。
例如,在您的 LSF 调度器上找到失败的作业,并阅读其调试日志:
c = parcluster('my_lsf_profile') failedjob = findJob(c, 'State', 'failed'); message = getDebugLog(c, failedjob(1))
客户端与 MATLAB 作业调度器之间的连接问题
要测试客户端计算机和计算集群的机器之间的连接,您可以使用管理中心。有关管理中心的更多信息,包括如何启动它以及如何测试连接,请参阅 启动管理中心 (MATLAB Parallel Server) 和 在管理中心测试 MATLAB 作业调度器集群连接 (MATLAB Parallel Server)。
有关诊断客户端与 MATLAB 作业调度器之间的连接问题的其他方法的详细说明,可在 MathWorks 网站上列出的某些 Bug 报告中找到。
以下部分可以帮助您识别某些连接问题的一般性质。
客户端无法看到 MATLAB 作业调度器
如果您无法使用 parcluster
找到或连接到 MATLAB 作业调度器,则最可能的失败原因是:
MATLAB 作业调度器当前未运行。
防火墙不允许从客户端端到 MATLAB 作业调度器的流量。
客户端和 MATLAB 作业调度器运行的软件版本不同。
客户端和 MATLAB 作业调度器无法解析彼此的短主机名。
MATLAB 作业调度器正在使用
mjs_def
文件中定义的非默认BASE_PORT
设置,并且集群配置文件中的Host
属性未指定此端口。
MATLAB 作业调度器无法看到客户端
如果警告消息表明 MATLAB 作业调度器无法打开与客户端计算机的 TCP 连接,则最可能的原因是
防火墙不允许从 MATLAB 作业调度器到客户端的流量。
MATLAB 作业调度器无法解析客户端计算机的短主机名。使用
pctconfig
更改 MATLAB 作业调度器用于联系客户端的主机名。
“您的 shell 的一个初始化文件包含一个正在写入标准输出的命令...”
具有非共享文件系统的通用调度器的示例代码联系 sftp 服务器来处理往返于集群文件系统的文件传输。这种 sftp 的使用容易受到所有常见 sftp 漏洞的影响。可能发生的一个问题会导致类似如下的错误消息:
One of your shell's init files contains a command that is writing to stdout, interfering with RemoteClusterAccess. The stdout read was: <some output> Find and wrap the command with a conditional test, such as if ($?TERM != 0) then if ("$TERM" != "dumb") then <your command> endif endif
sftp 服务器启动一个 shell(通常是 bash 或 tcsh),以便在传输文件之前适当地设置您的标准读写权限。服务器以标准方式初始化 shell,调用.bashrc 和.cshrc 之类的文件。如果您的 shell 在启动时向标准输出发出文本,则会出现问题。该文本被传回至在 MATLAB 内运行的 sftp 客户端,并被解释为 sftp 服务器的响应消息的大小。
要解决此错误,请找到发出文本的 shell 启动文件代码,然后将其删除或将其括在 if
语句中,以查看 sftp 服务器是否正在启动 shell:
if ($?TERM != 0) then if ("$TERM" != "dumb") then /your command/ endif endif
您可以在 MATLAB 之外使用标准 UNIX 或 Windows sftp 命令行客户端进行测试,然后在 MATLAB 中重试。如果问题未解决,则错误消息仍然存在:
> sftp yourSubmitMachine
Connecting to yourSubmitMachine... Received message too long 1718579042
如果问题已解决,您应该看到:
> sftp yourSubmitMachine
Connecting to yourSubmitMachine...