MySQL 4.0 auf Debian Sarge und mehr Prozesse
-
Ich habe ein verzwicktes Problem mit MySQL. Seit Sarge erzeugt MySQL nur noch
einen einzigen mysqld-Prozess. Ich möchte gern mehr Prozesse starten lassen, nur
wie. Früher waren per Default immer mindestens 5 mysqld.
Wo ist der Schalter für dieses Verhalten.
Vielen Dank für die Antworten.
-
in der my.cnf bzw. my.ini
-
Hab ich leider schon geschaut. Welche Direktive ist es?
Leider übersieht man vor Verzweiflung eine Menge
Danke schonmal.
-
Wie kommst du darauf das mehr Prozesse laufen. Es ist nur einer. Hier geht es dann um Threads.
thread_concurrency =
Wert CPUS*2
-
Mal ein Auszug aus pstree:
Vorher:
|-mysqld_safe-+-logger | `-mysqld---mysqld---2*[mysqld]
Nachher:
|-mysqld_safe-+-logger | `-mysqld
Ich habe seitdem Lastprobleme, da dieser eine Prozess nun alle Abfragen behandeln muss. Früher wurde es offensichtlich aufgeteilt.
Der Server lief weitaus ruhiger.
-
poste mal
pstree -a
-
Hallo, danke erstmal:
Nachher:
+-mysqld_safe /usr/bin/mysqld_safe | `-mysqld_safe /usr/bin/mysqld_safe | +-logger -p daemon.err -t mysqld_safe -i -t mysqld | `-mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid ...
Vorher:
|-mysqld_safe) /usr/bin/mysqld_safe | |-logger) -p daemon.err -t mysqld_safe -i -t mysqld | `-mysqld) --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking --port=33 | `-mysqld) --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking ... | |-mysqld) --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid ... | `-mysqld) --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid ...
Der Maintainer des Paketes Christian Hammers schrieb mir, das wohl an der Darstellung etwas geändert wurde. Aber Fakt ist, dass ich die Prozesse
vorher auch in der Liste hatte, jetzt nur noch einen. Ich stehe jedenfalls noch in Kontakt mit ihm. Hast du eventuell eine Lösung?
Prinzipiell ist das ja nicht störend, aber er teilt die Last nicht mehr auf die CPUs auf (auch mit thread_concurrency).
-
IMHO habe ich noch nie gehört das mehrere mysqld laufen. zumindest nicht auf einem Port.
Man kann mehrere laufen lassen aber dann auf unterschiedlichen Ports und Datadirs.Es können ja nicht > 1 gleichzeitig auf Port 3306 lauschen.
mysql macht dies alles mit Threads.
Ich habe hier ein XEON 2.7 GHZ * 4 System und so keine Probleme.
Nicht mysql teilt auf sondern der Kernel teilt die Threads auf die CPU`s auf.Poste bitte mal die Datei mysql aus /etc/init.d/
Wenn dann wird dort was gestartet.
-
Das hat ja garnichts mit Port 3306 zu tun. Schliesslich bietet MySQL seine
Dienste auch per Unix-Socket an.
Apache httpd hat ja ebenfalls viele Childs, wobei das ja wieder reines TCP/IP ist.
-
Nein. MySQL bietet seine Dienste nur als UNIX-Socket an wenn die Verbindung von local kommt. Dies deshalb weil der locale Client zufriff auf die Socketdatei hat.
Ich sagte ja. Poste bitte die startdatei aus der init.d.
Ich kann mir nicht vorstellen das mehrere mysqld gelaufen sind. Es kann aber sein das mehrere Kindprozesse gestertet wurden.
http://dev.mysql.com/doc/mysql/de/multiple-servers.html
http://dev.mysql.com/doc/mysql/de/installing-many-servers.html
-
ºgrimmsenº schrieb:
Ich habe seitdem Lastprobleme, da dieser eine Prozess nun alle Abfragen behandeln muss. Früher wurde es offensichtlich aufgeteilt.
Der Server lief weitaus ruhiger.Das hört sich an als könnte der key_buffer zu klein sein:
http://dev.mysql.com/doc/mysql/en/server-parameters.html
-
@geeky: Der hat derzeit eine Größe von 16MB. Hier mal der Status
Uptime: 6871 Threads: 3 Questions: 358569 Slow queries: 9 Opens: 39321 Flush tables: 1 Open tables: 64 Queries per second avg: 52.186
Glaube aber nicht, dass das zu wenig ist.
Hier die /etc/init.d/mysql
#!/bin/bash # # MySQL daemon start/stop script. # # Debian version. Based on the original by TcX. # set -e set -u ${DEBIAN_SCRIPT_DEBUG:+ set -v -x} test -x /usr/sbin/mysqld || exit 0 SELF=$(cd $(dirname $0); pwd -P)/$(basename $0) CONF=/etc/mysql/my.cnf MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf" RUNDIR=/var/run/mysqld/ # priority can be overriden and "-s" adds output to stderr ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i" # Safeguard (relative paths, core dumps..) cd / umask 077 export PATH=/bin:/usr/bin # mysqladmin likes to read /root/.my.cnf. This is usually not what I want # as many admins e.g. only store a password without a username there and # so break my scripts. export HOME=/etc/mysql/ ## fetch a particular option from mysql's invocation # # usage: void mysqld_get_param option mysqld_get_param() { /usr/sbin/mysqld --print-defaults \ | tr " " "\n" \ | grep -- "--$1" \ | tail -n 1 \ | cut -d= -f2 } ## Checks if there is a server running and if so if it is accessible. # # check_alive insists on a pingable server # check_dead also fails if there is a lost mysqld in the process list # # Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn] mysqld_status () { ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? )) ps_alive=0 pidfile=`mysqld_get_param pid-file` if [ -f "$pidfile" ]; then if ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi fi if [ "$1" = "check_alive" -a $ping_alive = 1 ] || [ "$1" = "check_dead" -a $ping_alive = 0 -a $ps_alive = 0 ]; then return 0 # EXIT_SUCCESS else if [ "$2" = "warn" ]; then /bin/echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug fi return 1 # EXIT_FAILURE fi } # # main() # case "${1:-''}" in 'start') # check for config file if [ ! -r $CONF ]; then /bin/echo -e "\nWARNING: $CONF cannot be read. See README.Debian." fi # check for /var/run/mysqld/ which maybe have only been on a tempfs if [ ! -d $RUNDIR ]; then install --directory --owner=mysql --mode=755 $RUNDIR fi # Start daemon echo -n "Starting MySQL database server: mysqld" if mysqld_status check_alive nowarn; then echo "...already running." else /usr/bin/mysqld_safe > /dev/null 2>&1 & for i in 1 2 3 4 5 6; do sleep 1 if mysqld_status check_alive nowarn ; then break; fi done if mysqld_status check_alive warn; then echo "." # Now start mysqlcheck or whatever the admin wants. /etc/mysql/debian-start else echo "...failed." /bin/echo -e "\tPlease take a look at the syslog." fi fi if $MYADMIN variables | egrep -q have_bdb.*YES; then /bin/echo "BerkeleyDB is obsolete, see /usr/share/doc/mysql-server/README.Debian.gz" | $ERR_LOGGER -p daemon.info fi ln -s /var/run/mysql/mysqld.sock /tmp/mysql.sock ;; 'stop') # * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible # at least for cron, we can rely on it here, too. (although we have # to specify it explicit as e.g. sudo environments points to the normal # users home and not /root) echo -n "Stopping MySQL database server: mysqld" if ! mysqld_status check_dead nowarn; then set +e shutdown_out=`$MYADMIN shutdown 2>&1`; r=$? set -e if [ "$r" -ne 0 ]; then /bin/echo -e -n "...failed.\n$shutdown_out\nKilling MySQL database server by signal: mysqld" killall -15 mysqld server_down= for i in 1 2 3 4 5 6 7 8 9 10; do sleep 1 if mysqld_status check_dead nowarn; then server_down=1; break; fi done if test -z "$server_down"; then killall -9 mysqld; fi fi fi if ! mysqld_status check_dead warn; then echo "...failed." echo "Please stop MySQL manually and read /usr/share/doc/mysql-server/README.Debian!" exit -1 else echo "." fi ;; 'restart') set +e; $SELF stop; set -e $SELF start ;; 'reload'|'force-reload') echo -n "Reloading MySQL database server: mysqld" $MYADMIN reload echo "." ;; 'status') if mysqld_status check_alive nowarn; then $MYADMIN version else echo "MySQL is stopped." fi ;; *) echo "Usage: $SELF start|stop|restart|reload|force-reload" exit 1 ;; esac
-
Ich sehen auch hier das mysqld nur einmal gestartet wird.
-
Der eigentliche mysqld wird ja von mysqld_safe gestartet. Ich versteh das alles
nicht mehr.
Wieso habe ich vorher mehr gehabt. Es muss doch einen Grund dafür geben.
Ich werde weiter forschen.
-
mysqlsave macht nicht anderes als bei beenden von mysqld diesen neu zu starten und noch einge andere Dinge.
Wenn Du mehr weißt bitte hier dann Mitteilen. Würde auch gerene Wissen ob es möglich ist obwohl ich in der MySQL-Docu nichts gefunden habe.
Apache startet übrigens mehrere Childprozesse. Deshalb sieht man da mehr. Zumindest < Apache 2. In Apache 2 haben sie ja nun Threads.
Es kann aber trotzdem nur einer eine Verbindung entgegennehmen.
-
das gleiche habe ich hier auch
2 xeons und so wie das aussieht wird nur 1 virtuelle der 4 cpu´s genutzt
auch stundenlanges googlen hat mich bis jetzt noch nicht weiter gebrachtmfg
holger
-
Welches Betriebssystem?
-
debian sarge
kernel 2.6.11-1-686-smp
mfg
-
tja problem gelöst kann man da nur sagen
wobei es garkeins warmfg
-
Und würdest du uns auch schlauer machen bitte!