Este documento descreve como implementar exemplos de utilização comuns através da API Cloud Quotas. Esta API permite-lhe ajustar programaticamente as quotas e automatizar os ajustes de quotas nos seus Google Cloud projetos, pastas ou organização.
Para saber mais, consulte a vista geral e a referência da API Cloud Quotas.
Limitações
As quotas do Google Cloud têm as seguintes limitações:
Na maioria dos casos, os ajustes de aumento da quota têm de ser feitos ao nível do projeto. Um número limitado de produtos suporta ajustes de aumento da quota ao nível da organização. Para ver se um Google Cloud produto suporta ajustes de aumento da quota ao nível da organização, consulte a documentação desse produto.
Pode pedir ajustes de diminuição da quota para quotas ao nível do projeto, da organização e da pasta.
Monitorize a utilização e peça um aumento quando a utilização for superior a 80%
Este exemplo monitoriza a utilização da quota com o Cloud Monitoring e, em seguida, pede um aumento quando a utilização é superior a 80%.
Chame o recurso
QuotaInfo
para o seu serviço para determinar o estado atualquotaValue
. O serviço neste exemplo écompute.googleapis.com
:GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos
Substitua
PROJECT_NUMBER
pelo número do projeto do seu projeto.Para encontrar as CPUs por projeto e as localizações aplicáveis, procure na resposta
QuotaInfo
o ID da quotaCPUS-per-project-region
. OquotaValue
é 20."quotaInfos": [ ... { "name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/CPUS-per-project-region", "quotaId": "CPUS-per-project-region", "metric": "compute.googleapis.com/cpus", "containerType": "PROJECT", "dimensions": [ "region" ], "dimensionsInfo": [ { "dimensions": [], "details": { "quotaValue": 20, "resetValue": 20 }, "applicableLocations": [ "us-central1", "us-central2", "us-west1", "us-east1" ] } ] }, ... ]
Chame a API Cloud Monitoring para encontrar a utilização da quota. No exemplo seguinte, foi especificada a região
us-central1
. As métricas de quota suportadas estão listadas emserviceruntime
.{ "name": "projects/PROJECT_NUMBER" "filter": "metric.type=\"serviceruntime.googleapis.com/quota/allocation/usage\" AND metric.labels.quota_metric=\"compute.googleapis.com/cpus\" AND resource.type=\"consumer_quota\" AND resource.label.location=\"us-central1\" ", "interval": { "startTime": "2023-11-10T18:18:18.0000Z", "endTime": "2023-11-17T18:18:18.0000Z" }, "aggregation": { "alignmentPeriod": "604800s", // 7 days "perSeriesAligner": "ALIGN_MAX", "crossSeriesReducer": "REDUCE_MAX" } }
Para determinar a sua utilização, processe a resposta da API Cloud Monitoring. Compare o valor do Cloud Monitoring com o
quotaValue
nos passos anteriores para determinar a utilização.Na resposta de exemplo seguinte, o valor de utilização no Cloud Monitoring é 19 na região
us-central1
. OquotaValue
para todas as regiões é 20. A utilização é superior a 80% da quota e é possível iniciar uma atualização das preferências de quota.time_series { metric { labels { key: "quota_metric" value: "compute.googleapis.com/cpus" } type: "serviceruntime.googleapis.com/quota/allocation/usage" } resource { type: "consumer_quota" labels { key: "project_id" value: "PROJECT_ID" } labels { key: "location" value: "us-central1" } } metric_kind: GAUGE value_type: INT64 points { interval { start_time { seconds: "2023-11-10T18:18:18.0000Z" } end_time { seconds: "2023-11-17T18:18:18.0000Z" } } value { int64_value: 19 } } }
Para evitar preferências de quota duplicadas, chame
ListQuotaPreferences
primeiro para verificar se existem pedidos pendentes. O indicadorreconciling=true
chama pedidos pendentes.GET projects/PROJECT_NUMBER/locations/global/quotaPreferences?filter=service=%22compute.googleapis.com%22%20AND%20quotaId=%22CPUS-per-project-region%22%20AND%20reconciling=true
Substitua
PROJECT_NUMBER
pelo número do projeto do seu projeto.Ligue para
UpdateQuotaPreference
para aumentar o valor da quota para a regiãous-central1
. No exemplo seguinte, foi especificado um novo valor preferencial de 100.O campo
allow_missing
está definido comotrue
. Isto indica ao sistema que deve criar um recursoQuotaPreference
onde não exista nenhum com o nome fornecido.PATCH projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1?allowMissing=true { "service": "compute.googleapis.com", "quotaId": "CPUS-per-project-region", "quotaConfig": { "preferredValue": 100 }, "dimensions": { "region": "us-central1" }, "justification": "JUSTIFICATION", "contactEmail": "EMAIL" }
Substitua o seguinte:
PROJECT_NUMBER
: o identificador exclusivo do seu projeto.JUSTIFICATION
: uma string opcional que explica o seu pedido.EMAIL
: um endereço de email que pode ser usado como contacto, caso a Google Cloud precise de mais informações antes de poder conceder quota adicional.
Ligue para
GetQuotaPreference
para verificar o estado da alteração da preferência de quota:GET projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1
Substitua
PROJECT_NUMBER
pelo número do projeto do seu projeto.Enquanto Google Cloud avalia o valor da quota pedido, o estado de conciliação da sua quota é definido como
true
.Por vezes, a Google Google Cloud aprova parte do seu pedido de aumento em vez de aprovar o aumento total. Se o pedido for parcialmente aprovado, a preferência de quota inclui um campo
stateDetail
. O campostateDetail
descreve o estado parcialmente aprovado. O campograntedValue
mostra o ajuste feito para satisfazer parcialmente o seu pedido.Para ver se o valor concedido é o valor final aprovado, consulte o campo
reconciling
. Se o seu pedido ainda estiver a ser avaliado, o camporeconciling
está definido comotrue
. Se o camporeconciling
estiver definido comofalse
ou for omitido, o valor concedido é o valor final aprovado.No exemplo seguinte, o valor da quota pedido é 100 e o campo
reconciling
indica que o pedido está em revisão."name": "projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1", "service": "compute.googleapis.com", "quotaId": "CPUS-per-project-region", "quotaConfig": { "preferredValue": 100, "grantedValue": 50, "traceId": "123acd-345df23", "requestOrigin": "ORIGIN_UNSPECIFIED" }, "dimensions": { "region": "us-central1" }, "reconciling": true, "createTime": "2023-01-15T01:30:15.01Z", "updateTime": "2023-01-16T02:35:16.01Z"
Depois de a preferência de quota ser processada, o campo
reconciling
é definido comofalse
. OgrantedValue
é igual aopreferredValue
. A quota preferencial é totalmente concedida.Quando Google Cloud rejeita ou aprova parcialmente um pedido do cliente, o valor da quota concedida pode continuar a ser inferior ao valor preferencial.
Diminua uma quota
O exemplo seguinte diminui o número de TPUs para 10 em cada região.
Obtenha o ID da quota e o valor atual da quota com uma chamada
ListQuotaInfos
:GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos
Substitua
PROJECT_NUMBER
pelo número do projeto do seu projeto.Procure nos campos de resposta uma entrada
QuotaInfo
paraV2-TPUS-per-project-region
."quotaInfos": [ ... { "name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region", "quotaId": "V2-TPUS-per-project-region", "metric": "compute.googleapis.com/Tpus", "containerType": "PROJECT", "dimensions": [ "region" ], "dimensionsInfo": [ { "dimensions": [], "details": { "quotaValue": 20, "resetValue": 20 }, "applicableLocations": [ "us-central1", "us-central2", "us-west1", "us-east1" ] } ] }, ... ]
Nesta resposta, o ID da quota é
V2-TPUS-per-project-region
e o valor atualquotaValue
é 20.Reduza a quota de TPUs em cada região para 10 com um
CreateQuotaPreferenceRequest
. Defina opreferredValue
como 10.POST projects/PROJECT_NUMBER/locations/global/quotaPreferences?quotaPreferenceId=compute_googleapis_com-Tpu-all-regions { "quotaConfig": { "preferredValue": 10 }, "dimensions": [], "service": "compute.googleapis.com", "quotaId": "V2-TPUS-per-project-region", "justification": "JUSTIFICATION", "contactEmail": "EMAIL" }
Substitua o seguinte:
PROJECT_NUMBER
: o identificador exclusivo do seu projeto.JUSTIFICATION
: uma string opcional que explica o seu pedido.EMAIL
: um endereço de email que pode ser usado como contacto, caso a Google Cloud precise de mais informações antes de poder conceder quota adicional.
Confirme o novo valor da quota com uma chamada
GetQuotaInfo
que define o ID da quota comoV2-TPUS-per-project-region
.GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region
Substitua
PROJECT_NUMBER
pelo número do projeto do seu projeto.Segue-se um exemplo de resposta. O valor
value
é 10 e é aplicável em todas as regiões."name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/V2-TPUS-per-project-region", "quotaId": "V2-TPUS-per-project-region", "metric": "compute.googleapis.com/v2_tpus", "containerType": "PROJECT", "dimensions": [ "region" ], "dimensionsInfo": [ { "dimensions": [], "details": { "value": 10, }, "applicableLocations": [ "us-central1", "us-central2", "us-west1", "us-east1" ] } ]
Copie as preferências de quota para outro projeto
O exemplo seguinte copia todas as preferências de quota de um projeto para outro. Está escrito em Java, mas pode usar qualquer linguagem de programação.
Chame
ListQuotaPreferences
no projeto de origem sem filtro:GET projects/PROJECT_NUMBER1/locations/global/quotaPreferences
PROJECT_NUMBER1 é o número do projeto de origem. A resposta contém todas as preferências de quota para o projeto de origem.
Para cada preferência de quota na resposta, chame
UpdateQuotaPreference
e defina os seguintes campos:name
: o campo de nome atualizado é retirado da resposta e o número do projeto de origem (PROJECT_NUMBER1) é substituído pelo número do projeto de destino (PROJECT_NUMBER2).service
,quotaId
,preferredValue
,dimensions
: estes campos podem ser retirados diretamente da resposta tal como estão.
for (QuotaPreference srcPreference : listResponse.getQuotaPreferences()) { QuotaPreference.Builder targetPreference = QuotaPreference.newBuilder() .setName(srcPreference.getName().replace("PROJECT_NUMBER1", "PROJECT_NUMBER2")) .setService(srcPreference.getService()) .setQuotaId(srcPreference.getQuotaId()) .setJustification(srcPreference.getJustification()) .setContactEmail(srcPreference.getContactEmail()) .setQuotaConfig( QuotaConfig.newBuilder().setPreferredValue(srcPreference.getQuotaConfig().getPreferredValue())) .putAllDimensions(srcPreference.getDimensionsMap()); UpdateQuotaPreferenceRequest updateRequest = UpdateQuotaPreferenceRequest.newBuilder() .setQuotaPreference(targetPreference) .setAllowMissing(true) .build(); cloudQuotas.updateQuotaPreference(updateRequest); }
Chame
ListQuotaPreferences
para verificar o estado das preferências de quota para o projeto de destino:GET projects/PROJECT_NUMBER2/locations/global/quotaPreferences
Substitua
PROJECT_NUMBER2
pelo número do projeto do seu projeto de destino.
Liste os pedidos de quota pendentes
Para listar todos os pedidos de preferência de quota pendentes para um projeto, chame
ListQuotaPreferences
com o filtro reconciling=true
.
GET projects/PROJECT_NUMBER/locations/global/quotaPreferences?reconciling=true
Substitua PROJECT_NUMBER
pelo número do projeto do seu projeto.
A resposta a este pedido devolve a preferência de quota pendente mais recente. Uma vez que a API Cloud Quotas é uma API declarativa, o sistema tenta satisfazer a preferência de quota mais recente.
Uma resposta de exemplo tem um aspeto semelhante ao seguinte:
"quotaPreferences": [ { "name": "projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-us-central1", "service": "compute.googleapis.com", "quotaId": "CPUS-per-project-region", "quotaConfig": { "preferredValue": 100, "grantedValue": 30, "traceId": "123acd-345df23", "requestOrigin": "ORIGIN_UNSPECIFIED" }, "dimensions": { "region": "us-central1" }, "reconciling": true, "createTime": "2023-01-15T01:30:15.01Z", "updateTime": "2023-01-16T02:35:16.01Z" }, { "name": "projects/PROJECT_NUMBER/locations/global/quotaPreferences/compute_googleapis_com-cpus-cross-regions", "service": "compute.googleapis.com", "quotaId": "CPUS-per-project-region", "quotaConfig": { "preferredValue": 10, "grantedValue": 5, "traceId": "456asd-678df43", "requestOrigin": "ORIGIN_UNSPECIFIED" }, "reconciling": true, "createTime": "2023-01-15T01:35:15.01Z", "updateTime": "2023-01-15T01:35:15.01Z" } ]
Peça aumentos da quota do grupo
Para pedir aumentos para um grupo de quotas num novo projeto, armazene as quotas preferenciais para o novo projeto num ficheiro CSV com os seguintes valores: nome do serviço, ID da quota, valor da quota preferencial e dimensões.
Para cada linha no ficheiro CSV, leia o conteúdo nos campos serviceName
,
quotaId
, preferredValue
e dimensionMap
.
CreateQuotaPreferenceRequest request = CreateQuotaPreferenceRequest.newBuilder() .setParent("projects/PROJECT_NUMBER/locations/global") .setQuotaPreferenceId(buildYourOwnQuotaPreferenceId(serviceName, quotaId, dimensionMap)) .setQuotaPreference( QuotaPreference.newBuilder() .setService(serviceName) .setQuotaId(quotaId) .setJustification(justification) .setContactEmail(contactEmail) .setQuotaConfig(QuotaConfig.newBuilder().setPreferredValue(preferredValue)) .putAllDimensions(dimensionMap)) .build(); cloudQuotas.createQuotaPreference(request);
Substitua PROJECT_NUMBER
pelo número do projeto do seu projeto.
Uma vez que o projeto de destino é novo, é seguro chamar o método CreateQuotaPreference
à medida que lê e atribui os campos. Em alternativa,
pode chamar o método UpdateQuotaPreference
com allow_missing
definido como true
.
O método buildYourOwnQuotaPreferenceId
cria um ID de preferência de quota a partir do nome do serviço, do ID de quota e de um mapa de dimensões de acordo com o seu esquema de nomenclatura. Em alternativa, pode optar por não definir o ID de preferência de quota. É gerado um ID de preferência de quota para si.
Peça ajustes em quotas que não têm utilização
Para quotas que ainda não tenham utilização de quotas e que tenham dimensões específicas do serviço, como vm_family
, é possível que essas quotas não estejam visíveis na consola Google Cloud . Em alternativa, pode ter de usar a API Cloud Quotas.
Por exemplo, pode clonar um projeto e saber antecipadamente que tem de
aumentar o valor de compute.googleapis.com/gpus_per_gpu_family
.
Este valor só aparece na Google Cloud consola para famílias de GPUs que já usou. Para usar a API Cloud Quotas para pedir um aumento das GPUs NVIDIA_H100 em us-central1
, pode enviar um pedido como o seguinte:
POST projects/PROJECT_NUMBER/locations/global/quotaPreferences?quotaPreferenceId=compute_googleapis_com-gpus-us-central1-NVIDIA_H100 {
"service": "compute.googleapis.com",
"quotaId": "GPUS-PER-GPU-FAMILY-per-project-region",
"quotaConfig": { "preferredValue": 100 },
"dimensions": { "region": "us-central1", "gpu_family": "NVIDIA_H100" },
"justification": "JUSTIFICATION",
"contactEmail": "EMAIL"
}
Substitua o seguinte:
PROJECT_NUMBER
: o identificador exclusivo do seu projeto.JUSTIFICATION
: uma string opcional que explica o seu pedido.EMAIL
: um endereço de email que pode ser usado como contacto, caso a equipa do Google Cloud precise de mais informações antes de poder conceder quota adicional. Google Cloud
Para mais informações, consulte também as descrições de Precedência das dimensões e Combinação de dimensões.
Obtenha informações sobre a quota para uma dimensão específica do serviço
A família de GPUs é uma dimensão específica do serviço. O pedido de exemplo seguinte usa o ID da quota GPUS-PER-GPU-FAMILY-per-project-region
para obter o recurso QuotaInfo
.
GET projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/GPUS-PER-GPU-FAMILY-per-project-region
Substitua PROJECT_NUMBER
pelo número do projeto do seu projeto.
Esta é uma resposta de exemplo. Para cada chave gpu_family
única, o quotaValue
e o applicableLocations
são diferentes:
"name": "projects/PROJECT_NUMBER/locations/global/services/compute.googleapis.com/quotaInfos/GpusPerProjectPerRegion", "quotatName": "CPUS-per-project-region", "metric": "compute.googleapis.com/gpus_per_gpu_family", "isPrecise": true, "quotaDisplayName": "GPUs per GPU family", "metricDisplayName": "GPUs", "dimensions": [ "region", "gpu_family" ], "dimensionsInfo": [ { "dimensions": { "region": "us-central1", "gpu_family": "NVIDIA_H200" }, "details": { "quotaValue": 30, "resetValue": 30, }, "applicableLocations": [ "us-central1" ] }, { "dimensions": { "region": "us-central1" } "details": { "quotaValue": 100, "resetValue": 100, }, "applicableLocations": [ "us-central1" ] }, { "dimensions": { "gpu_familly": "NVIDIA_H100" } "details": { "quotaValue": 10, }, "applicableLocations": [ "us-central2", "us-west1", "us-east1" ] } { "dimensions": [], "details": { "quotaValue": 50, "resetValue": 50, }, "applicableLocations": [ "us-central1", "us-central2", "us-west1", "us-east1" ] } ]
Crie uma preferência de quota para uma dimensão específica do serviço
O exemplo seguinte demonstra como criar uma quota para uma determinada região e família de GPUs com um valor preferencial de 100. A localização de destino é especificada no mapa de dimensões com a chave region
e a família de GPUs de destino com a chave gpu_family
.
O CreateQuotaPreference
exemplo seguinte especifica uma família de GPUs de
NVIDIA_H100
e uma região de us-central1
.
POST projects/PROJECT_NUMBER/locations/global/quotaPreferences?quotaPreferenceId=compute_googleapis_com-gpus-us-central1-NVIDIA_H100 { "service": "compute.googleapis.com", "quotaId": "GPUS-PER-GPU-FAMILY-per-project-region", "quotaConfig": { "preferredValue": 100 }, "dimensions": {"region": "us-central1", "gpu_family": "NVIDIA_H100"}, "justification": "JUSTIFICATION", "contactEmail": ""EMAIL" }
Substitua o seguinte:
PROJECT_NUMBER
: o identificador exclusivo do seu projeto.JUSTIFICATION
: uma string opcional que explica o seu pedido.EMAIL
: um endereço de email que pode ser usado como contacto, caso a equipa do Google Cloud precise de mais informações antes de poder conceder quota adicional. Google Cloud
Atualize uma preferência de quota para uma dimensão específica do serviço
O seguinte exemplo de código obtém o valor atual da dimensão
{"region" : "us-central1"; gpu_family:"NVIDIA_H100"},
e, em seguida, define o valor preferencial para o dobro do valor. Está escrito em Java, mas pode usar qualquer linguagem de programação.
// Get the current quota value for the target dimensions Map<String, String> targetDimensions = Maps.createHashMap("region", "us-central1", "gpu_family", "NVIDIA_H100"); long currentQuotaValue = 0; QuotaInfo quotaInfo = cloudQuotas.GetQuotaInfo( "projects/PROJECT_NUMBER/locations/global/services/" + serviceName + "quotaInfos/" + quotaId; for (dimensionsInfo : quotaInfo.getDimensionsInfoList()) { If (targetDimensions.entrySet().containsAll(dimensionsInfo.getDimensionsMap().entrySet()) { currentQuotaValue = dimensionsInfo.getDetails().getValue(); break; }) } // Set the preferred quota value to double the current value for the target dimensions QuotaPreference.Builder targetPreference = QuotaPreference.newBuilder() .setName(buildYourOwnQuotaPreferenceId(serviceName, quotaId, targetDimensions)) .setService(serviceName) .setQuotaId(quotaId) .setJustification(justification) .setContactEmail(contactEmail) .setQuotaConfig(QuotaConfig.newBuilder().setPreferredValue(currentQuotaValue * 2)) .putAllDimensions(targetDimensions)); UpdateQuotaPreferenceRequest updateRequest = UpdateQuotaPreferenceRequest.newBuilder() .setQuotaPreference(targetPreference) .setAllowMissing(true) .build(); cloudQuotas.updateQuotaPreference(updateRequest);
Substitua PROJECT_NUMBER
pelo identificador exclusivo do seu projeto.
O que se segue?
Acerca da API Cloud Quotas
Referência da API Cloud Quotas
Compreenda as quotas