我每秒有大量字节来自传感器设备(例如视频),这些字节正在Docker容器中的进程读取和处理。
我有第二个Docker容器,它想读取处理后的字节流(每秒仍然有大量字节)。
什么是读取此流的有效方法?理想情况下,我希望第一个容器写入某种共享内存缓冲区,第二个容器可以读取该缓冲区,但是我不认为单独的Docker容器可以共享内存。也许有一些解决方案可以使用共享文件指针,并将文件保存到内存文件系统中?
我的目标是最大程度地提高性能,并最大程度地减少从一个缓冲区到另一缓冲区的无用数据副本。
编辑:很高兴拥有适用于Linux和Windows的解决方案。同样,我对寻找在C ++和python中执行此操作的解决方案感兴趣。
答案 0 :(得分:3)
使用mkfifo /tmp/myfifo
创建一个fifo。与两个容器共享它:--volume /tmp/myfifo:/tmp/myfifo:rw
您可以直接使用它:
从容器1:echo foo >>/tmp/myfifo
在容器2中:read var </tmp/myfifo
缺点:容器1被阻塞,直到容器2读取数据并清空缓冲区。
避免阻塞:在两个容器中,以bash exec 3<>/tmp/myfifo
运行。
从容器1:echo foo >&3
在容器2中:read var <&3
(或例如cat <&3
)
此解决方案使用exec
中的bash
个文件描述符处理。我不知道怎么做,但是其他语言当然也可以。
答案 1 :(得分:2)
使用简单的TCP套接字是我的首选。只有当测量表明我们绝对需要从系统中挤出最后的性能时,才可以使用管道或共享内存。
按照问题陈述进行操作,该过程似乎受本地CPU /内存资源的限制,并且限制因素不是外部服务。在这种情况下,将生产者和使用者都放在同一台机器上(作为docker容器)可能会先绑定CPU资源-但是在执行操作之前,我将首先进行测量。
开发代码的大部分工作都花在了维护代码上。因此,我赞成主流做法。 TCP堆栈具有坚如磐石的基础,并且在性能上已尽可能优化。此外,它还可以(完全吗?)跨平台和框架进行移植。通过TCP进行通信时,同一主机上的Docker容器不会发生故障。如果某天该进程确实达到了资源限制,则可以通过在物理主机之间划分生产者和使用者的方式来水平扩展-手动或使用Kubernetes。在这种情况下,TCP将无缝运行。如果您永远不需要该级别的吞吐量,那么在进程间通信中您也将不需要系统级的复杂性。
使用TCP。