假设我有一个设置了 docker 主机,其中有 50 个容器,每个容器运行一个由 Apache 提供服务的站点。
据我了解,每个容器都会运行一个 Apache 实例,通常每个 Apache 实例每 RAM 使用 ~250mb。Apache 每个子进程需要几 mb。
我假设每个容器都需要一个完整 Apache 实例的内存,这样正确吗?例如,50 个站点需要 50 x ~300mb?
或者 Apache 是否能够在容器之间共享部分内存以提高内存效率?
Docker 是否适合高效的“大规模”托管(例如,大量网站,每个网站只需要很少的资源),其中每个网站都是一个容器?还是只有一个 Apache 容器为 50 个网站提供服务才可行?
答案1
docker 提供 apache 实例之间的隔离,这可能出于多种原因而有趣(例如,如果每个网站由不同的用户管理),还允许轻松地将实例重新定位到另一台服务器上。如果您不需要这样做,那么仅使用一个 Apache 实例可能会获得更好的性能。
隔离意味着资源使用情况与使用虚拟机非常相似,只是您无需支付虚拟化开销、内存分区开销和操作系统开销。话虽如此,Apache 内存使用情况应该主要取决于服务器负载,因此,如果您将大型服务器拆分成许多小型服务器,则不应期望内存使用量增加十倍。此外,由于只有一个内核,因此容器之间共享磁盘缓存,因此如果两个实例之间的磁盘访问模式相似,则可以获得一点性能提升。
答案2
如果我理解你的问题并且关注的是什么内存可以在容器实例之间共享,那么对于共享库来说,这个问题的答案是视情况而定。
引用:
https://groups.google.com/d/msg/docker-user/wCDC_sXzbks/i1gjlgQbxWEJ
第二个好处是,无论容器是什么,写时复制和页面共享都适用于主机上的所有进程。例如,将同一文件映射到内存(例如,库或可执行文件)的 1000 个容器将仅使用一次内存空间。如果它们写入内存,则只会复制它们写入的那些页面。第二个好处的警告是文件系统需要知道您的容器正在映射同一个文件。目前,aufs 存储驱动程序(在文件系统层运行)是这种情况,但 lvm/devicemapper 驱动程序(在块级别运行,因此没有受益)不是这种情况。正在开发的 zfs 和 btrfs 驱动程序也将受益于页面缓存。所以我预计在运行数千个容器的场景中和它们将大型相同文件映射到内存中,目前 aufs 驱动程序可以提高内存利用率。但我们尚未对此进行基准测试。