模拟网格。异步通信和失败的链接

SimGrid. Asynchronous communications and failing links

模拟有一个master和七个workers。当工人结束执行数据时,他们dsendmessageTasksmaster关于执行完成。

 getHost().setProperty("busy", "no");
 ReleaseTask releaseTask = new ReleaseTask(getHost().getName());
 releaseTask.dsend("Master");

link 连接 worker1master 断开。这是link1.fail个文件。

PERIODICITY 2
0 1
1 0

我预计只有一个 releaseTask(来自 worker1)无法到达 master。但是,不幸的是,没有 releaseTasks(来自其他工人)达到 master。出现此错误警告:

[13.059397] /builds/workspace/SimGrid-Multi/build_mode/Debug/node/simgrid-ubuntu-trusty-64/build/SimGrid-3.13/src/simix/smx_global.cpp:554: [simix_kernel/CRITICAL] Oops ! Deadlock or code not perfectly clean.
[13.059397] [simix_kernel/INFO] 16 processes are still running, waiting for something.

大师收到task是这样的:

Task listenTask = Task.receive("Master");

当link 连接worker1master 未损坏时,所有模拟都正常。

如何避免这个问题?

已更新

我的 platform.xml 文件:

<link id="0_11" state_file="linkfailures/0_11.fail" bandwidth="3.430125Bps" latency="4.669142ms"/>

0_11.fail 文件:

PERIODICITY 2
0 1
1 0

Worker 在 6.94 秒时开始 dsend 一个 MessageTask 掌握。 MessageTask 传输时间为 0.07 秒。但是在 7.00 秒。连接 master 和 worker 的 link 开始断开。我想 master 继续使用永恒的 "receiving" 数据并发生错误。但是怎么处理呢?

如果你用dsend发送你的数据,那只意味着你不关心接收方是否收到它或者是否发生错误。它不会使通信更健壮(也不会更不健壮)。

您更新了您的问题,为您的模拟提供了两种可能的结果。有时您会说没有通信使其成为 master,当 SimGrid 报告死锁 (16 processes are still running, waiting for something) 时模拟结束,有时您会报告正在发生 TransferFailureError。但实际上,如果我是对的,那正是你所期望的。

事情是这样的:

  • 您发送消息 dsend
  • 消息丢失,因为 link 失败。不,它不会因为 link 失败而永远交付,它会立即消失。

此时有两种可能的结果,具体取决于 link 是在通信开始之前还是之后失败(在接收方发布其 recv 之前或之后)。

  • 如果 link 在 之前 接收者(在你的情况下似乎是主人)发布其 recv 请求的时间之前失败,那么失败不会被注意到。事实上,还没有接收者通知,发送者表示不关心通信结果,通过使用 dsend.
  • 如果 link 在接收方发布其请求后 失败 ,则发送方不会注意到任何事情(因为 dsend) ,接收方在其接收操作中获得 TransferFailureException。因此,即使您使用 dsend 发送失败的通信也会杀死某人,但实际上死去的是主人。这就是其他 slave 无法与 master 通信的原因:他在从可疑主机接收到一些东西时得到了一个未捕获的异常。

如果你想让发件人注意到你的消息没有通过(可能重新发送),那么你不想使用 dsendisend (用于异步通信) 或 send (对于阻塞通信)。并且发送方必须注意通信的状态。

如果你想让你的消息真正延迟但不被破坏,那么尝试将link的带宽更改为0一段时间(如果state_file则使用availability_file) .

如果您希望您的接收器在此类通信问题中幸存下来,只需捕获它获得的异常即可。