Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MYSQL] grote insert/delete beinvloed alle db's

Pagina: 1
Acties:

  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Situatie:
OS: Ubuntu Server 12.04.3 LTS (x86_64)
CPU: 2x Xeon X5620 (8 cores, 16 threads)
RAM: 32 GB
Storage: 6x SSD Intel, hardware RAID-5, geen TRIM

DB: MySQL 5.5.31 (1 instantie) met master/slave replicatie

In de MySQL instantie zitten zo'n 150 databases met elk zo'n 50 tabellen die overwegend van het myisam type zijn. Per database zijn er 4 merge tabellen met ~20 onderliggende tabellen waarin meerdere gigabytes aan data zit. Er worden concurrent selects, updates en inserts gedaan op alle databases met zo'n 500 connecties. CPU gebruik varieert normaal tussen 200 en 300% (van de 1600%) en de schrijfactiviteit is zo'n 2 MB/s met uitschieters naar 20 MB/s.

Probleem: wanneer voor onderhoud één hele grote insert of delete van een paar miljoen records in één myisam (merge) tabel gebeurt vertragen ook andere databases in dezelfde MySQL instantie gigantisch, zodanig dat er allemaal queries open blijven in verschillende standen van 'waiting for table lock' tot 'sending data' en de bijbehorende applicaties lijken te hangen.

We krijgen maar geen gevoel van waar nu de bottleneck zit. Uit o.a. Munin/top/iotop etc. lijkt de hardware nauwelijks belast. CPU gebruik komt niet boven de 500% (van de beschikbare 1600%) uit en disk-utilization nauwelijks boven de 10%. Het lijkt wel alsof er ergens een soort van global lock is maar uren zoeken naar informatie levert maar weinig op tot dusver. Misschien dat een MySQL guru een tip heeft?

Globale status variabelen:
Aborted_clients23560
Aborted_connects3790624
Binlog_cache_disk_use1
Binlog_cache_use731357939
Binlog_stmt_cache_disk_use0
Binlog_stmt_cache_use1918221567
Bytes_received4201506597427
Bytes_sent10056106128918
Com_admin_commands148624399
Com_assign_to_keycache0
Com_alter_db2
Com_alter_db_upgrade0
Com_alter_event0
Com_alter_function0
Com_alter_procedure0
Com_alter_server0
Com_alter_table3146
Com_alter_tablespace0
Com_analyze1
Com_begin2136913
Com_binlog0
Com_call_procedure0
Com_change_db921048559
Com_change_master0
Com_check1
Com_checksum0
Com_commit2137487
Com_create_db20
Com_create_event0
Com_create_function0
Com_create_index0
Com_create_procedure3
Com_create_server0
Com_create_table4010
Com_create_trigger47
Com_create_udf0
Com_create_user0
Com_create_view381
Com_dealloc_sql16421510
Com_delete235894451
Com_delete_multi0
Com_do0
Com_drop_db7
Com_drop_event0
Com_drop_function0
Com_drop_index0
Com_drop_procedure6
Com_drop_server0
Com_drop_table1998
Com_drop_trigger41
Com_drop_user0
Com_drop_view1
Com_empty_query0
Com_execute_sql108956733
Com_flush151
Com_grant9
Com_ha_close0
Com_ha_open0
Com_ha_read0
Com_help924
Com_insert1626905233
Com_insert_select69977
Com_install_plugin0
Com_kill285
Com_load0
Com_lock_tables184
Com_optimize25
Com_preload_keys0
Com_prepare_sql34393528
Com_purge110
Com_purge_before_date0
Com_release_savepoint0
Com_rename_table7
Com_rename_user0
Com_repair16
Com_replace209959745
Com_replace_select9293
Com_reset0
Com_resignal0
Com_revoke0
Com_revoke_all0
Com_rollback114
Com_rollback_to_savepoint0
Com_savepoint0
Com_select2824508061
Com_set_option415019757
Com_signal0
Com_show_authors0
Com_show_binlog_events32
Com_show_binlogs21846
Com_show_charsets11660
Com_show_collations11684
Com_show_contributors0
Com_show_create_db257
Com_show_create_event0
Com_show_create_func0
Com_show_create_proc0
Com_show_create_table9682039
Com_show_create_trigger0
Com_show_databases13791
Com_show_engine_logs0
Com_show_engine_mutex0
Com_show_engine_status20206
Com_show_events66
Com_show_errors0
Com_show_fields113466111
Com_show_function_status442
Com_show_grants4717
Com_show_keys26285
Com_show_master_status8593
Com_show_open_tables408
Com_show_plugins150
Com_show_privileges0
Com_show_procedure_status442
Com_show_processlist1248
Com_show_profile0
Com_show_profiles0
Com_show_relaylog_events0
Com_show_slave_hosts8
Com_show_slave_status45254
Com_show_status110104
Com_show_storage_engines83
Com_show_table_status21285452
Com_show_tables46167269
Com_show_triggers21129795
Com_show_variables68857
Com_show_warnings1740
Com_slave_start1
Com_slave_stop0
Com_stmt_close16429152
Com_stmt_execute108964433
Com_stmt_fetch0
Com_stmt_prepare34401221
Com_stmt_reprepare60
Com_stmt_reset0
Com_stmt_send_long_data0
Com_truncate75
Com_uninstall_plugin0
Com_unlock_tables184
Com_update704661623
Com_update_multi3
Com_xa_commit0
Com_xa_end0
Com_xa_prepare0
Com_xa_recover0
Com_xa_rollback0
Com_xa_start0
CompressionON
Connections75500470
Created_tmp_disk_tables134712889
Created_tmp_files512
Created_tmp_tables237307920
Delayed_errors0
Delayed_insert_threads0
Delayed_writes3948536
Flush_commands20
Handler_commit5498668569
Handler_delete1686266767
Handler_discover0
Handler_prepare1397810522
Handler_read_first2648631657
Handler_read_key718801292800
Handler_read_last103903
Handler_read_next2321299428692
Handler_read_prev414989269
Handler_read_rnd2328188793
Handler_read_rnd_next655123849822
Handler_rollback47683517
Handler_savepoint0
Handler_savepoint_rollback0
Handler_update5356528656
Handler_write24589814483
Innodb_buffer_pool_pages_data8116
Innodb_buffer_pool_bytes_data132972544
Innodb_buffer_pool_pages_dirty409
Innodb_buffer_pool_bytes_dirty6701056
Innodb_buffer_pool_pages_flushed84187184
Innodb_buffer_pool_pages_free3
Innodb_buffer_pool_pages_misc73
Innodb_buffer_pool_pages_total8192
Innodb_buffer_pool_read_ahead_rnd0
Innodb_buffer_pool_read_ahead62922657
Innodb_buffer_pool_read_ahead_evicted8419149
Innodb_buffer_pool_read_requests1242884663924
Innodb_buffer_pool_reads892842391
Innodb_buffer_pool_wait_free0
Innodb_buffer_pool_write_requests5346913816
Innodb_data_fsyncs1404330839
Innodb_data_pending_fsyncs0
Innodb_data_pending_reads0
Innodb_data_pending_writes0
Innodb_data_read15674187976704
Innodb_data_reads896017765
Innodb_data_writes1435654990
Innodb_data_written3784076752896
Innodb_dblwr_pages_written84187184
Innodb_dblwr_writes6030605
Innodb_have_atomic_builtinsON
Innodb_log_waits0
Innodb_log_write_requests620741395
Innodb_log_writes1388375889
Innodb_os_log_fsyncs1389319829
Innodb_os_log_pending_fsyncs0
Innodb_os_log_pending_writes0
Innodb_os_log_written1024934576128
Innodb_page_size16384
Innodb_pages_created7541814
Innodb_pages_read956676423
Innodb_pages_written84187184
Innodb_row_lock_current_waits0
Innodb_row_lock_time177849376
Innodb_row_lock_time_avg84
Innodb_row_lock_time_max51985
Innodb_row_lock_waits2099389
Innodb_rows_deleted1207980
Innodb_rows_inserted67036769
Innodb_rows_read1415992390542
Innodb_rows_updated684761741
Innodb_truncated_status_writes0
Key_blocks_not_flushed0
Key_blocks_unused3264923
Key_blocks_used3429472
Key_read_requests734608775025
Key_reads160986623
Key_write_requests13227418349
Key_writes4826974724
Last_query_cost0
Max_used_connections2175
Not_flushed_delayed_rows0
Open_files4242
Open_streams0
Open_table_definitions7439
Open_tables7900
Opened_files1745104620
Opened_table_definitions256748
Opened_tables499109
Performance_schema_cond_classes_lost0
Performance_schema_cond_instances_lost0
Performance_schema_file_classes_lost0
Performance_schema_file_handles_lost0
Performance_schema_file_instances_lost0
Performance_schema_locker_lost0
Performance_schema_mutex_classes_lost0
Performance_schema_mutex_instances_lost0
Performance_schema_rwlock_classes_lost0
Performance_schema_rwlock_instances_lost0
Performance_schema_table_handles_lost0
Performance_schema_table_instances_lost0
Performance_schema_thread_classes_lost0
Performance_schema_thread_instances_lost0
Prepared_stmt_count0
Qcache_free_blocks2033
Qcache_free_memory3317024
Qcache_hits1894123413
Qcache_inserts423712095
Qcache_lowmem_prunes329061851
Qcache_not_cached2397690444
Qcache_queries_in_cache4630
Qcache_total_blocks12799
Queries9222599274
Questions9172445340
Rpl_statusAUTH_MASTER
Select_full_join896755209
Select_full_range_join53636
Select_range319353723
Select_range_check121879
Select_scan2083343013
Slave_heartbeat_period0
Slave_open_temp_tables0
Slave_received_heartbeats0
Slave_retried_transactions0
Slave_runningON
Slow_launch_threads0
Slow_queries1441472
Sort_merge_passes15
Sort_range13596141
Sort_rows3003884039
Sort_scan53624730
Ssl_accept_renegotiates0
Ssl_accepts0
Ssl_callback_cache_hits0
Ssl_cipher
Ssl_cipher_list
Ssl_client_connects0
Ssl_connect_renegotiates0
Ssl_ctx_verify_depth0
Ssl_ctx_verify_mode0
Ssl_default_timeout0
Ssl_finished_accepts0
Ssl_finished_connects0
Ssl_session_cache_hits0
Ssl_session_cache_misses0
Ssl_session_cache_modeNONE
Ssl_session_cache_overflows0
Ssl_session_cache_size0
Ssl_session_cache_timeouts0
Ssl_sessions_reused0
Ssl_used_session_cache_entries0
Ssl_verify_depth0
Ssl_verify_mode0
Ssl_version
Table_locks_immediate51443087903
Table_locks_waited19219107
Tc_log_max_pages_used0
Tc_log_page_size0
Tc_log_page_waits159
Threads_cached4
Threads_connected460
Threads_created15269337
Threads_running3
Uptime9665143
Uptime_since_flush_status9665143


Globale variabelen:
auto_increment_increment2
auto_increment_offset1
autocommitON
automatic_sp_privilegesON
back_log50
basedir/usr
big_tablesOFF
binlog_cache_size32768
binlog_direct_non_transactional_updatesOFF
binlog_formatSTATEMENT
binlog_stmt_cache_size32768
bulk_insert_buffer_size1073741824
character_set_clientlatin1
character_set_connectionlatin1
character_set_databaselatin1
character_set_filesystembinary
character_set_resultslatin1
character_set_serverlatin1
character_set_systemutf8
character_sets_dir/usr/share/mysql/charsets/
collation_connectionlatin1_swedish_ci
collation_databaselatin1_swedish_ci
collation_serverlatin1_swedish_ci
completion_typeNO_CHAIN
concurrent_insertAUTO
connect_timeout10
datadir/var/lib/mysql/
date_format%Y-%m-%d
datetime_format%Y-%m-%d %H:%i:%s
default_storage_engineInnoDB
default_week_format0
delay_key_writeON
delayed_insert_limit100
delayed_insert_timeout300
delayed_queue_size1000
div_precision_increment4
engine_condition_pushdownON
event_schedulerOFF
expire_logs_days30
flushOFF
flush_time0
foreign_key_checksON
ft_boolean_syntax`+ -><()~*:""&|
ft_max_word_len84
ft_min_word_len4
ft_query_expansion_limit20
ft_stopword_file(built-in)
general_logOFF
general_log_file/var/lib/mysql/mysql-master.log
group_concat_max_len1024
have_compressYES
have_cryptYES
have_csvYES
have_dynamic_loadingYES
have_geometryYES
have_innodbYES
have_ndbclusterNO
have_opensslDISABLED
have_partitioningYES
have_profilingYES
have_query_cacheYES
have_rtree_keysYES
have_sslDISABLED
have_symlinkYES
hostnamemysql-master
ignore_builtin_innodbOFF
init_connect
init_file
init_slave
innodb_adaptive_flushingON
innodb_adaptive_hash_indexON
innodb_additional_mem_pool_size8388608
innodb_autoextend_increment8
innodb_autoinc_lock_mode1
innodb_buffer_pool_instances1
innodb_buffer_pool_size134217728
innodb_change_bufferingall
innodb_checksumsON
innodb_commit_concurrency0
innodb_concurrency_tickets500
innodb_data_file_pathibdata1:10M:autoextend
innodb_data_home_dir
innodb_doublewriteON
innodb_fast_shutdown1
innodb_file_formatAntelope
innodb_file_format_checkON
innodb_file_format_maxAntelope
innodb_file_per_tableON
innodb_flush_log_at_trx_commit1
innodb_flush_method
innodb_force_load_corruptedOFF
innodb_force_recovery0
innodb_io_capacity200
innodb_large_prefixOFF
innodb_lock_wait_timeout50
innodb_locks_unsafe_for_binlogOFF
innodb_log_buffer_size8388608
innodb_log_file_size5242880
innodb_log_files_in_group2
innodb_log_group_home_dir./
innodb_max_dirty_pages_pct75
innodb_max_purge_lag0
innodb_mirrored_log_groups1
innodb_old_blocks_pct37
innodb_old_blocks_time0
innodb_open_files300
innodb_print_all_deadlocksOFF
innodb_purge_batch_size20
innodb_purge_threads0
innodb_random_read_aheadOFF
innodb_read_ahead_threshold56
innodb_read_io_threads4
innodb_replication_delay0
innodb_rollback_on_timeoutOFF
innodb_rollback_segments128
innodb_spin_wait_delay6
innodb_stats_methodnulls_equal
innodb_stats_on_metadataON
innodb_stats_sample_pages8
innodb_strict_modeOFF
innodb_support_xaON
innodb_sync_spin_loops30
innodb_table_locksON
innodb_thread_concurrency0
innodb_thread_sleep_delay10000
innodb_use_native_aioOFF
innodb_use_sys_mallocON
innodb_version5.5.31
innodb_write_io_threads4
interactive_timeout28800
join_buffer_size1073741824
keep_files_on_createOFF
key_buffer_size4294967296
key_cache_age_threshold300
key_cache_block_size1024
key_cache_division_limit100
large_files_supportON
large_page_size0
large_pagesOFF
lc_messagesen_US
lc_messages_dir/usr/share/mysql/
lc_time_namesen_US
licenseGPL
local_infileON
lock_wait_timeout31536000
locked_in_memoryOFF
logOFF
log_binON
log_bin_trust_function_creatorsOFF
log_error/var/log/mysql/error.log
log_outputFILE
log_queries_not_using_indexesOFF
log_slave_updatesOFF
log_slow_queriesOFF
log_warnings1
long_query_time1
low_priority_updatesOFF
lower_case_file_systemOFF
lower_case_table_names1
max_allowed_packet16777216
max_binlog_cache_size18446744073709500000
max_binlog_size104857600
max_binlog_stmt_cache_size18446744073709500000
max_connect_errors10
max_connections4000
max_delayed_threads20
max_error_count64
max_heap_table_size4294967296
max_insert_delayed_threads20
max_join_size18446744073709500000
max_length_for_sort_data1024
max_long_data_size16777216
max_prepared_stmt_count16382
max_relay_log_size0
max_seeks_for_key18446744073709500000
max_sort_length1024
max_sp_recursion_depth0
max_tmp_tables32
max_user_connections0
max_write_lock_count18446744073709500000
metadata_locks_cache_size1024
min_examined_row_limit0
multi_range_count256
myisam_data_pointer_size6
myisam_max_sort_file_size9223372036853720000
myisam_mmap_size18446744073709500000
myisam_recover_optionsBACKUP
myisam_repair_threads1
myisam_sort_buffer_size4294967296
myisam_stats_methodnulls_unequal
myisam_use_mmapOFF
net_buffer_length16384
net_read_timeout30
net_retry_count10
net_write_timeout60
newOFF
oldOFF
old_alter_tableOFF
old_passwordsOFF
open_files_limit135078
optimizer_prune_level1
optimizer_search_depth62
optimizer_switchindex_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on
performance_schemaOFF
performance_schema_events_waits_history_long_size10000
performance_schema_events_waits_history_size10
performance_schema_max_cond_classes80
performance_schema_max_cond_instances1000
performance_schema_max_file_classes50
performance_schema_max_file_handles32768
performance_schema_max_file_instances10000
performance_schema_max_mutex_classes200
performance_schema_max_mutex_instances1000000
performance_schema_max_rwlock_classes30
performance_schema_max_rwlock_instances1000000
performance_schema_max_table_handles100000
performance_schema_max_table_instances50000
performance_schema_max_thread_classes50
performance_schema_max_thread_instances1000
pid_file/var/run/mysqld/mysqld.pid
plugin_dir/usr/lib/mysql/plugin/
port3306
preload_buffer_size32768
profilingOFF
profiling_history_size15
protocol_version10
query_alloc_block_size8192
query_cache_limit1048576
query_cache_min_res_unit4096
query_cache_size16777216
query_cache_typeON
query_cache_wlock_invalidateOFF
query_prealloc_size8192
range_alloc_block_size4096
read_buffer_size1073741824
read_onlyOFF
read_rnd_buffer_size268435456
relay_logmysql-master-relay-bin
relay_log_index
relay_log_info_filerelay-log.info
relay_log_purgeON
relay_log_recoveryOFF
relay_log_space_limit0
report_hostmysql-master.[domain].nl
report_password
report_port3306
report_user
rpl_recovery_rank0
secure_authOFF
secure_file_priv
server_id1
skip_external_lockingON
skip_name_resolveOFF
skip_networkingOFF
skip_show_databaseOFF
slave_compressed_protocolOFF
slave_exec_modeSTRICT
slave_load_tmpdir/tmp
slave_max_allowed_packet1073741824
slave_net_timeout3600
slave_skip_errors1062
slave_transaction_retries10
slave_type_conversions
slow_launch_time2
slow_query_logOFF
slow_query_log_file/var/lib/mysql/mysql-master-slow.log
socket/var/run/mysqld/mysqld.sock
sort_buffer_size1073741824
sql_auto_is_nullOFF
sql_big_selectsON
sql_big_tablesOFF
sql_buffer_resultOFF
sql_log_binON
sql_log_offOFF
sql_low_priority_updatesOFF
sql_max_join_size18446744073709500000
sql_mode
sql_notesON
sql_quote_show_createON
sql_safe_updatesOFF
sql_select_limit18446744073709500000
sql_slave_skip_counter0
sql_warningsOFF
ssl_ca
ssl_capath
ssl_cert
ssl_cipher
ssl_key
storage_engineInnoDB
stored_program_cache256
sync_binlog0
sync_frmON
sync_master_info0
sync_relay_log0
sync_relay_log_info0
system_time_zoneCEST
table_definition_cache16384
table_open_cache262136
thread_cache_size8
thread_concurrency10
thread_handlingone-thread-per-connection
thread_stack196608
time_format%H:%i:%s
time_zoneSYSTEM
timed_mutexesOFF
tmp_table_size4294967296
tmpdir/tmp
transaction_alloc_block_size8192
transaction_prealloc_size4096
tx_isolationREPEATABLE-READ
unique_checksON
updatable_views_with_limitYES
version5.5.31-0ubuntu0.12.04.1-log
version_comment(Ubuntu)
version_compile_machinex86_64
version_compile_osdebian-linux-gnu
wait_timeout28800

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22


  • Schnoop
  • Registratie: Juli 2006
  • Laatst online: 24-09 21:03
Ik heb persoonlijk geen ervaring met zulke grote databases maar wellicht dat dit artikel helpt.
So you understand how much having data in memory changed things here is small example with numbers. If you have your data fully in memory you could perform over 300.000 of random lookups per second from single thread depending on system and table structure. Now if you data fully on disk (both data and index) you would need 2+ IOs to retrieve the row which means you get about 100 rows/sec. Note multiple drives do not really help a lot as we’re speaking about single thread/query here. So difference is 3.000 times! It might be a bit too much as there are few completely uncached workloads but 100+ times difference is quite frequent.
Wat vaak het probleem is is dat die insert/update vanuit 1 thread gedaan wordt. Als je data dus niet in memory staat worden telkens een aantal rows van de schijf gehaald+behandeld. Hierbij krijg je overhead welke niet te traceren is naar CPU/IO.

Kijk dus even naar het memory gebruik. Wat wellicht ook zou kunnen helpen is bij een update de update verdelen over verschillende queries zodat er per query een thread ge spawned wordt. Dit zou in theory sneller moet werken als je data niet in memory staat (Althans dit haal ik uit her verhaal).

  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Ik heb het artikel gelezen maar twijfel of het van toepassing is. Het is geen probleem als die ene insert/delete query traag is, wat mij stoort is dat de andere connecties/queries er problemen door krijgen. Volgens de instellingen zou dat niet moeten:

Status:
Threads_connected..... 463
Max_used_connections..... 585

Systeem variabele:
thread_handling: one-thread-per-connection

Als die queries werkelijk los van elkaar staan dan zou -simpel gedacht- de vertraging moeten komen omdat de I/O niet sneller kan maar dat zie ik niet terug in de logs waar de disk-utilization ver van de 100% blijft.

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22


  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 28-11 13:23

Tukk

De α-man met het ẞ-brein

Zonder enige MYSql kennis (wel veel oracle, sql server).

Voer je alle inserts in 1 keer achter elkaar uit? Stop er dan eens een paar commits in (bv om de 100.000) zodat het geheugen vrijgegeven kan worden.

[ Voor 4% gewijzigd door Tukk op 17-09-2013 16:01 ]

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Er zit geen commit na [x] records, dat zou bij een delete/update nog wel eens kunnen helpen inderdaad.

Maar ik heb op dit moment hetzelfde probleem met een ALTER TABLE waarbij ik een primary key toevoeg aan een table met een paar 300 miljoen records: alle databases in de instance zijn zo traag als dikke str*nt. En dat los je helaas niet op met een tussen-commit. Er staan nu zo'n 40 queries in verschillende stadia van afhandeling open waarvan sommige al bijna 500 seconden duren (en die normaal in een fractie van een seconde afgehandeld worden).

tabel:
x - int(4) PK
y - int(4) PK
stamp - datetime PK
value - float

Een eenvoudige benchmark van de storage geeft tegelijkertijd met de ALTER TABLE nog ruim 200 MB/s:
code:
1
2
3
4
5
6
7
8
time dd if=/dev/zero of=ddfile bs=8k count=500000 && sync
500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 16.0199 s, 256 MB/s

real    0m16.974s
user    0m0.084s
sys     0m6.212s


iostat -x 10 geeft:
code:
1
2
3
4
5
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          13.81   0.00  0.60    0.03     0.00     85.57

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00   114.90    1.30  242.40    93.60  1654.80    14.35     0.05    0.20    0.62    0.19   0.04   0.92

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22


  • Piemol
  • Registratie: Januari 2006
  • Laatst online: 29-11 23:38
Ik denk dat Schnoop op zich wel een punt heeft.
MySql heeft maar een bepaald aantal Gb's aan geheugen beschikbaar.
Als die ene grote insert/delete query laten we zeggen 75% van het MySql geheugen op snoept,
hebben alle andere queries nog maar 25% van het geheugen beschikbaar.

Staan je myisam_sort_buffer_size en sort_buffer_size niet wat groot ingesteld?
(als het in bytes is uitgedrukt heb je 4 en 1Gb hiervoor?)
http://stackoverflow.com/...-size-vs-sort-buffer-size

Als de grote query dan voor 'wat' vertraging zorgt, en daardoor andere threads ook iets langer open blijven staan dan is binnen notime al je geheugen op.

Verder wist ik niet wat MERGE tables precies waren, dus heb ik even opgezocht in de documentatie.
En toen snapte ik niet wat dan precies voor- en nadelen zijn van zo'n tabel... (ja ik wist het echt niet wat het was!).
Toen las ik in de documentatie:
MERGE tables use more file descriptors than MyISAM tables. If 10 clients are using a MERGE table that maps to 10 tables, the server uses (10 × 10) + 10 file descriptors. (10 data file descriptors for each of the 10 clients, and 10 index file descriptors shared among the clients.)

En op een MySql forum:
A MERGE table doesn't need a fd for itself, but one or two for every MyISAM table. So the first session opening your MERGE table takes 1000 fds, every concurrent session on the same MERGE table takes just 500 additional fds. However only the MERGE table needs a TABLE structure in the table_cache. The underlying MyISAM tables don't appear in the table_cache unless they are used directly (not through the MERGE table).

Dus als ik het goed begrijp moet je ook genoeg open files toe staan.

hmmm... je open_files_limit staat erg hoog, en al zou je 500 connections hebben die 'toevallig' alle 150 databases de 4 MERGE tabellen querie'en met ~20 onderliggende tabbellen zou je op 40000 open files komen.
Dus dat 'lijkt' mij ook niet heel erg fout te gaan.
Dat je geen error krijgt over 'too many connections' zou alsnog kunnen, zolang er een wachtrij kan zijn treedt die niet op.


Draaien de queries/threads wel onder verschillende users?
Dat je niet alles vanuit dezelfde MySql user runt en die tegen een limiet aanloopt?

Voor nu zijn m'n ideeën even op :)

Ohnee: is de server een VM ?
Zoja, weet je zeker dat die de resources heeft die je verwacht dat die heeft?
Stel dat je de opgegeven specs denkt te hebben, en VMWare (of een vergelijkbaar programma) geeft hem maar 4 cores en 4GB geheugen, dan weet Linux daar helemaal niks van af.

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

Even er van uit gaande dat CPU niet de bottleneck is, Kunnen de SSD's dan niet de bottleneck zijn. Ik weet net wat de stripe size is, maar met zulke gigantische updates zijn je SSD's intern ontzettend met data aan het schuiven. Je zegt dat je raid 5 hebt, dan zijn 2 ssd's aan het schrijven. Omdat de raid stripe size altijd kleiner dan 4K is wil dat zeggen dat iedere schrijfactie bestaat uit DISKS x 4K lezen, 2 x 4K schrijven en omdat de Stripe geen 4K is, zullen dus 2 SSD's dus altijd 4K extra lezen en deze op een andere 4K Cell wegschrijven. Met als gevolg dat je IO ontzettend inzakt. Daarnaast is het te hopen dat je partitie alligned is zodat je geen double reads krijgt op je storage. Ook al is het SSD, de performance kan behoorlijk tegenvallen en bij schrijven zelfs onder traditionele HDD performance vallen. Daarnaast helpt het niet hebben van TRIM ook niet echt mee.

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 28-11 13:23

Tukk

De α-man met het ẞ-brein

Storage: 6x SSD Intel, hardware RAID-5, geen TRIM
Dit is ook niet de beste opstelling om performance te halen!

Data op een Raid-5 is logisch, aangezien je uptime hoog wil houden. Wat je niet moet doen is je OS en indexen op deze RAID-5 zetten. Een query die alleen je indexen gebruikt (of als je indexen gaat herbouwen) zit dan het data ophalen in de weg. Wat ik meestal doe zijn drie raids in 1 server:

Mirrored: OS (zekerheid + sneller lezen)
Striped: Indexen (snelheid, snelheid, snelheid)
Raid-5: Data. (zekerheid, dan maar een beetje langzamer).

Indien je CPU en Memory niet in de max zitten zou je de data ook nog kunnen verdelen over twee raid-5 systemen.

Snelste winst op dit moment: Haal de indexen van je datadisks af, desnoods prik je er 1 ssd bij en zet je ze daar op.

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Piemol schreef op dinsdag 17 september 2013 @ 19:40:
Ik denk dat Schnoop op zich wel een punt heeft.
MySql heeft maar een bepaald aantal Gb's aan geheugen beschikbaar.
Als die ene grote insert/delete query laten we zeggen 75% van het MySql geheugen op snoept,
hebben alle andere queries nog maar 25% van het geheugen beschikbaar.
Mogelijk, maar waar dan? :)
Staan je myisam_sort_buffer_size en sort_buffer_size niet wat groot ingesteld?
(als het in bytes is uitgedrukt heb je 4 en 1Gb hiervoor?)
http://stackoverflow.com/...-size-vs-sort-buffer-size
Deze buffers zijn al eens vergroot als reactie op deze problemen. Ik zal eens kijken of een veel kleinere sort_buffer_size impact heeft.
Als de grote query dan voor 'wat' vertraging zorgt, en daardoor andere threads ook iets langer open blijven staan dan is binnen notime al je geheugen op.
Mogelijk zie ik dat ook wel in Munin. Na het killen van de langlopende alter table heeft het systeem zo'n 6 GB usused RAM terwijl daarvoor al het ram voor cache gebruikt werd. Mijn gevoel zegt me dat 6GB gebruik voor zo'n zware query prima is, er is dan nog dik 20 GB beschikbaar voor de andere queries. Maar misschien spelen er andere zaken dan alleen de hoeveelheid geheugen maar ook bandbreedte en/of caches?
Verder wist ik niet wat MERGE tables precies waren, dus heb ik even opgezocht in de documentatie.
En toen snapte ik niet wat dan precies voor- en nadelen zijn van zo'n tabel... (ja ik wist het echt niet wat het was!).
Toen las ik in de documentatie:
MERGE tables use more file descriptors than MyISAM tables. If 10 clients are using a MERGE table that maps to 10 tables, the server uses (10 × 10) + 10 file descriptors. (10 data file descriptors for each of the 10 clients, and 10 index file descriptors shared among the clients.)

En op een MySql forum:
A MERGE table doesn't need a fd for itself, but one or two for every MyISAM table. So the first session opening your MERGE table takes 1000 fds, every concurrent session on the same MERGE table takes just 500 additional fds. However only the MERGE table needs a TABLE structure in the table_cache. The underlying MyISAM tables don't appear in the table_cache unless they are used directly (not through the MERGE table).

Dus als ik het goed begrijp moet je ook genoeg open files toe staan.

hmmm... je open_files_limit staat erg hoog, en al zou je 500 connections hebben die 'toevallig' alle 150 databases de 4 MERGE tabellen querie'en met ~20 onderliggende tabbellen zou je op 40000 open files komen.
Dus dat 'lijkt' mij ook niet heel erg fout te gaan.
De merge tables worden gebruikt om redelijk straffeloos een periode aan data te kunnen weggooien en het gebruik ervan stamt van voor de introductie van partitions in MySQL. Helaas moet je met merge tables nog steeds recente data moven/deleten en dat is waar een deel van de problemen ontstaan. Partitions zouden dat kunnen oplossen door MySQL direct al de data in de juiste tabel te laten plaatsen. Maar ook dat lost het onderliggende probleem in de kern niet op.

Filedescriptors hebben we inderdaad zat beschikbaar:)
Linux:
code:
1
2
cat /proc/sys/fs/file-max
3247301

en MySQL:
code:
1
open_files_limit    135078
Dat je geen error krijgt over 'too many connections' zou alsnog kunnen, zolang er een wachtrij kan zijn treedt die niet op.
In MySQL logging is niks interessants te vinden.
Draaien de queries/threads wel onder verschillende users? Dat je niet alles vanuit dezelfde MySql user runt en die tegen een limiet aanloopt?
Ja, de meeste wel en zeker de zware alter table.
is de server een VM ?
Zoja, weet je zeker dat die de resources heeft die je verwacht dat die heeft?
Stel dat je de opgegeven specs denkt te hebben, en VMWare (of een vergelijkbaar programma) geeft hem maar 4 cores en 4GB geheugen, dan weet Linux daar helemaal niks van af.
Nee, het is een (ondertussen wat oudere) dedicated machine voor de database.

[ Voor 6% gewijzigd door styno op 18-09-2013 09:58 ]

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22


  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Wim-Bart en Tukk: ik ben me bewust dat dit in deze tijden geen optimale setup is en voor een nieuwe database machine zouden inderdaad andere keuzes gemaakt worden (geen hardware raid-5 bijvoorbeeld). Maar, als de SSD's de bottleneck zouden zijn, is de benchmark dan nog steeds heel snel tijdens de zware alter table? Valt dat met elkaar te rijmen, goede sequentiele performance terwijl de storage tegelijkertijd qua iops zwaar belast wordt?

Een eenvoudige benchmark van de storage geeft tegelijkertijd met de ALTER TABLE nog ruim 200 MB/s:
code:
1
2
3
4
5
6
7
8
time dd if=/dev/zero of=ddfile bs=8k count=500000 && sync
500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 16.0199 s, 256 MB/s

real    0m16.974s
user    0m0.084s
sys     0m6.212s


iostat -x 10 geeft:
code:
1
2
3
4
5
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          13.81   0.00  0.60    0.03     0.00     85.57

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00   114.90    1.30  242.40    93.60  1654.80    14.35     0.05    0.20    0.62    0.19   0.04   0.92


We zouden inderdaad de setup kunnen wijzigen om (cosmetisch) mogelijk het probleem op te lossen, maar ik wil graag weten waarom een relatieve simpele maar zware load de performance van de hele instance onderuit haalt terwijl CPU/storage er niet echt van onder de indruk lijken te zijn.

Edit I:
Kwam MySQLTuner tegen in één van de links en tijdens een zware operatie laten lopen. Dit is de output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 >>  MySQLTuner 1.0.1 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering
[OK] Logged in using credentials passed on the command line

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.31-0ubuntu0.12.04.1-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 373G (Tables: 8215)
[--] Data in MRG_MYISAM tables: 335G (Tables: 229)
[--] Data in InnoDB tables: 5G (Tables: 7607)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[--] Data in MEMORY tables: 0B (Tables: 8)
[!!] Total fragmented tables: 661

-------- Performance Metrics -------------------------------------------------
[--] Up for: 112d 19h 3m 57s (9B q [950.127 qps], 76M conn, TX: 10161B, RX: 4238B)
[--] Reads / Writes: 50% / 50%
[--] Total buffers: 8.2G global + 3.3G per thread (4000 max threads)
[!!] Maximum possible memory usage: 13008.9G (41477% of installed RAM)
[OK] Slow queries: 0% (1M/9B)
[OK] Highest usage of available connections: 16% (658/4000)
[OK] Key buffer size / total MyISAM indexes: 4.0G/237.0G
[OK] Key buffer hit rate: 99.9% (6B cached / 3M reads)
[!!] Query cache efficiency: 0.7% (18M cached / 2B selects)
[!!] Query cache prunes per day: 29759
[OK] Sorts requiring temporary tables: 0% (15 temp sorts / 67M sorts)
[!!] Joins performed without indexes: 904290732
[!!] Temporary tables created on disk: 36% (136M on disk / 375M total)
[OK] Thread cache hit rate: 79% (15M created / 76M connections)
[!!] Table cache hit rate: 2% (14K open / 506K opened)
[OK] Open file limit used: 9% (12K/135K)
[OK] Table locks acquired immediately: 99% (561M immediate / 561M locks)
[!!] InnoDB data size / buffer pool: 5.7G/128.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Reduce your overall MySQL memory footprint for system stability
    Enable the slow query log to troubleshoot bad queries
    Adjust your join queries to always utilize indexes
    Temporary table size is already large - reduce result set size
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    query_cache_limit (> 1M, or use smaller result sets)
    query_cache_size (> 16M)
    join_buffer_size (> 1.0G, or always use indexes with joins)
    table_cache (> 524288)
    innodb_buffer_pool_size (>= 5G)


Ahem: Er lijkt nog wel wat ruimte voor optimalisatie :o

Edit II:
Zo'n tuning script is ook niet alles, de table cache instelling kan niet hoger dan 524288 en toch hebben we maar een hit-rate van 2%. De MySQL Tuning Blog heeft hier wat over te zeggen (is wel een ouder artikel, dus kan niet meer actueel zijn). Als je toch een lage hit-rate hebt die je niet kunt oplossen met een grotere cache dan kun je beter de cache kleiner maken...

[ Voor 66% gewijzigd door styno op 18-09-2013 10:52 ]

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22


  • Piemol
  • Registratie: Januari 2006
  • Laatst online: 29-11 23:38
Hallo Styno,

helaas voor je kan ik er zelf nogal slecht tegen als iets onopgelost blijft :p
Dus heb vanavond nog is zitten nadenken en googlen...
Kan Munin zelf het probleem niet zijn? Ik weet niet of je dat al geïnstalleerd had voor de traagheidsproblemen?
Om de hoeveel minuten verzamelt Munin statistieken, en hoe lang duurt 'de grote insert' ?

Zie dit topic
Zelf heb ik (achteraf gezien) ook ervaren dat Munin voor behoorlijke pieken (in de load) en vertragingen kan zorgen.

Wellicht zou je diverse monitoring programma's kunnen uitschakelen en kijken wat het met je queries / performance doet.
Al zou ik zeggen dat als een monitoring tool inderdaad voor problemen zorgt, je ook in de serverload véél meer zou moeten zien... maar goed bovengenoemd topic had daar ook geen aanknopingspunt bij.

[ Voor 3% gewijzigd door Piemol op 18-09-2013 21:01 ]


  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Bedankt voor de vasthoudendheid Piemol :)
Piemol schreef op woensdag 18 september 2013 @ 21:01:
Hallo Styno,

helaas voor je kan ik er zelf nogal slecht tegen als iets onopgelost blijft :p
Dus heb vanavond nog is zitten nadenken en googlen...
Kan Munin zelf het probleem niet zijn? Ik weet niet of je dat al geïnstalleerd had voor de traagheidsproblemen?
Om de hoeveel minuten verzamelt Munin statistieken, en hoe lang duurt 'de grote insert' ?
De meeste Mysql Munin stats zijn pas toegevoegd na de problemen ontdekt waren. De 'grote insert' duurt zo 10-20 minuten.
Zie dit topic
Zelf heb ik (achteraf gezien) ook ervaren dat Munin voor behoorlijke pieken (in de load) en vertragingen kan zorgen.
Klopt, maar dat wordt al deels ondervangen met een aparte VM waar de Munin in draait. Ook zie ik Munin-node niet veel in top voorbij komen.
Wellicht zou je diverse monitoring programma's kunnen uitschakelen en kijken wat het met je queries / performance doet.
Al zou ik zeggen dat als een monitoring tool inderdaad voor problemen zorgt, je ook in de serverload véél meer zou moeten zien... maar goed bovengenoemd topic had daar ook geen aanknopingspunt bij.
Dat zou een optie zijn, maarrrr...

De oorzaak lijkt gevonden te zijn in de key-cache van MySQL. Als we nu onderhoud gaan doen dan maken we eerst een aparte key-cache aan voor de indexen die we verwachten te gaan gebruiken en zetten na afloop de aparte key-cache grootte weer op 0. Daarmee lijkt het blokkeren van de hele instance opgelost.

Het lijkt dus een gevalletje waarbij mutexen in de code van MySQL te grof zijn (teveel code binnen één mutex) waardoor threads op elkaar moeten wachten om toegang te krijgen tot MySQL functionaliteit.

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22


  • Piemol
  • Registratie: Januari 2006
  • Laatst online: 29-11 23:38
Oké, nooit van iets dergelijks gehoord.
Kun je dan ook aan je onderhouds-thread aangeven dat die de aparte key-cache moet gaan gebruiken of iets dergelijks?
Of gaat MySql zelf kijken of een key-cache uitleesbaar is of niet, zodat alle andere threads automatisch de key-cache gaan gebruiken die niet gebruikt wordt door de onderhoudsthread?

  • styno
  • Registratie: Juni 2001
  • Laatst online: 29-11 22:03

styno

Koffie? Hmmm, ja, lekkerrr

Topicstarter
Piemol schreef op vrijdag 20 september 2013 @ 14:42:
Oké, nooit van iets dergelijks gehoord.
Kun je dan ook aan je onderhouds-thread aangeven dat die de aparte key-cache moet gaan gebruiken of iets dergelijks?
Of gaat MySql zelf kijken of een key-cache uitleesbaar is of niet, zodat alle andere threads automatisch de key-cache gaan gebruiken die niet gebruikt wordt door de onderhoudsthread?
Het is eigenlijk voor een database ook te gek voor woorden, maar ja, MySQL is in de kern een simpele database uit de single-core tijdperk. Handmatig indexen in verschillende caches plaatsen is natuurlijk een enorme 8)7 en ondertussen doen andere DB's het beter, mogelijk MariaDB ook als drop-in vervanger. Daar keken we toch al naar.

Je zult zelf indexen handmatig aan de niet-default key-cache moeten toevoegen dus MySQL gaat die niet 'zomaar' gebruiken, maar alleen voor queries die de betrokken indexen betreft. Dat is voor onze situatie gelukkig geen probleem. Het aanmaken van een aparte key-cache en het opruimen daarvan wordt opgenomen in het onderhoudsscript, dat is gelukkig maar een kleine wijziging.

Overigens, dank aan allen die hun input gaven! d:)b

[ Voor 4% gewijzigd door styno op 20-09-2013 15:08 ]

Climatechange is a super-wicked problem, but:
"The stone age came to an end not for lack of stones. And the oil age will come to an end not for lack of oil." -- Sheikh Yamani, Saudi oil minister
8xLG Neon MonoX 290Wp SMA SB2100TL / MY SR '22

Pagina: 1