模拟网格。异步通信和失败的链接
SimGrid. Asynchronous communications and failing links
模拟有一个master
和七个workers
。当工人结束执行数据时,他们dsend
messageTasks
到master
关于执行完成。
getHost().setProperty("busy", "no");
ReleaseTask releaseTask = new ReleaseTask(getHost().getName());
releaseTask.dsend("Master");
link 连接 worker1
而 master
断开。这是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 连接worker1
且master
未损坏时,所有模拟都正常。
如何避免这个问题?
已更新
我的 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 通信的原因:他在从可疑主机接收到一些东西时得到了一个未捕获的异常。
如果你想让发件人注意到你的消息没有通过(可能重新发送),那么你不想使用 dsend
但 isend
(用于异步通信) 或 send
(对于阻塞通信)。并且发送方必须注意通信的状态。
如果你想让你的消息真正延迟但不被破坏,那么尝试将link的带宽更改为0一段时间(如果state_file
则使用availability_file
) .
如果您希望您的接收器在此类通信问题中幸存下来,只需捕获它获得的异常即可。
模拟有一个master
和七个workers
。当工人结束执行数据时,他们dsend
messageTasks
到master
关于执行完成。
getHost().setProperty("busy", "no");
ReleaseTask releaseTask = new ReleaseTask(getHost().getName());
releaseTask.dsend("Master");
link 连接 worker1
而 master
断开。这是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 连接worker1
且master
未损坏时,所有模拟都正常。
如何避免这个问题?
已更新
我的 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 通信的原因:他在从可疑主机接收到一些东西时得到了一个未捕获的异常。
如果你想让发件人注意到你的消息没有通过(可能重新发送),那么你不想使用 dsend
但 isend
(用于异步通信) 或 send
(对于阻塞通信)。并且发送方必须注意通信的状态。
如果你想让你的消息真正延迟但不被破坏,那么尝试将link的带宽更改为0一段时间(如果state_file
则使用availability_file
) .
如果您希望您的接收器在此类通信问题中幸存下来,只需捕获它获得的异常即可。