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 gebracht 😞

    mfg
    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 war 🙄

    mfg



  • Und würdest du uns auch schlauer machen bitte!


Anmelden zum Antworten