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