mysql server 5.1 config on win 2008 (ajuda de especialistas requerida)

3

Estou executando o servidor MySQL 5.1.52-community no win 2008 R2 x64 standard edition. seu servidor de produção. quando a camada de aplicação "outro servidor" introduzir demasiadas solicitações / conexões tcp / "mais de 2000 consultas por segundo" a camada de aplicação pára.

a camada de aplicação é um produto empresarial muito estável que é usado em muitas empresas. e a equipe de suporte disse claramente que algo está errado com o servidor db.

então eu ajustei a configuração do mysql muitas vezes e ainda em casos de carga pesada a camada de aplicativo pára.

o servidor tem 16 GB de memória, mas o mysql usa apenas cerca de 5 GB. Então, a primeira pergunta é como deixar o serviço do servidor mysql usar até 12 GB.

uma coisa estranha que eu notei é que o processo mysqld tem mais de um milhão de identificadores "1,114,345" e isso é muito anormal em que qualquer processo normal tem no máximo 2000 alças! então, especialistas é isso ok! se não, então, como consertar isso.

esse banco de dados é innoDB sem Views ou SPs.

por favor ajude obrigado,

EDITAR : Depois de olhar para os comentários dos especialistas, aqui estão as configurações atuais do mysql:

[client]

port=3306

[mysql]

default-character-set=utf8


# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this 
# file.
#
[mysqld]

# The TCP/IP Port the MySQL Server will listen on
port=3306


#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Autonomy/MySQL/"

#Path to the database root
datadir="D:/MySQL Datafiles/data/"

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf8

# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# The maximum amount of concurrent sessions the MySQL server will
# allow. One of these connections will be reserved for a user with
# SUPER privileges to allow the administrator to login even if the
# connection limit has been reached.
max_connections=400

# Query cache is used to cache SELECT results and later return them
# without actual executing the same query once again. Having the query
# cache enabled may result in significant speed improvements, if your
# have a lot of identical queries and rarely changing tables. See the
# "Qcache_lowmem_prunes" status variable to check if the current value
# is high enough for your load.
# Note: In case your tables change very often or if your queries are
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.
query_cache_size=84M

# The number of open tables for all threads. Increasing this value
# increases the number of file descriptors that mysqld requires.
# Therefore you have to make sure to set the amount of open files
# allowed to at least 4096 in the variable "open-files-limit" in
# section [mysqld_safe]
table_cache=256

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=369M


# How many threads we should keep in a cache for reuse. When a client
# disconnects, the client's threads are put in the cache if there aren't
# more than thread_cache_size threads from before.  This greatly reduces
# the amount of thread creations needed if you have a lot of new
# connections. (Normally this doesn't give a notable performance
# improvement if you have a good thread implementation.)
thread_cache_size=8

#*** MyISAM Specific options

# The maximum size of the temporary file MySQL is allowed to use while
# recreating the index (during REPAIR, ALTER TABLE or LOAD DATA INFILE.
# If the file-size would be bigger than this, the index will be created
# through the key cache (which is slower).
myisam_max_sort_file_size=100G

# If the temporary file used for fast index creation would be bigger
# than using the key cache by the amount specified here, then prefer the
# key cache method.  This is mainly used to force long character keys in
# large tables to use the slower key cache method to create the index.
myisam_sort_buffer_size=738M

# Size of the Key Buffer, used to cache index blocks for MyISAM tables.
# Do not set it larger than 30% of your available memory, as some memory
# is also required by the OS to cache rows. Even if you're not using
# MyISAM tables, you should still set it to 8-64M as it will also be
# used for internal temporary disk tables.
key_buffer_size=320M

# Size of the buffer used for doing full table scans of MyISAM tables.
# Allocated per thread, if a full scan is needed.
read_buffer_size=64K
read_rnd_buffer_size=256K

# This buffer is allocated when MySQL needs to rebuild the index in
# REPAIR, OPTIMZE, ALTER table statements as well as in LOAD DATA INFILE
# into an empty table. It is allocated per thread so be careful with
# large settings.
sort_buffer_size=256K


#*** INNODB Specific options ***
innodb_data_home_dir="D:/MySQL Datafiles/"

# Use this option if you have a MySQL server with InnoDB support enabled
# but you do not plan to use it. This will save memory and disk space
# and speed up some things.
#skip-innodb

# Additional memory pool that is used by InnoDB to store metadata
# information.  If InnoDB requires more memory for this purpose it will
# start to allocate it from the OS.  As this is fast enough on most
# recent operating systems, you normally do not need to change this
# value. SHOW INNODB STATUS will display the current amount used.
innodb_additional_mem_pool_size=26M

# If set to 1, InnoDB will flush (fsync) the transaction logs to the
# disk at each commit, which offers full ACID behavior. If you are
# willing to compromise this safety, and you are running small
# transactions, you may set this to 0 or 2 to reduce disk I/O to the
# logs. Value 0 means that the log is only written to the log file and
# the log file flushed to disk approximately once per second. Value 2
# means the log is written to the log file at each commit, but the log
# file is only flushed to disk approximately once per second.
innodb_flush_log_at_trx_commit=2

# The size of the buffer InnoDB uses for buffering log data. As soon as
# it is full, InnoDB will have to flush it to disk. As it is flushed
# once per second anyway, it does not make sense to have it very large
# (even with long transactions).
innodb_log_buffer_size=13M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=1243M
innodb_buffer_pool_size=4096M

# Size of each log file in a log group. You should set the combined size
# of log files to about 25%-100% of your buffer pool size to avoid
# unneeded buffer pool flush activity on log file overwrite. However,
# note that a larger logfile size will increase the time needed for the
# recovery process.
innodb_log_file_size=622M

# Number of threads allowed inside the InnoDB kernel. The optimal value
# depends highly on the application, hardware as well as the OS
# scheduler properties. A too high value may lead to thread thrashing.
innodb_thread_concurrency=18
#Enter a name for the query log file. Otherwise a default name will be used.
# incase of remove command # for log sql queries will be logged
#log



#innod table extend
innodb_data_file_path=ibdata1:18M;inno_db_001:400M:autoextend
#innodb_log_group_home_dir="D:/MySQL Datafiles/"
lower_case_table_names=1
innodb_file_io_threads=4
innodb_lock_wait_timeout=50


#replication configuration
log-bin=mysql-bin
server-id = 1

então eu acho que se eu mudei:
innodb_buffer_pool_size = 4096M
para o
innodb_buffer_pool_size = 12G
12 GB serão alocados para o serviço / processo do mysqld. Certo?? o que mais deve ser mudado?

descobri também que, se a consulta levar mais de 15 minutos, o aplicativo considerará a tentativa de falha, embora o mysql ainda esteja trabalhando para obtê-la! talvez isso que causa as alças para ir muito grande!
Também acho que algumas das consultas tem que ler a partir da unidade de rede mapeada. mas nada pode ser feito para mudar isso. está totalmente fora do meu controle.

    
por Jawad Al Shaikh 27.06.2011 / 20:07

2 respostas

4

Alças podem ser uma dor de cabeça às vezes. O que eu costumo fazer com clientes com este problema é uma solução de band-aid rápida e suja: execute este comando:

FLUSH TABLES;

Isso fecha as alças abertas em todas as tabelas e as abre de volta. Tenho certeza de que as alças que não foram fechadas corretamente desaparecem, especialmente quando uma tabela tem dezenas de alças abertas e apenas uma ou duas estão em uso real. Eu vi manivelas cairem em gráficos MONYOG que construí logo depois de executar isto.

Você provavelmente está executando consultas que parecem normais e cujo plano EXPLAIN não informa nada. Mas, obtenha consultas suficientes que empilhem individualmente as alças abertas e você pode experimentar condições de corrida em que as alças estão se abrindo mais rapidamente do que estão sendo fechadas. O efeito líquido visível é um monte de entradas no log de consultas lentas cujas consultas, quando executadas de forma independente, funcionam bem. Além disso, você armazenará consultas que simplesmente girarão suas rodas para executar cópias em tabelas temporárias ou alguma classificação intermitente.

Aqui está uma amostra de variável de status para Handles

Handler_read_last : O número de solicitações para ler a última chave em um índice. Com ORDER BY, o servidor emitirá uma solicitação de primeira chave seguida por várias solicitações de próxima chave, enquanto com Com ORDER BY DESC, o servidor emitirá uma solicitação de última chave seguida por várias solicitações de chave anterior. Esta variável foi adicionada no MySQL 5.5.7.

Agora, isso não existe no MySQL 5.1.52, mas aqui está uma pergunta: Você tem consultas que executam ORDER BY ... DESC ??? Se você fizer isso, então você gostaria de ter Handler_read_last. Como você não faz, o que o MySQL faria com o ORDER BY ... DESC ??? Ele percorreria um índice inteiro para chegar à última linha, coletar as chaves e classificá-las. Há muitas consultas dessa natureza no seu aplicativo ??? ( Pergunta para sua pesquisa )

Aqui está outra variável de status para Handles:

Handler_read_first : O número de vezes a primeira entrada em um índice foi lida. Se esse valor for alto, isso sugere que o servidor está fazendo muitas varreduras de índices completas; por exemplo, SELECT col1 FROM foo, assumindo que col1 é indexado.

Outra questão para sua pesquisa : você tem muitas consultas que executam varreduras completas de índice ???

Outra especulação: confira seu open_files_limit e innodb_open_files . Talvez seja necessário aumentar um ou ambos se o limite do número de arquivos abertos estiver gerando novas alças e deixando outras alças para trás.

    
por 01.07.2011 / 20:26
2

mysqld process have over than one million handle "1,114,345"

Parece muito alto.

query take more than 15 minutes the application will consider it fail attempt although mysql still working on fetching it!

erk.

e você não tem timeout configurado para o mysql?

O que a camada lógica está fazendo? Ele usa conexões persistentes? Você pode mudar para não-persistente?

i think some of the queries have to read from mapped network drive

FFS! Se os dados precisarem existir em um servidor separado, coloque o MySQL em execução nesse servidor e use o driver federado ou a replicação de cluster. Esta é a única maneira (além do iscsi que não se presta a correr em cima de um sistema de arquivos) para fazer com que isso se comporte como um sistema bem projetado.

Depois de resolver o problema da unidade remota, recomendamos:

1) usando conexões não persistentes, se possível

2) ajuste de consulta - se todas as suas perguntas forem rápidas o suficiente, não será um problema. Eu uso alguns scripts caseiros junto com este pequeno código Perl para identificar quais necessidades funcionaram.

3) execute mysqltuner.pl contra o seu servidor (também usa perl).

Existe uma implementação de perl gratuito para MSWindows aqui

    
por 04.07.2011 / 15:05

Tags