PDA

Bekijk Volledige Versie : Hoge load Mysql



Webroy
13/11/08, 11:09
Probleempje,

Na het updaten van mysql 4 naar mysql 5 heb ik problemen.

De database draait op een eigenserver , verder niks erop.

Een php script voegt Select en update queries op de database uit.

In mysql 4 waren er meerdere mysql processen die draaide, echter in mysql 5 is dat 1 process geworden waardoor de snelheid aanzienlijk is vertraagd.

De my.cnf heb ik overgenomen uit de mysql4 versie en al wat mee geexperimenteerd.

T meesta wat mij dwars zit is waarom hij nu maar 1 mysql proces start en in mysql 4 meerdere.

Heeft 1 van jullie hier ervaring mee?

--------------------------------------------------------------------------
Hieronder mijn huidige my.cnf:

# The MySQL server
[mysqld]
set-variable=local-infile=0
safe-show-database
innodb_data_file_path=ibdata1:10M:autoextend
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
set-variable=max_connections=2000
set-variable=max_user_connections=1000
skip-locking
set-variable = key_buffer=1992M
set-variable = max_allowed_packet=1M
set-variable = table_cache=56
set-variable = sort_buffer=16M
set-variable = record_buffer=2M
set-variable = thread_cache=64
# Try number of CPU's*2 for thread_concurrency
#set-variable = thread_concurrency=2
set-variable = myisam_sort_buffer_size=256M
set-variable = interactive_timeout=10
set-variable = wait_timeout=10
#log-bin
#server-id = 1
log-slow-queries = /var/log/slow-queries.log
long_query_time = 5
#log-slow-queries =/var/log/slow-queries.log
#long_query_time = 60
old_passwords=1

# Point the following paths to different dedicated disks
#tmpdir = /tmp/
#log-update = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#set-variable = bdb_cache_size=384M
#set-variable = bdb_max_lock=100000

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql/
#innodb_log_arch_dir = /var/lib/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#set-variable = innodb_buffer_pool_size=384M
#set-variable = innodb_additional_mem_pool_size=20M
# Set .._log_file_size to 25 % of buffer pool size
#set-variable = innodb_log_file_size=100M
#set-variable = innodb_log_buffer_size=8M
#innodb_flush_log_at_trx_commit=1
#set-variable = innodb_lock_wait_timeout=50

[mysqldump]
quick
set-variable = max_allowed_packet=16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
set-variable = key_buffer=512M
set-variable = sort_buffer=512M
set-variable = read_buffer=8M
set-variable = write_buffer=2M

[myisamchk]
set-variable = key_buffer=512M
set-variable = sort_buffer=512M
set-variable = read_buffer=16M
set-variable = write_buffer=8M

[mysql.server]
user=mysql
basedir=/var/lib

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Rolie
14/11/08, 00:28
Ik neem aan dat je set-variable = thread_concurrency=2 al eens uncomment hebt?

Verder zou je kunnen proberen de MySQL-4-configuratie even achterwegen te laten en te starten met één van de standaard-configuraties (http://dev.mysql.com/doc/refman/5.0/en/option-files.html#option-files-preconfigured) die bij de huidige versie van de MySQL kwamen. Of zelfs zonder my.cnf.

johan.smits
14/11/08, 07:43
op mijn servers draait er 1 die is opgesplitst in meerdere threats.

Deze config gebruik ik:


#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /data/mysql_data
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
interactive_timeout=2000
wait_timeout=2000
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#
# * Fine Tuning
#
key_buffer = 100M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
max_connections = 200
table_cache = 64M
join_buffer_size = 3M
#thread_concurrency = 10
read_buffer_size = 1M
read_rnd_buffer_size = 4M
sort_buffer_size = 64M
thread_cache = 64
low_priority_updates = 1
#memlock = TRUE
#
# * Query Cache Configuration
#
query_cache_limit = 10M
query_cache_size = 10M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
#log = /var/log/mysql/mysql.log
#
# Error logging goes to syslog. This is a Debian improvement :)
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 5
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
log_bin = /data/mysql_data/mysql-bin.log
relay-log = /data/mysql_data/slave-relay.log
relay-log-index = /data/mysql_data/slave-relay-log.index
server-id = 10
replicate-same-server-id = 0
auto_increment_increment = 10
auto_increment_offset = 1
master-host = xxxxxxxxxxxx
master-user = xxxxxxxxxxxx
master-password = xxxxxxxxxxxx
master-connect-retry = 10
# WARNING: Using expire_logs_days without bin_log crashes the server! See README.Debian!
expire_logs_days = 10
max_binlog_size = 500M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * BerkeleyDB
#
# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.
skip-bdb
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
# You might want to disable InnoDB to shrink the mysqld process by circa 100MB.
#skip-innodb
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem



[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer = 16M

#
# * NDB Cluster
#
# See /usr/share/doc/mysql-server-*/README.Debian for more information.
#
# The following configuration is read by the NDB Data Nodes (ndbd processes)
# not from the NDB Management Nodes (ndb_mgmd processes).
#
# [MYSQL_CLUSTER]
# ndb-connectstring=127.0.0.1


#
# * IMPORTANT: Additional settings that can override those from this file!
#
!includedir /etc/mysql/conf.d/

kilobit
14/11/08, 11:45
De config op zich zecht niet zo veel.
Het ligt helemaal aan de databases en welke queries er op gedraaid worden.

Meestal kan je een aantal quick wins behalen door scriptjes als
https://launchpad.net/mysql-tuning-primer
http://wiki.mysqltuner.com/MySQLTuner
te draaien.

systemdeveloper
14/11/08, 15:59
Hebben jullie nagedacht over die configs of gewoon maar iets gedaan? Sommige waarden zijn een beetje enthousiast instesteld volgens mij. Keybuffer van 2GB en 2K connecties, table cache van 64... Gooi er gewoon eens de my-huge.cnf overheen en begin opnieuw met tunen, zou ik zeggen.

kilobit
15/11/08, 00:34
Hebben jullie nagedacht over die configs of gewoon maar iets gedaan? Sommige waarden zijn een beetje enthousiast instesteld volgens mij. Keybuffer van 2GB en 2K connecties, table cache van 64...


Keybuffer van 2GB is niks mis mee als je 2GB aan indexes hebt..
Zelfde geldt voor de andere waarden, zou precies goed kunnen zijn.

Maar zoals ik eerder aangaf kunnen de genoemde tools precies aangeven welke waarden evt beter zouden passen...

systemdeveloper
15/11/08, 01:21
Keybuffer van 2GB is niks mis mee als je 2GB aan indexes hebt..
Zelfde geldt voor de andere waarden, zou precies goed kunnen zijn.

Maar zoals ik eerder aangaf kunnen de genoemde tools precies aangeven welke waarden evt beter zouden passen...
Inderdaad, alles kan... maar als je slow queries logt vanaf 5 seconden, dan is dat een setting die het je onmogelijk maakt om te tunen. In het geval dat er queries zijn die 5 seconden zouden duren op een systeem met 2K mogelijke gelijktijdige verbindingen... dan heb je toch een mega probleem.
Maar je hebt hier met myisam te maken wat op filesystem nivo ook nog geheugen gebruikt om het zooitje te cachen.
Wat server en db specs zouden iderdaad handig zijn. Als die server niet minimaal 4gb aan boord heeft op liefst een 64 bits os, dan is de kans groot dat ie even iets moet swappen en daardoor de load omhoog knalt.

@TS
Het hebben van maar 1 process is overigens geen probleem. Indien je echt wilt kun je linux_threads installeren en mysqld hercompileren. Dan heb je meerdere processen. Maar ik denk niet dat dit nodig is.

Misschien is je database gewoon iets groter geworden en beginnen bad queries zich te wreken met geheugen vretende joins/group by's.
Ideaal moment om je in de triggers van mysql 5 te verdiepen :)

download tuning_primer.sh of mysqltuner.pl en see what's happening :)

johan.smits
15/11/08, 13:24
De waardes zijn goed gekozen, je kunt ze prima tunen met de tools zoals hierboven vermeld.
Heb je nog steeds de load?
In phpmyadmin wat zie je onder actieve processen? Hier komen er een hoop in staan of veel waiting op lock etc....
Controleer dit ook eens.

Webroy
17/11/08, 15:39
Bedankt voor de Feedback,

Ik heb de settings die ik heb gepost uiteraard in verschillende waardes geprobeerd, echter deze my.cnf was volledig getest op 4 en niet op 5.

ik ga ermee stoeien en zal de oplossing als die gevonden wordt posten.

Webroy
25/11/08, 10:26
De oplossing was om de tabellen waar de select queries op werden uitgevoerd te indexeren.

Bedankt voor t meedenken.

Ramon Fincken
25/11/08, 12:10
w00t !!

dat is toch wat je in het ontwerp deel al doet?
maarja mooi dat het weer wat soepeler loopt

Webroy
25/11/08, 13:46
@ Ramon.

Ja dat klopt helemaal, echter liep t zonder index goed op mysql 4 , na de migratie op mysql 5 begonnen de problemen en is er een index op de tabel geplaatst waardoor de load op de nieuwe server afnam.

Dus op mysql4 niet nodig mysql 5 wel.