查看和应用空闲虚拟机建议

Compute Engine 会提供空闲虚拟机建议,以帮助您识别未使用的虚拟机实例。这些建议是根据 Cloud Monitoring 服务在过去 14 天中收集的系统指标自动生成的。您可以使用空闲虚拟机建议来查找并停止空闲虚拟机实例,从而减少资源浪费并降低计算费用。

准备工作

价格

空闲虚拟机建议是免费提供的。

限制

对于独立虚拟机,在以下情况下,Compute Engine 不提供空闲建议:

  • 具有本地 SSD 的实例
  • 具有 GPU/TPU 的实例
  • App Engine 柔性资源
  • Dataflow 资源
  • Google Kubernetes Engine 资源

查看空闲虚拟机实例建议

如需查看有关空闲虚拟机的建议,请使用 gcloud 工具或 API。

gcloud

gcloud recommender recommendations list 命令--recommender=google.compute.instance.IdleResourceRecommender 搭配使用:

gcloud recommender recommendations list \
  --project=PROJECT_ID \
  --location=ZONE \
  --recommender=google.compute.instance.IdleResourceRecommender \
  --format=yaml

请替换以下内容:

  • PROJECT_ID:您的项目的 ID
  • ZONE:包含要为其列出建议的实例的可用区

例如:

gcloud recommender recommendations list \
  --project=my-project \
  --location=us-central1-c \
  --recommender=google.compute.instance.IdleResourceRecommender \
  --format=yaml

如果该位置没有空闲虚拟机,则响应为空。否则,响应会为每个建议添加以下字段:


---
content:
...
operationGroups:
- operations:
  - action: test
    path: /status
    resource: //compute.googleapis.com/projects/my-project/zones/us-central1-c/instances/vm-name
    resourceType: compute.googleapis.com/Instance
    value: RUNNING
  - action: replace
    path: /status
    resource: //compute.googleapis.com/projects/my-project/zones/us-central1-c/instances/vm-name
    resourceType: compute.googleapis.com/Instance
    value: TERMINATED
description: Save cost by stopping Idle VM 'vm-name'.
etag: '"83da314c23f634e1"'
lastRefreshTime: '2020-02-24T07:56:40Z'
name: projects/141732092341/locations/us-central1-c/recommenders/google.compute.instance.IdleResourceRecommender/recommendations/0e061a3a-f921-4216-b1b4-62e16942cd1a
primaryImpact:
category: COST
costProjection:
  cost:
    currencyCode: USD
    nanos: -91533961
    units: '-262'
  duration: 2592000s
recommenderSubtype: STOP_VM
stateInfo:
state: ACTIVE

如需详细了解如何使用 gcloud 处理建议,请参阅 gcloud 示例

API

调用 recommendations.list 方法并使用以下建议类型:

  • google.compute.instance.IdleResourceRecommender

API 调用类似于以下内容:

GET https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/recommenders/google.compute.instance.IdleResourceRecommender/recommendations

请替换以下内容:

  • PROJECT_ID:您的项目的 ID
  • ZONE:包含要为其列出建议的实例的可用区

如果您尚不熟悉调用 Google Cloud API 的身份验证前提条件,请参阅身份验证概览

以下示例 bash 脚本将最终用户身份验证流程与 OAuth 客户端凭据搭配使用。该脚本使用 Google oauth2l 命令行工具获取 OAuth 2.0 访问令牌,然后使用该令牌发出 curl 请求。

PROJECT_ID=my-project
ZONE=us-central1-c
RECOMMENDER=google.compute.instance.IdleResourceRecommender
OAUTH_JSON=~/service-account.json
OAUTH_HEADER="$(oauth2l header --json $OAUTH_JSON cloud-platform)"

curl -H "$OAUTH_HEADER" -H "x-goog-user-project: $PROJECT_ID" https://recommender.googleapis.com/v1/projects/$PROJECT_ID/locations/$ZONE/recommenders/$RECOMMENDER/recommendations

空闲虚拟机建议的 JSON 响应示例:

{
 "description" : "Save cost by stopping Idle VM `vm-name`",
 "name": "projects/1574864402/locations/us-central1-c/recommenders/"
         "google.compute.instance.IdleResourceRecommender/"
         "recommendations/0fd31b24-cc05-4132-8431-ed54a22dd4f1",
 "lastRefreshTime": {
   "seconds": 1543912652
 },
 "primaryImpact": {
   "category": COST,
   "costProjection": {
    "cost": {"currencyCode": "USD", "units": -50},
    "duration": { "seconds": 2592000 }
   }
 },
 "stateInfo": ACTIVE,
 "content":
   "groups" : [
    {
      "operations" : [
       {
         "action": "test",
         "resourceType": "compute.googleapis.com/Instance",
         "resource": "//compute.googleapis.com/projects/my-project/"
                     "zones/us-central1-c/instances/vm-name",
         "path": "/status",
         "value": "RUNNING"
       },
       {
         "action": "replace",
         "resourceType": "compute.googleapis.com/Instance",
         "resource": "//compute.googleapis.com/projects/my-project/"
                     "zones/us-central1-c/instances/vm-name",
         "path": "/status",
         "value": "TERMINATED"
       }
      ]
    }
   ]
 },
 "etag" : "cb0e6ac2cfc0b591"
}

如需详细了解每个字段,请参阅 Recommender API 文档

解读建议响应

您通过 gcloud 工具或 API 收到的每条建议都包含一个操作组,其中有一些可按顺序执行以应用该建议的操作。空闲虚拟机建议操作组包含两个操作:

  1. 用于验证虚拟机当前 status 的测试操作。例如:

     {
       "action": "test",
       "resourceType": "compute.googleapis.com/Instance",
       "resource" : "//compute.googleapis.com/projects/my-project/zones/us-central1-c/instances/vm-name",
       "path": "/status",
       "value": "RUNNING"
     }
    
  2. 用于更改虚拟机 status 的替换操作。例如:

     {
       "action": "replace",
       "resourceType": "compute.googleapis.com/Instance",
       "resource" : "//compute.googleapis.com/projects/my-project/zones/us-central1-c/instances/vm-name",
       "path": "/status",
       "value": "TERMINATED"
     }
    

第一个操作是 test,这意味着您应该测试 resource 是否仍在 RUNNING。您可以通过检查虚拟机状态来执行此操作。

第二个操作是 replace,这意味着您应该将资源的 status 替换为新值 TERMINATED。您可以通过停止虚拟机来执行此操作,下文将会介绍。

应用空闲虚拟机建议

在您收到空闲虚拟机建议并决定不再需要相应实例后,请使用 Google Cloud Consolegcloud 工具API 停止该实例,还可以删除该实例。

如果您停止但不删除实例及其磁盘,则仍需为其磁盘支付费用。

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 选择要停止的实例。
  3. 点击停止

gcloud

使用 instances stop 命令并指定要停止的 VM_NAME

gcloud compute instances stop VM_NAME --zone=ZONE

请替换以下内容:

  • VM_NAME:要停止的虚拟机实例的名称
  • ZONE:包含要停止的实例的可用区

API

在 API 中,构建一个 POST 请求以停止实例。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop

请替换以下内容:

  • PROJECT_ID:您的项目的 ID
  • ZONE:包含要停止的实例的可用区
  • VM_NAME:要停止的虚拟机实例的名称

如果您确定可以移除虚拟机实例及其磁盘,则可以删除实例

空闲虚拟机实例检测的工作原理

Compute Engine 会根据过去 14 天(对于新虚拟机,则从虚拟机创建之日起 5 天后开始)的使用情况指标生成有关空闲虚拟机实例的建议。如果在观察时间段内 CPU 和网络使用率较低,则 Recommender 会将相应虚拟机归类为空闲虚拟机。

如需将虚拟机归类为空闲虚拟机,必须满足以下所有条件:

  • 97% 的虚拟机运行时的 CPU 利用率低于 0.03 个 vCPU
  • 95% 的虚拟机运行时所接收到的网络流量低于 2600 字节/秒 (B/s)。
  • 95% 的虚拟机运行时所发送的网络流量低于 1000 B/s。

建议的频率

在虚拟机创建并运行 5 天后,系统会首次生成空闲虚拟机建议。此后,建议每天至少会更新一次。

与机器类型建议的关系

机器类型容量建议用于建议虚拟机的最佳容量。您可能会收到有关缩减空闲虚拟机容量的机器类型建议。

如果您必须让空闲虚拟机保持运行状态(即使其利用率较低也是如此),请使用机器类型建议来帮助您为利用不足的虚拟机选择最佳容量。

后续步骤