AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 318028
Accepted
Shahid Thaika
Shahid Thaika
Asked: 2022-10-11 02:45:47 +0800 CST2022-10-11 02:45:47 +0800 CST 2022-10-11 02:45:47 +0800 CST

Melhor estimativa do "pior uso de memória" para MySQL

  • 772

Ferramentas como MySQLTuner adicionam memória alocada globalmente e a adicionam ao produto de conexões máximas e requisitos de memória por conexão. Formulei a seguinte consulta para estimar melhor quanta memória máxima seria necessária, se 100% das max_connections fossem usadas.

Alguém pode verificar se parece correto e se algum ajuste pode ser feito?

Percebo que exclui muitos outros requisitos de RAM do MySQL e do servidor, mas a ideia é estimar melhor.

SELECT
    sys.FORMAT_BYTES(
        @@key_buffer_size + @@query_cache_size + @@innodb_buffer_pool_size + @@innodb_log_buffer_size +
        (
            @@max_connections
             * (
                ((select_scans / queries) * @@read_buffer_size)
                + ((sort_operations / queries) * (@@read_rnd_buffer_size + @@sort_buffer_size))
                + ((join_operations / queries) * @@join_buffer_size)
                + @@binlog_cache_size + @@thread_stack
                + ((temp_tables / queries) * LEAST(@@tmp_table_size, @@max_heap_table_size))
                #need a better way to determine average packet size
                + (@@max_allowed_packet * 0.5) + @@net_buffer_length
            )
        )
    ) AS MAX_MEMORY
FROM (
    SELECT
        SUM(COUNT_STAR) AS queries,
        SUM(SUM_SELECT_SCAN) AS select_scans,
        SUM(
            GREATEST(
                (CASE WHEN UPPER(DIGEST_TEXT) LIKE '%ORDER BY%' THEN COUNT_STAR ELSE 0 END),
                (CASE WHEN SUM_SORT_MERGE_PASSES > 0 OR SUM_SORT_RANGE > 0 OR SUM_SORT_ROWS > 0 OR SUM_SORT_SCAN > 0 THEN COUNT_STAR ELSE 0 END)
            )
        ) AS sort_operations,
        SUM(CASE WHEN UPPER(DIGEST_TEXT) LIKE '%JOIN%' THEN COUNT_STAR ELSE 0 END) AS join_operations,
        SUM(SUM_CREATED_TMP_TABLES) AS temp_tables
    FROM performance_schema.events_statements_summary_by_digest
) t;
mysql performance
  • 2 2 respostas
  • 36 Views

2 respostas

  • Voted
  1. Bill Karwin
    2022-10-11T14:12:27+08:002022-10-11T14:12:27+08:00

    Este não é realmente um valor útil para calcular, mesmo que você possa obter uma estimativa mais precisa, porque o "uso máximo de memória" teórico nunca acontece.

    Em todas as produções do MySQL Server que analisei (visitei dezenas de empresas como consultor e suportei milhares de instâncias do MySQL Server como DBA), o cálculo do tipo MySQLTuner sempre fornece um uso teórico máximo de memória que é muitas vezes a quantidade de RAM física no servidor. Mas você nunca vê o uso de memória swap igual a 10x RAM física.

    A fórmula de estimativa que você mostra tem algumas imprecisões de qualquer maneira:

    • Alguns buffers não são alocados em seu tamanho total toda vez que são usados ​​(exemplo: tmp_table_size, etc.)

    • Alguns buffers podem ser alocados mais de uma vez em uma determinada consulta (exemplo: join_buffer_sizee tmp_table_size)

    • Algum uso de RAM não está disponível em uma variável de configuração (exemplo: o otimizador usa uma quantidade variável de RAM ao estimar o custo de consultas de intervalo de vários valores)

    De qualquer forma, para um servidor MySQL atingir o uso máximo de memória por esta fórmula, você teria que ter max_connectionsclientes, todas as consultas executando simultaneamente, e cada consulta teria que alocar todos os buffers em seu tamanho máximo permitido.

    Isso simplesmente nunca acontece. Seu servidor de banco de dados entraria em colapso muito antes de atingir esse nível de uso simultâneo.

    Eu me encolho quando vejo as pessoas confiarem no conselho do MySQLTuner. Frequentemente dá conselhos muito ruins e enganosos. Eu não acho que o autor tenha muito conhecimento sobre os componentes internos do MySQL.

    Então, o que devemos fazer para estimar o uso de memória com precisão?

    Observar.

    Obtenha algum serviço de coleta de métricas para representar graficamente o tamanho real da memória do mysqldprocesso ao longo do tempo, pois ele lida com tráfego realista de seu aplicativo em seu servidor. Isso será preciso, mostrará a informação verdadeira, mínima e máxima, e o padrão de aumento e diminuição.

    • 1
  2. Best Answer
    Rick James
    2022-10-11T10:16:54+08:002022-10-11T10:16:54+08:00

    Essa é uma boa facada em uma fórmula melhor. Mas ainda acredito que não é possível obter um limite superior "correto".

    • max_connections, table_open_cache, max_allowed_packet, etc, raramente são atingidos. (Ou seja, sua fórmula ainda será uma superestimativa do máximo.)
    • Alguns dos buffers por consulta são realmente por consulta SELECT, e isso inclui subconsultas. Você tentou contabilizar tal.
    • Quando há vários JOINsem uma única consulta, pode haver várias tabelas temporárias. (Acho que você não permitiu isso.)
    • Alguns desses "count_stars" e "sums" são cumulativos e não são marcas d'água altas. (Eu não sei qual, do topo da minha cabeça.) Embora sua fórmula tente contabilizar várias seleções em uma única consulta, ela não evita os contadores "cumulativos".
    • A divisão dos contadores pelo número de consultas fornece uma média; você precisa de um máximo. (No meu sistema, recebo 0,08 "select_scans" e 0,03 "sorts".) Você precisa do "max" sobre as consultas. No meu caso, pode ser 1 ou 2 varreduras e classificações por consulta, mas geralmente 0. (Não, não sei como calcular isso.)
    • Existe um buffer de log binário e provavelmente algumas outras coisas.

    Algumas configurações:

    • Você não deve estar usando MyISAM, então key_buffer_sizedeve ser "pequeno" (exceto no MySQL 8.0, onde deve ser 0).
    • O cache de consulta não pode ser usado em clusters e foi removido de algumas versões; portanto query_cache_size, com poucas exceções, deve ser 0. (A variável até desapareceu em 8.0, invalidando assim a consulta.)

    Parece que alguns outros ajustáveis ​​estão faltando, mas levaria um tempo para vasculhar minhas anotações. Deseja continuar esta discussão?

    • 0

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve