intel / intel-iot-services-orchestration-layer

The total solution that provides visual graphical programming for developing IoT applications.
80 stars 61 forks source link

IOT 间隔触发 阻塞问题 #62

Closed Lilei-Wang closed 7 years ago

Lilei-Wang commented 7 years ago

我在iot 的工作流里面使用了 间隔触发 来定时触发我的工作流运行,我的工作流最后输出特定的字符 但是这样就造成了 阻塞 我每隔0.1秒执行一次工作流 一遍工作流耗时极少 但是 我执行的结果会延迟大概6秒左右才会输出 我想知道是不是单线程的问题?或者说是有什么更好的解决办法?是哪里的问题

jiangzidong commented 7 years ago

能不能贴出工作流的图? 既然"一遍工作流耗时极少", 为什么是延迟6s输出?

在0.1秒间隔触发下, 1s触发10次, 那么你的输出是在第6秒之内输出10次(间隔还是0.1s, 整体delay6s) 还是每次输出间隔是6s

Lilei-Wang commented 7 years ago

image

  1. 这就是我的工作流,整体的流程是关于RFID读写器的识别,每隔0.1秒轮询一次,标签被识别 然后输出标签的信息

2.当标签被识别之后会发出响声,我从读写器发出响声开始计时 到输出信息 时间大概为6秒左右,也就是说当一个标签被识别后,6秒之后会显示在文本框上面。(间隔还是0.1s 整体delay 6s)

3.6秒并不是固定的时间 有的时候会7-8秒

jiangzidong commented 7 years ago

可以尝试一下这个debug 功能, 点了"眼睛"后, 可有在右边的debug中看到该模块的输入输出, 从而可以看到时间的瓶颈在哪里.

请问你的RFID服务中有什么阻塞的代码吗? 比如 wille循环, 复杂的运算, IO读写等

Lilei-Wang commented 7 years ago

有一个IO的读写 轮询的时候要对 RFID读写器写入一个指令 才能获得相应的数据 Muliple polling 2 这个服务就是IO的读写 我在Muliple polling 2服务的开头和结尾输出了时间戳
可以看到 time of start muliple polling 2 1478591422327 ;
Data to write: aa00220000228e;
Flunsh data 0; Result of writing data: 7; Result of reading data: aa02220011c23000e200937373020114128094800da0ec8e; time of end muliple polling 2 :1478591422333 这是我日志里面打出的信息 整个服务计时也就是 6毫秒 请问 是不是因为node js的单线程问题导致了阻塞 ? 谢谢!

jiangzidong commented 7 years ago

单线程不会导致阻塞. 而是某些代码会阻塞线程. 现在我们还是不知道这6s花在了哪里, 能否做了实验, 将间隔触发设为10s, 然后每一个服务 kernel的开始, 和sendout后, 都打出时间. (或者就是用上面的debug功能 http://01org.github.io/intel-iot-services-orchestration-layer/#getstarted/advanced/debug/1-debug)

jiangzidong commented 7 years ago

抱歉, 之前的回复忘记写网页地址了

Lilei-Wang commented 7 years ago

感谢您的建议 我在每个服务kernel的开始 和sendout 的最后都打出了时间 init由于只执行一次 所以没有打时间上去 结果如下 `muliple polling 2 kernel start:1478596423132 muliple polling 2 send out start 1478596423143 muliple polling 2 send out over:1478596423151

infor handle kernel start:1478596423651 infor handle sendout start :1478596423654 infor handle sendout over:1478596423660

hashmap kernel start :1478596424194 hashmap send out start : 1478596424197 hashmap send out over :1478596424212`

  1. 我发现第一个服务执行了19ms 第二个执行了9ms 第三个执行了15ms 服务的执行时间都是很短的 但是服务之间的衔接时间却长达500ms 也就是0.5s
  2. 这也许就是使得我的工作流延迟的原因 0.1s 旧的工作流还没有执行完 所以新的工作流会延迟执行,并且效果会不断叠加
  3. 请问为什么工作流之间连接要这么长时间? (以上三个服务 我只写了kernel.js)一个服务执行完之后到下一个服务开始执行到底发生了什么??

    谢谢!

Lilei-Wang commented 7 years ago

不好意思, 我忘记说了 这个工作流的执行我把间隔时间设置成十秒

jiangzidong commented 7 years ago

服务之间信息的传递和处理, 以及每个服务的触发, 都需要一定的时间. 1, 你的硬件平台是什么? 我在edison上, 4个服务的总延时大概是1s 2, 如果你测到服务之间是0.5s, 你的工作流中4个服务, 最多延迟也只有2s, 为什么会6s? 3, IoTSOL现在没有对延时有特别的优化, 如果你对服务之间的时间要求很高, 可能需要将整个工作写入一个服务中.