为啥我的容器没有使用我主机的可用 RAM?
Posted
技术标签:
【中文标题】为啥我的容器没有使用我主机的可用 RAM?【英文标题】:Why is my container is not using the available RAM of my host machine?为什么我的容器没有使用我主机的可用 RAM? 【发布时间】:2019-04-30 15:43:51 【问题描述】:我正在一台具有 16GB RAM 的 Windows 机器上运行 docker。
根据docker stats
,我的容器使用 4GB 内存(请参阅下面的输出)。但是,根据我的 Windows 任务管理器,没有进程占用这种内存,并且当我启动/停止容器时,我的计算机上的内存使用情况不会改变。
所以我的问题是
-
容器使用的 4GB RAM 来自哪里(磁盘作为 RAM?)
如何配置我的容器以使用可用 RAM
我的容器非常慢,我怀疑是因为上述行为;它使用磁盘作为虚拟内存,因此没有真正使用可用的资源(RAM)。
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
66a9ccfd0a51 quirky_wozniak 0.04% 4.268GiB / 4.815GiB 88.63% 113kB / 20.2kB 40.8MB / 1.07MB 16
task manager screen shot
Docker Settings
【问题讨论】:
【参考方案1】:Docker for Windows 通常运行一个虚拟机来支持 Linux 容器。分配给此 VM 的内存是 docker 主机上可用的内存。在首选项中,有一个菜单可以配置 CPU 核心数和专用于此 VM 的内存量:
(图片来源:Docker for Windows documentation)
【讨论】:
在高级虚拟机设置中,我提供了 5GB 的 RAM 和 4GB 的交换空间。容器仍然没有使用主机的 RAM。为避免歧义,我还添加了我的高级 VM 设置的屏幕截图 5GB = 4.815 GiB 大致。单位略有不同(二进制与 10 的):en.wikipedia.org/wiki/Gibibyte 请注意docker stats
中显示的限制不考虑在 docker 主机上的 VM 内运行的其他进程,因此容器无法使用所有这些内存。 Docker 只是让你知道,如果没有定义限制,容器可以使用它可以获得的所有主机内存。
如果我为我的 docker VM 设置了 5GB 的限制,并且如果我有一个进程在我的容器内运行需要 4GB,那么我预计我的 docker 主机的最低内存为 4GB。我的问题是为什么我们不使用它。
Docker 在 HyperV 中运行,不确定任务管理器对 VM 有任何可见性,它会向您显示当前 Windows 实例中运行的进程。我的问题是你为什么不尝试调整滑块给 docker 更多内存?在您进行此更改并表明它对您没有任何改进后,我会考虑进一步回答 cmets。【参考方案2】:
问题是任务管理器不将 Hyper-V 视为一个进程,因此不会显示在进程列表中。 换句话说,任务管理器并没有显示正在消耗的内存,而是以摘要形式显示。
通过使用 RMAP 等高级工具,我们可以看到“驱动程序锁定”部分下正在使用内存。
【讨论】:
以上是关于为啥我的容器没有使用我主机的可用 RAM?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的磁盘大小减小了,而没有使用 storageSize 的可用空间? ongodb
为啥“起航”命令没有构建我的 laravel docker 容器?