【问题标题】:What path does network data take between two LXC containers on the same physical host?同一物理主机上的两个 LXC 容器之间的网络数据采用什么路径?
【发布时间】:2015-02-24 00:07:26
【问题描述】:
我最近一直在阅读有关 OpenOnload 的文章,它在某些网络操作期间绕过 Linux 内核以提高性能。这让我很好奇如何处理同一服务器上的 LXC 容器之间的网络数据。如果我将数据从一个发送到另一个,它是否会多次通过内核 TCP 堆栈?如果是这样,与共享内存(如果我不使用 LXC 可能会使用)相比,这会增加多少延迟?对于 LXC-LXC 通信,某种内核绕过是否可行?
【问题讨论】:
标签:
linux
performance
networking
virtualization
lxc
【解决方案1】:
如你所知:
Linux 内核包含用于资源隔离的 cgroup(CPU、
内存、块 I/O、网络等),不需要启动任何
虚拟机。 Cgroups 还提供命名空间隔离
完全隔离应用程序对运行环境的看法,
包括进程树、网络、用户 ID 和挂载的文件系统。
LXC 结合了 cgroups 和命名空间支持来提供一个独立的
应用环境。
你问:
这让我很好奇如何处理同一服务器上的 LXC 容器之间的网络数据。
这就像 linux mashine 上的一个进程与同一 mashine 上的另一个/相同进程通信,但如果他会使用一个或两个 linux 网桥(容器内的 LXC 网络)+ 不同 cgroup/命名空间内的那些网桥。
如果我将数据从一个发送到另一个,它会一直通过吗
内核TCP堆栈多次?如果是这样,这有多少延迟
add 与共享内存之类的东西相比(如果我可能会使用它
没有使用LXC)?对于 LXC-LXC,某种内核绕过是否可行
沟通?
延迟不是很大,但是当我使用 php-fpm 作为在 127.0.0.1:8888 处侦听的守护程序并将其更改为侦听 unix 套接字时,rps(每秒页数)增加了。
Performance of unix sockets vs TCP ports
PS:
您可以在 LXC 容器上使用 unix 套接字。例如我用来在所有容器之间创建共享目录(例如:/tmp/mysql.sock):
mount --bind /lxc/shared /lxc/shared
mount --make-unbindable /lxc/shared