google-compute-engine - 为什么带有 COS 映像的 GCE VM 速度更快?
问题描述
我有两个 GCE 实例:一个带有在容器中运行 CentOS 7 的 COS 映像。让我们称之为VM1
。另一个直接在其上带有 CentOS 7 映像。让我们称之为VM2
。它们都运行相同的 PHP 应用程序(Laravel)。
VM1
Image: COS container with CentOS 7
Type: n1-standard-1 (1 vCPUj, 3,75 GB)
Disk: persistent disk 10 GB
VM2
Image: CentOS 7
Type: n1-standard-1 (2 vCPUj, 3,75 GB)
Disk: persistent disk 20 GB
如您所见,VM2
其规格比VM1
. 所以它应该表现更好,对吧?
也就是说,当我请求特定端点时,VM1
响应时间约为 1.6 秒,而VM2
响应时间约为 10 秒。它慢了大约 10 倍。端点在两个 VM 上执行完全相同的操作,它在 GCP SQL 实例上查询数据库,并返回结果。没什么异常。
因此,它几乎是相同的硬件、相同的客户操作系统和相同的应用程序。唯一的区别是VM1
通过 Docker 运行应用程序。
我搜索并尝试调试很多东西,但不知道发生了什么。也许我误解了什么。
我最好的猜测是 COS 图像有一些优化,可以使应用程序执行得更快。但我不知道具体是什么。首先,我认为这可能是一些磁盘 IO 问题。但是磁盘利用率还可以VM2
。然后我认为这可能是一些操作系统配置,然后我比较了两个虚拟机的 sysctl 设置,也有很多差异。但我不确定优化的关键是什么。
我的问题是:为什么会有这种差异?我可以改变什么来使VM2
速度更快VM1
?
解决方案
首先,Container-Optimized OS是基于开源的 Chromium OS,它不是 CentOS,基本上是另一个 Linux 发行版。
话虽如此,您需要了解该操作系统已针对运行 Docker 容器进行了优化。
这意味着容器优化操作系统实例预装了 Docker 运行时和 cloud-init,基本上这就是该操作系统所包含的全部内容,因为它是一个简约的容器优化操作系统。
因此,这个操作系统不会浪费 CentOS 拥有的所有可能消耗额外资源的应用程序、库和软件包的资源。
我在自己的项目中安装了这两个操作系统来检查每个操作系统的磁盘使用情况,谷歌的 Container-Optimized OS 仅使用 740MB,而 CentOS 则消耗 2.1GB。
$ hostnamectl | grep Operating
Operating System: Container-Optimized OS from Google
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 1.2G 740M 482M 61% /
$ hostnamectl | grep Operating
Operating System: CentOS Linux 7 (Core)
$ df -h
/dev/sda2 20G 2.1G 18G 11% /
我无法在 CentOS 中使用小型永久性磁盘,最小为 20 GB。
另一方面,容器让您的应用程序在对主机虚拟机 (VM) 的依赖较少的情况下运行,并独立于您部署到同一 VM 实例的其他容器化应用程序运行并优化使用的资源。
推荐阅读
- laravel - vue请求的取消删除方法出现401错误?
- c++ - DirectX11 每个三角形使用缓冲区中的第一个顶点
- java - 从 ArrayList java中删除某个对象
- html - 如何删除HTML段落内单词之间的空格
- c++ - 当不使用 volatile 关键字时,cpp vars 会发生什么样的编译器优化?
- performance - GHC forkIO 双峰性能
- node.js - 无法在 axios .catch 中获取错误消息
- java - 将两个 Stream 合并为一个 Flux
- emacs - Symbol 的函数定义为 void:TeX-fold-env
- android - 图标存在于可绘制文件夹中,但我得到资源未找到异常