MySQL nutzt nur eine CPU

MySQL, PostgreSQL, SQLite
exception
Posts: 8
Joined: 2004-08-17 13:31

MySQL nutzt nur eine CPU

Post by exception » 2006-02-14 18:40

Auf einem Mehrprozessor-System nutzt mysql nur eine CPU (erkennbar daran dass CPU 99% ist):

Code: Select all

Tasks: 416 total,   1 running, 415 sleeping,   0 stopped,   0 zombie
 Cpu0 : 50.7% us, 11.5% sy,  0.0% ni, 26.3% id,  9.5% wa,  0.3% hi,  1.6% si
 Cpu1 : 47.7% us, 11.9% sy,  0.0% ni, 32.5% id,  6.3% wa,  0.7% hi,  1.0% si
 Cpu2 : 52.1% us, 12.1% sy,  0.0% ni, 32.8% id,  1.6% wa,  0.7% hi,  0.7% si
 Cpu3 : 53.8% us, 13.6% sy,  0.0% ni, 29.2% id,  2.7% wa,  0.0% hi,  0.7% si
Mem:   2073952k total,  2019012k used,    54940k free,    64716k buffers
Swap:  1028148k total,        0k used,  1028148k free,  1191652k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13261 mysql     16   0  273m 158m 5340 S 99.9  7.8 307:07.63 mysqld
20468 daemon    15   0 25444  10m 7504 S  1.6  0.5   0:09.28 httpd

Es läuft auch lediglich ein MySQL-Prozess:

Code: Select all

ps -e|grep mysql
13224 pts/0    00:00:00 mysqld_safe
13261 pts/0    05:09:28 mysqld
Der Kernel ist mit SMP kompiliert, müsste also in der Lage sein, alle CPUs auszunutzen.

MySQL-Version ist 4.1.11-Debian_4sarge2-log

Liegt das Problem eher am Kernel (wurde vom Provider kompiliert) oder eher an MySQL bzw. wie kann man MySQL dazu bringen alle CPUs zu nutzen.

edit: SHOW VARIABLES liefert

Code: Select all

+---------------------------------+----------------------------------------------------------+
| Variable_name                   | Value                                                    |
+---------------------------------+----------------------------------------------------------+
| back_log                        | 50                                                       |
| basedir                         | /usr/                                                    |
| bdb_cache_size                  | 8388600                                                  |
| bdb_home                        |                                                          |
| bdb_log_buffer_size             | 0                                                        |
| bdb_logdir                      |                                                          |
| bdb_max_lock                    | 10000                                                    |
| bdb_shared_data                 | OFF                                                      |
| bdb_tmpdir                      |                                                          |
| binlog_cache_size               | 32768                                                    |
| bulk_insert_buffer_size         | 8388608                                                  |
| character_set_client            | latin1                                                   |
| character_set_connection        | latin1                                                   |
| character_set_database          | latin1                                                   |
| character_set_results           | latin1                                                   |
| character_set_server            | latin1                                                   |
| character_set_system            | utf8                                                     |
| character_sets_dir              | /usr/share/mysql/charsets/                               |
| collation_connection            | latin1_swedish_ci                                        |
| collation_database              | latin1_swedish_ci                                        |
| collation_server                | latin1_swedish_ci                                        |
| concurrent_insert               | ON                                                       |
| connect_timeout                 | 5                                                        |
| datadir                         | /var/lib/mysql/                                          |
| date_format                     | %Y-%m-%d                                                 |
| datetime_format                 | %Y-%m-%d %H:%i:%s                                        |
| default_week_format             | 0                                                        |
| delay_key_write                 | ON                                                       |
| delayed_insert_limit            | 100                                                      |
| delayed_insert_timeout          | 300                                                      |
| delayed_queue_size              | 1000                                                     |
| expire_logs_days                | 0                                                        |
| flush                           | OFF                                                      |
| flush_time                      | 0                                                        |
| ft_boolean_syntax               | + -><()~*:""&|                                           |
| ft_max_word_len                 | 84                                                       |
| ft_min_word_len                 | 4                                                        |
| ft_query_expansion_limit        | 20                                                       |
| ft_stopword_file                | (built-in)                                               |
| group_concat_max_len            | 1024                                                     |
| have_archive                    | YES                                                      |
| have_bdb                        | DISABLED                                                 |
| have_blackhole_engine           | NO                                                       |
| have_compress                   | YES                                                      |
| have_crypt                      | YES                                                      |
| have_csv                        | YES                                                      |
| have_example_engine             | NO                                                       |
| have_geometry                   | YES                                                      |
| have_innodb                     | YES                                                      |
| have_isam                       | YES                                                      |
| have_ndbcluster                 | DISABLED                                                 |
| have_openssl                    | NO                                                       |
| have_query_cache                | YES                                                      |
| have_raid                       | YES                                                      |
| have_rtree_keys                 | YES                                                      |
| have_symlink                    | YES                                                      |
| init_connect                    |                                                          |
| init_file                       |                                                          |
| init_slave                      |                                                          |
| innodb_additional_mem_pool_size | 1048576                                                  |
| innodb_autoextend_increment     | 128                                                      |
| innodb_buffer_pool_awe_mem_mb   | 0                                                        |
| innodb_buffer_pool_size         | 8388608                                                  |
| innodb_data_file_path           | ibdata1:10M:autoextend                                   |
| innodb_data_home_dir            |                                                          |
| innodb_fast_shutdown            | ON                                                       |
| innodb_file_io_threads          | 4                                                        |
| innodb_file_per_table           | OFF                                                      |
| innodb_flush_log_at_trx_commit  | 1                                                        |
| innodb_flush_method             |                                                          |
| innodb_force_recovery           | 0                                                        |
| innodb_lock_wait_timeout        | 50                                                       |
| innodb_locks_unsafe_for_binlog  | OFF                                                      |
| innodb_log_arch_dir             |                                                          |
| innodb_log_archive              | OFF                                                      |
| innodb_log_buffer_size          | 1048576                                                  |
| innodb_log_file_size            | 5242880                                                  |
| innodb_log_files_in_group       | 2                                                        |
| innodb_log_group_home_dir       | ./                                                       |
| innodb_max_dirty_pages_pct      | 90                                                       |
| innodb_max_purge_lag            | 0                                                        |
| innodb_mirrored_log_groups      | 1                                                        |
| innodb_open_files               | 300                                                      |
| innodb_table_locks              | ON                                                       |
| innodb_thread_concurrency       | 8                                                        |
| interactive_timeout             | 28800                                                    |
| join_buffer_size                | 131072                                                   |
| key_buffer_size                 | 67108864                                                 |
| key_cache_age_threshold         | 300                                                      |
| key_cache_block_size            | 1024                                                     |
| key_cache_division_limit        | 100                                                      |
| language                        | /usr/share/mysql/english/                                |
| large_files_support             | ON                                                       |
| license                         | GPL                                                      |
| local_infile                    | ON                                                       |
| locked_in_memory                | OFF                                                      |
| log                             | OFF                                                      |
| log_bin                         | ON                                                       |
| log_error                       |                                                          |
| log_slave_updates               | OFF                                                      |
| log_slow_queries                | OFF                                                      |
| log_update                      | OFF                                                      |
| log_warnings                    | 1                                                        |
| long_query_time                 | 10                                                       |
| low_priority_updates            | OFF                                                      |
| lower_case_file_system          | OFF                                                      |
| lower_case_table_names          | 0                                                        |
| max_allowed_packet              | 16776192                                                 |
| max_binlog_cache_size           | 4294967295                                               |
| max_binlog_size                 | 104857600                                                |
| max_connect_errors              | 10                                                       |
| max_connections                 | 500                                                      |
| max_delayed_threads             | 20                                                       |
| max_error_count                 | 64                                                       |
| max_heap_table_size             | 16777216                                                 |
| max_insert_delayed_threads      | 20                                                       |
| max_join_size                   | 4294967295                                               |
| max_length_for_sort_data        | 1024                                                     |
| max_relay_log_size              | 0                                                        |
| max_seeks_for_key               | 4294967295                                               |
| max_sort_length                 | 1024                                                     |
| max_tmp_tables                  | 32                                                       |
| max_user_connections            | 0                                                        |
| max_write_lock_count            | 4294967295                                               |
| myisam_data_pointer_size        | 4                                                        |
| myisam_max_extra_sort_file_size | 2147483648                                               |
| myisam_max_sort_file_size       | 2147483647                                               |
| myisam_recover_options          | OFF                                                      |
| myisam_repair_threads           | 1                                                        |
| myisam_sort_buffer_size         | 8388608                                                  |
| ndb_autoincrement_prefetch_sz   | 32                                                       |
| ndb_force_send                  | ON                                                       |
| ndb_use_exact_count             | ON                                                       |
| ndb_use_transactions            | ON                                                       |
| net_buffer_length               | 16384                                                    |
| net_read_timeout                | 30                                                       |
| net_retry_count                 | 10                                                       |
| net_write_timeout               | 60                                                       |
| new                             | OFF                                                      |
| old_passwords                   | ON                                                       |
| open_files_limit                | 2510                                                     |
| pid_file                        | /var/run/mysqld/mysqld.pid                               |
| port                            | 3306                                                     |
| preload_buffer_size             | 32768                                                    |
| protocol_version                | 10                                                       |
| query_alloc_block_size          | 8192                                                     |
| query_cache_limit               | 1048576                                                  |
| query_cache_min_res_unit        | 4096                                                     |
| query_cache_size                | 33554432                                                 |
| query_cache_type                | ON                                                       |
| query_cache_wlock_invalidate    | OFF                                                      |
| query_prealloc_size             | 8192                                                     |
| range_alloc_block_size          | 2048                                                     |
| read_buffer_size                | 1044480                                                  |
| read_only                       | OFF                                                      |
| read_rnd_buffer_size            | 520192                                                   |
| relay_log_purge                 | ON                                                       |
| relay_log_space_limit           | 0                                                        |
| rpl_recovery_rank               | 0                                                        |
| secure_auth                     | OFF                                                      |
| server_id                       | 1                                                        |
| skip_external_locking           | ON                                                       |
| skip_networking                 | OFF                                                      |
| skip_show_database              | OFF                                                      |
| slave_net_timeout               | 3600                                                     |
| slave_transaction_retries       | 0                                                        |
| slow_launch_time                | 2                                                        |
| socket                          | /var/run/mysqld/mysqld.sock                              |
| sort_buffer_size                | 2097144                                                  |
| sql_mode                        |                                                          |
| storage_engine                  | MyISAM                                                   |
| sql_notes                       | ON                                                       |
| sql_warnings                    | ON                                                       |
| sync_binlog                     | 0                                                        |
| sync_replication                | 0                                                        |
| sync_replication_slave_id       | 0                                                        |
| sync_replication_timeout        | 0                                                        |
| sync_frm                        | ON                                                       |
| system_time_zone                | CET                                                      |
| table_cache                     | 128                                                      |
| table_type                      | MyISAM                                                   |
| thread_cache_size               | 0                                                        |
| thread_stack                    | 131072                                                   |
| time_format                     | %H:%i:%s                                                 |
| time_zone                       | SYSTEM                                                   |
| tmp_table_size                  | 33554432                                                 |
| tmpdir                          | /tmp                                                     |
| transaction_alloc_block_size    | 8192                                                     |
| transaction_prealloc_size       | 4096                                                     |
| tx_isolation                    | REPEATABLE-READ                                          |
| version                         | 4.1.11-Debian_4sarge2-log                                |
| version_bdb                     | Sleepycat Software: Berkeley DB 4.1.24: (April  1, 2005) |
| version_comment                 | Source distribution                                      |
| version_compile_machine         | i386                                                     |
| version_compile_os              | pc-linux-gnu                                             |
| wait_timeout                    | 28800                                                    |
+---------------------------------+----------------------------------------------------------+

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL nutzt nur eine CPU

Post by isotopp » 2006-02-15 08:52

exception wrote:Auf einem Mehrprozessor-System nutzt mysql nur eine CPU (erkennbar daran dass CPU 99% ist):
mysqld ist ein Prozeß, verwendet aber mehrere Threads. Threads können mehr als eine CPU belegen, ein Thread verwendet aber immer nur eine CPU.

Eine einzelne Query wird also nur auf einer CPU ausgeführt.

Das wird sich erst mit 5.1 und PARTITIONS ändern.

exception
Posts: 8
Joined: 2004-08-17 13:31

Re: MySQL nutzt nur eine CPU

Post by exception » 2006-02-15 17:56

isotopp wrote:
exception wrote:Auf einem Mehrprozessor-System nutzt mysql nur eine CPU (erkennbar daran dass CPU 99% ist):
mysqld ist ein Prozeß, verwendet aber mehrere Threads. Threads können mehr als eine CPU belegen, ein Thread verwendet aber immer nur eine CPU.

Eine einzelne Query wird also nur auf einer CPU ausgeführt.

Das wird sich erst mit 5.1 und PARTITIONS ändern.
Schonmal vielen Dank für deine Antwort, es werden aber parallele Queries abgesendet.

Die Queries kommen parallel von verschiedenen Apache-Instanzen (mpm: prefork) an. Laut MySQL Prozesslist existieren auch jede Menge parallele MySQL-Anfragen (manchmal sind einige gelockt, dies würde aber kaum erklären warum oft genau 99% als CPU-Last angezeigt wird).

Das Problem ist, dass ich im Moment nicht über 2000 Queries pro Sekunde komme, da scheinbar nur eine CPU genutzt wird.

Kann es vielleicht sein, dass der Kernel zwar mehrere Prozesse parallel ausführen kann, mehrere Threads aber nicht? Werde nochmal versuchen weitere Informationen zu dem Thema zu bekommen.

Oder erstellt MySQL vielleicht nur einen Thread? Wie kann ich die Anzahl der Prozesse eines Threads anzeigen (ich gleich mal in man ps nach, nur falls jemand die Antwort weiß, kanns ja nicht schaden ;-) )

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL nutzt nur eine CPU

Post by isotopp » 2006-02-15 18:23

exception wrote:Die Queries kommen parallel von verschiedenen Apache-Instanzen (mpm: prefork) an. Laut MySQL Prozesslist existieren auch jede Menge parallele MySQL-Anfragen (manchmal sind einige gelockt, dies würde aber kaum erklären warum oft genau 99% als CPU-Last angezeigt wird).
MyISAM-Tables, die Queries schreiben? Was sagt SHOW STATUS zu table_locks_waiting und table_locks_immediate?
Oder erstellt MySQL vielleicht nur einen Thread?
SHOW PROCESSLIST zeigt die Threads, und was sie machen. SHOW STATUS zeigt in threads_running die laufenden Threads an, in threads_coinnected die bestehenden verbundenen Threads und in threads_cached die Anzahl der bereitstehenden Idle-Threads.


Du hast wahrscheinlich konkurrierende Zugriffe auf dieselbe Tabelle, einige davon schreibend, und die Table Locks von MyISAM bremsen Dich aus.

exception
Posts: 8
Joined: 2004-08-17 13:31

Re: MySQL nutzt nur eine CPU

Post by exception » 2006-02-15 19:49

Ich glaube ich habe die Ausgabe von Top falsch interpretiert. Was genau der Wert 99,9% bei top bedeudet und warum CPU teilweise idle ist, müsste ich noch genauer untersuchen.

Relativ sicher bin ich mir jedenfalls, dass MySQL doch alle CPUs ausnutzt. Auf einem vergleichbaren Testsystem habe ich Prozesse gestartet, die jeweils den MySQL-Server mit Queries füttern. Die Queries waren

Code: Select all

SELECT BENCHMARK(10000,ENCODE('hello','goodbye'))
um ausschließlich CPU-Last zu erzeugen.

Bei 1 Prozess konnten ca. 200 Queries pro Sekunde ausgeführt werden. MySQL-CPU in top war 99,9%

Bei 4 Prozessen konnten ca. 800 Queries pro Sekunde ausgeführt werden.
MySQL-CPU in top war weiterhin 99,9% (hier hätte ich eigentlich 399,9% erwartet)

Dann muss ich mal weiter schauen wodran es liegt, dass wie oben angegeben CPU nicht zu 100% ausgelastet werden kann.
Zuwenig RAM oder zu langsame Festplatten habe ich im Verdacht.

table_locks_waiting sind auf dem Produktivserver ca. 5% von table_locks_immediate. Es kommt also zu table_locks_waiting aber doch eher selten.

threads_running ist meist zwischen 1 und 10. Mittelwert etwa 3-4

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL nutzt nur eine CPU

Post by isotopp » 2006-02-16 09:25

exception wrote:table_locks_waiting sind auf dem Produktivserver ca. 5% von table_locks_immediate. Es kommt also zu table_locks_waiting aber doch eher selten.
5% bei 2000qps ist nicht selten, sondern katastrophal, nämlich 1/20 von 2000, also 100 verlangsamte Queries pro Sekunde.

Finde die Tabellen, die bei Dir Update-Heavy sind, bzw. auf denen Table_locks_waiting stattfindet und ALTER TABLE x ENGINE=innodb diese. Wird es dann besser? Beachte daß sich dadurch Deine Anforderungen an die Speicheraufteilung ändern - innodb_buffer_pool_size muß passend gesetzt werden, und die innodb_log_file_size sollte auch passend erhöht werden. Die Concurrentcy in innodb setzt man besser von 8 auf 4 runter.

flo
Posts: 2223
Joined: 2002-07-28 13:02
Location: Berlin

Re: MySQL nutzt nur eine CPU

Post by flo » 2006-02-16 09:32

Nicht zu vergessen, der Tablespace ... der Standard reicht gerade mal für eine Datenbankstruktur ... das hat mich vorgestern ein paar Minuten meiner Nacht gekostet :-)

flo.