Reduzindo o uso de memória do MySQL

1

Conclusão:

  • se você realmente quiser usar pouca memória fora da caixa, soltar o MySQL e usar o PostgreSQL : ele tem um ~ 30Mo footprint de memória, ou seja, mais de 10x menor que o MySQL ; a migração foi bastante fácil, seja no lado do servidor ou no lado do aplicativo (usando o NHibernate).

  • na vida real, é claro que você não estará alterando seu banco de dados para salvar 300Mo, mas como notado nos comentários, você irá comprar alguma RAM ou se inscrever para uma VM maior se estiver hospedado.

Eu tenho uma nova configuração do MySQL em uma pequena máquina Windows Server 2008 (menos de 1GB de RAM ).

O processo mysqld está consumindo entre 300MB e 400MB de memória, fazendo com que o sistema troque!

Eu li isso poderia ajudar:

  • desabilitando InnoDB mas eu preciso disso,
  • tuning InnoDB mas minha configuração parece usar valores baixos (por exemplo, innodb_buffer_pool_size ).

Para obter informações, veja o arquivo de configuração my.ini :

[client]
no-beep
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="C:\Program Files\MySQL\MySQL Server 5.6\"
datadir="C:\ProgramData\MySQL\MySQL Server 5.6\data\"
character-set-server=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
log-output=FILE
general-log=0
general_log_file="my-pc.log"
slow-query-log=1
slow_query_log_file="my-pc.log"
long_query_time=10
log-error="my-pc.err"
max_connections=100
query_cache_size=1M
table_open_cache=2000
tmp_table_size=3M
thread_cache_size=9
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=5M
key_buffer_size=8M
read_buffer_size=0
read_rnd_buffer_size=0
sort_buffer_size=0
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=48M
innodb_thread_concurrency=8
innodb_autoextend_increment=64M
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
back_log=70
flush_time=0
join_buffer_size=256K
max_allowed_packet=4M
max_connect_errors=100
open_files_limit=4110
query_cache_type=1
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000

Este servidor MySQL pode ser muito pequeno: máx. 20 conexões ao mesmo tempo, não mais do que 2GB de dados para armazenar, sem necessidade de alto desempenho ...

Existe alguma maneira de reduzir o consumo de memória desta instância do MySQL ou ela já está no mínimo?

Agradecemos antecipadamente por qualquer ajuda.

    
por Pragmateek 16.03.2013 / 19:19

1 resposta

3

O seguinte my.ini para o mysql 5.6 faz com que os "bytes privados" passem de 630MB para 20MB e o "conjunto de trabalho" de 450MB para 21MB em uma máquina com Windows 7 de 64 bits. O desempenho de um servidor mysql configurado como este provavelmente será muito ruim, mas tecnicamente, se você quiser que ele ocupe o mínimo de memória possível, então esta é a resposta.

# MySQL Server Instance Configuration File
[client]
no-beep
socket=0.0
port=3306
[mysql]
default-character-set=utf8
# server_type=3
[mysqld]
# skip-networking
enable-named-pipe
# shared-memory
# shared-memory-base-name=MYSQL
socket=MYSQL
port=3306
# basedir="C:/Program Files/MySQL/MySQL Server 5.6/"
datadir=C:/ProgramData/MySQL/MySQL Server 5.6/Data
character-set-server=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# plugin-load=authentication_windows.dll
log-output=FILE
general-log=0
general_log_file="PEGASUS.log"
slow-query-log=1
slow_query_log_file="PEGASUS-slow.log"
long_query_time=10
# log-bin
log-error="PEGASUS.err"
server-id=1
max_connections=20 
query_cache_size=0
table_open_cache=100
tmp_table_size=44M
thread_cache_size=0
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=1M
key_buffer_size=8
read_buffer_size=8K
read_rnd_buffer_size=8K
sort_buffer_size=32K
# innodb_data_home_dir=0.0
# skip-innodb
innodb_additional_mem_pool_size=1M
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=256K
innodb_buffer_pool_size=1M
innodb_log_file_size=48M
innodb_thread_concurrency=9
innodb_autoextend_increment=64
innodb_buffer_pool_instances=2
innodb_concurrency_tickets=10
innodb_old_blocks_time=1000
innodb_open_files=10
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
back_log=5
flush_time=10
join_buffer_size=16K
max_allowed_packet=1M
max_connect_errors=100
open_files_limit=100
query_cache_type=2
table_definition_cache=400
binlog_row_event_max_size=8K
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000
host_cache_size=0
thread_stack=128K
max_heap_table_size=16K
bulk_insert_buffer_size=0
net_buffer_length=1K
innodb_sort_buffer_size=64K
binlog_cache_size=4K
binlog_stmt_cache_size=4K
performance_schema=0

Extraído daqui: michael.gr - Pegada mínima de memória do MySQL

    
por 04.03.2015 / 00:47