Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2025-08-07 GMT+08:00

Alto uso da CPU

Se o uso da CPU atingir 80%, existe um gargalo de CPU. Nesse caso, a leitura e gravação de dados são lentas, afetando seus serviços.

A seguir, descreve-se como analisar consultas lentas atuais. Após a análise e otimização, o desempenho da consulta será melhorado e os índices serão usados de forma mais eficiente.

Analisar consultas atuais

  1. Conecte-se a uma instância usando o Mongo Shell.
  2. Execute o seguinte comando para visualizar as operações que estão sendo executadas no banco de dados:

    db.currentOp()

    Saída do comando:

    {
            "raw" : {
                    "shard0001" : {
                            "inprog" : [
                                    {
                                            "desc" : "StatisticsCollector",
                                            "threadId" : "140323686905600",
                                            "active" : true,
                                            "opid" : 9037713,
                                            "op" : "none",
                                            "ns" : "",
                                            "query" : {
     
                                            },
                                            "numYields" : 0,
                                            "locks" : {
     
                                            },
                                            "waitingForLock" : false,
                                            "lockStats" : {
     
                                            }
                                    },
                                    {
                                            "desc" : "conn2607",
                                            "threadId" : "140323415066368",
                                            "connectionId" : 2607,
                                            "client" : "172.16.36.87:37804",
                                            "appName" : "MongoDB Shell",
                                            "active" : true,
                                            "opid" : 9039588,
                                            "secs_running" : 0,
                                            "microsecs_running" : NumberLong(63),
                                            "op" : "command",
                                            "ns" : "admin.",
                                            "query" : {
                                                    "currentOp" : 1
                                       },
                                            "numYields" : 0,
                                            "locks" : {
     
                                            },
                                            "waitingForLock" : false,
                                            "lockStats" : {
     
                                            }
                                    }
                            ],
                            "ok" : 1
                    },
        ...
    }
    • client: endereço IP do cliente que envia a solicitação
    • opid: o ID de operação exclusivo
    • secs_running: tempo decorrido para execução, em segundos. Se o valor retornado desse campo for muito grande, verifique se a solicitação é razoável.
    • microsecs_running: tempo decorrido para execução, em segundos. Se o valor retornado desse campo for muito grande, verifique se a solicitação é razoável.
    • op: tipo de operação. As operações podem ser query, insert, update, delete ou command.
    • ns: coleção de destino
    • Para obter detalhes, consulte o comando db.currentOp() no documento oficial.
  3. Com base na saída do comando, verifique se há solicitações que levam muito tempo para serem processadas.

    Se o uso da CPU for baixo enquanto os serviços estão sendo processados, mas depois se tornar alto durante apenas determinadas operações, analise as solicitações que levam muito tempo para serem executadas.

    Se uma consulta anormal for encontrada, encontre o opid correspondente à operação e execute db.killOp(opid) para eliminá-la.

Analisar consultas lentas

A criação de perfil de consulta lenta está ativada para o DDS por padrão. O sistema registra automaticamente quaisquer consultas cuja execução demore mais de 500 ms para a coleção system.profile no banco de dados correspondente. Você pode:

  1. Conecte-se a uma instância usando o Mongo Shell.
  2. Selecionar um banco de dados específico (usando o banco de dados test como exemplo):

    use test

  3. Verificar se consultas SQL lentas foram coletadas em system.profile.

    show collections;

    • Se a saída do comando incluir system.profile, foram geradas consultas SQL lentas. Vá para a próxima etapa.
      mongos> show collections
      system.profile
      test
    • Se a saída do comando não contiver system.profile, nenhuma consulta SQL lenta foi gerada e a análise de consulta lenta não será necessária.
      mongos> show collections
      test
  4. Verificar os logs de consulta lenta no banco de dados.

    db.system.profile.find().pretty()

  5. Analisar logs de consulta lenta para encontrar a causa do alto uso da CPU.

    Veja a seguir um exemplo de log de consulta lenta. O log mostra uma solicitação que verificou toda a tabela, incluindo 1.561.632 documentos e sem usar um índice de pesquisa.

    {
            "op" : "query",
            "ns" : "taiyiDatabase.taiyiTables$10002e",
            "query" : {
                    "find" : "taiyiTables",
                    "filter" : {
                            "filed19" : NumberLong("852605039766")
                    },
                    "shardVersion" : [
                            Timestamp(1, 1048673),
                            ObjectId("5da43185267ad9c374a72fd5")
                    ],
                    "chunkId" : "10002e"
            },
            "keysExamined" : 0,
            "docsExamined" : 1561632,
            "cursorExhausted" : true,
            "numYield" : 12335,
            "locks" : {
                    "Global" : {
                            "acquireCount" : {
                                    "r" : NumberLong(24672)
                            }
                    },
                    "Database" : {
                            "acquireCount" : {
                                    "r" : NumberLong(12336)
                            }
                    },
                    "Collection" : {
                            "acquireCount" : {
                                    "r" : NumberLong(12336)
                            }
                    }
            },
            "nreturned" : 0,
            "responseLength" : 157,
            "protocol" : "op_command",
            "millis" : 44480,
            "planSummary" : "COLLSCAN",
            "execStats" : {
                  "stage" : "SHARDING_FILTER",                                                                                                                                       [3/1955]
                    "nReturned" : 0,
                    "executionTimeMillisEstimate" : 43701,
                    "works" : 1561634,
                    "advanced" : 0,
                    "needTime" : 1561633,
                    "needYield" : 0,
                    "saveState" : 12335,
                    "restoreState" : 12335,
                    "isEOF" : 1,
                    "invalidates" : 0,
                    "chunkSkips" : 0,
                    "inputStage" : {
                            "stage" : "COLLSCAN",
                            "filter" : {
                                    "filed19" : {
                                            "$eq" : NumberLong("852605039766")
                                    }
                            },
                            "nReturned" : 0,
                            "executionTimeMillisEstimate" : 43590,
                            "works" : 1561634,
                            "advanced" : 0,
                            "needTime" : 1561633,
                            "needYield" : 0,
                            "saveState" : 12335,
                            "restoreState" : 12335,
                            "isEOF" : 1,
                            "invalidates" : 0,
                            "direction" : "forward",
                            "docsExamined" : 1561632
                    }
            },
            "ts" : ISODate("2019-10-14T10:49:52.780Z"),
            "client" : "172.16.36.87",
            "appName" : "MongoDB Shell",
            "allUsers" : [
                    {
                            "user" : "__system",
                            "db" : "local"
                    }
            ],
           "user" : "__system@local"
    }

    Os seguintes estágios podem ser causas de uma consulta lenta:

    • COLLSCAN envolve uma verificação de coleção completa (tabela completa).

      Quando uma solicitação (como query, update e delete) requer uma verificação completa da tabela, uma grande quantidade de recursos da CPU é ocupada. Se você encontrar COLLSCAN no log de consultas lentas, uma verificação completa da tabela foi executada e isso ocupa muitos recursos da CPU.

      Se tais solicitações forem frequentes, crie índices para os campos a serem consultados.

    • docsExamined envolve uma verificação de coleção completa (tabela completa).

      Você pode exibir o valor de docsExamined para verificar o número de documentos verificados. Um valor maior indica um uso maior da CPU.

    • Índices de verificação IXSCAN e keysExamined.
      • Um número excessivo de índices pode afetar o desempenho de gravação e atualização.
      • Se a sua aplicação tiver mais operações de gravação, a criação de índices poderá aumentar a latência de gravação.

      Você pode exibir o valor de keyExamined para ver quantos índices são verificados em uma consulta. Um valor maior indica um uso maior da CPU.

      Se um índice não for criado corretamente ou se houver muitos resultados correspondentes, o uso da CPU não diminuirá muito e a velocidade de execução será lenta.

      Exemplo: para os dados de uma coleção, o número de valores do campo a é pequeno (apenas 1 e 2), mas o campo b tem mais valores.

      { a: 1, b: 1 }
      { a: 1, b: 2 }
      { a: 1, b: 3 }
      ......
      { a: 1, b: 100000} 
      { a: 2, b: 1 }
      { a: 2, b: 2 }
      { a: 2, b: 3 }
      ......
      { a: 1, y: 100000}

      A seguir mostra como implementar a consulta {a: 1, b: 2}.

      db.createIndex({a: 1}): The query is not effective because the a field has too many same values.
      db.createIndex({a: 1, b: 1}): The query is not effective because the a field has too many same values.
      db.createIndex({b: 1}): The query is effective because the b field has a few same values.
      db.createIndex({b: 1, a: 1}): The query is not effective because the a field has a few same values.

      Para as diferenças entre {a: 1} e {b: 1, a: 1}, consulte os documentos oficiais.

    • SORT e hasSortStage podem envolver a classificação de uma grande quantidade de dados.

      Se o valor do parâmetro hasSortStage na coleção system.profile for true, a solicitação de consulta envolverá classificação. Se a classificação não puder ser implementada por meio de índices, os resultados da consulta serão classificados e a classificação será uma operação intensiva da CPU. Nesse cenário, você precisa criar índices para campos que são classificados com frequência.

      Se a coleção system.profile contiver SORT, você poderá usar a indexação para melhorar a velocidade de classificação.

    Outras operações, como criação e agregação de índice (combinações de passagem, consulta, atualização e classificação), também se aplicam aos cenários mencionados acima porque também são operações intensivas de CPU. Para obter mais informações sobre criação de perfil, consulte documentos oficiais.

Capacidade de análise

Após a análise e otimização das solicitações que estão sendo executadas e solicitações lentas, todas as solicitações usam índices adequados e o uso da CPU se torna estável. Se o uso da CPU permanecer alto após a análise e a solução de problemas, a instância atual pode ter atingido o gargalo de desempenho e não conseguir atender aos requisitos de serviço. Neste caso, você pode executar as seguintes operações para resolver o problema:
  1. Exiba informações de monitoramento para analisar o uso de recursos da instância. Para obter detalhes, consulte Exibição de métricas de monitoramento.
  2. Altere a classe de instância do DDS ou adicione nós de fragmentos.