И снова про загрузку

itstrue
Дата: 09.02.2013 17:24:44
Добрый день!

3 года не беспокоил форум, т.к. проект баннерной сети планомерно работал и развивался, все было гладко и крупных вопрос не возникало. Но мы ширимся и развиваемся, и на очередной ступеньке развития возникли следующие вопросы:

Кол-во показов сети на данный момент составляет 10-15 млн в сутки.
Структура БД такова, что есть табличка с объявлениями, оттуда она дергается довольно массивным запросом из 15 джоинов.
Дергает этот запрос PHP файл и раздает сайтам в виде рекламных блоков.

В общем стандартная система для такого вида проектов. Плюс статистика складывается сначала в таблица типа MEMORY, а потом кроном апдейтится каждые 2 минуты.

Теперь, что беспокоит:

1. Большая загрузка ЦП
2. Медленный вывод MySQL ответов
3. Периодически 500 ошибка от NGINX из-за таймаута мускула

Конфиги:

Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.

Как видно очень меня беспокоит Handler_read_rnd_next. Но что с ним делать?

В общем буду рад любым советам и рекомендациям куда расти и двигаться, не только MySQL но и железа/архитектуры системы в целом.
miksoft
Дата: 09.02.2013 17:44:56
Для начала, покажите точную версию MySQL и текущий конфиг (можно даже не конфиг, а список всех переменных), желательно в спойлере.
itstrue
Дата: 09.02.2013 18:04:04
Вот конфиг:

+
Variable_name 	Value
auto_increment_increment 1
auto_increment_offset 1
autocommit ON
automatic_sp_privileges ON
back_log 50
basedir /usr/
big_tables OFF
binlog_cache_size 32768
binlog_direct_non_transactional_updates OFF
binlog_format STATEMENT
bulk_insert_buffer_size 8388608
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
collation_connection utf8_unicode_ci
collation_database utf8_general_ci
collation_server cp1251_general_ci
completion_type 0
concurrent_insert 1
connect_timeout 10
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
div_precision_increment 4
engine_condition_pushdown ON
error_count 0
event_scheduler OFF
expire_logs_days 10
flush OFF
flush_time 0
foreign_key_checks ON
ft_boolean_syntax + -><()~*:""&|
ft_max_word_len 84
ft_min_word_len 4
ft_query_expansion_limit 20
ft_stopword_file (built-in)
general_log OFF
general_log_file /var/run/mysqld/mysqld.log
group_concat_max_len 1024
have_community_features YES
have_compress YES
have_crypt YES
have_csv YES
have_dynamic_loading YES
have_geometry YES
have_innodb YES
have_ndbcluster NO
have_openssl DISABLED
have_partitioning YES
have_query_cache YES
have_rtree_keys YES
have_ssl DISABLED
have_symlink YES
hostname i7host.ru
identity 0
ignore_builtin_innodb OFF
init_connect SET NAMES cp1251
init_file
init_slave
innodb_adaptive_hash_index ON
innodb_additional_mem_pool_size 1048576
innodb_autoextend_increment 8
innodb_autoinc_lock_mode 1
innodb_buffer_pool_size 8388608
innodb_checksums ON
innodb_commit_concurrency 0
innodb_concurrency_tickets 500
innodb_data_file_path ibdata1:10M:autoextend
innodb_data_home_dir
innodb_doublewrite ON
innodb_fast_shutdown 1
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_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_rollback_on_timeout OFF
innodb_stats_on_metadata ON
innodb_support_xa ON
innodb_sync_spin_loops 20
Variable_name Value
innodb_table_locks ON
innodb_thread_concurrency 8
innodb_thread_sleep_delay 10000
innodb_use_legacy_cardinality_algorithm ON
insert_id 0
interactive_timeout 28800
join_buffer_size 131072
keep_files_on_create OFF
key_buffer_size 33554432
key_cache_age_threshold 300
key_cache_block_size 1024
key_cache_division_limit 100
language /usr/share/mysql/english/
large_files_support ON
large_page_size 0
large_pages OFF
last_insert_id 0
lc_time_names en_US
license GPL
local_infile ON
locked_in_memory OFF
log OFF
log_bin OFF
log_bin_trust_function_creators OFF
log_bin_trust_routine_creators OFF
log_error
log_output FILE
log_queries_not_using_indexes OFF
log_slave_updates OFF
log_slow_queries ON
log_warnings 1
long_query_time 10.000000
low_priority_updates OFF
lower_case_file_system OFF
lower_case_table_names 0
max_allowed_packet 16777216
max_binlog_cache_size 18446744073709547520
max_binlog_size 104857600
max_connect_errors 10
max_connections 10000
max_delayed_threads 20
max_error_count 64
max_heap_table_size 536870912
max_insert_delayed_threads 20
max_join_size 18446744073709551615
max_length_for_sort_data 1024
max_prepared_stmt_count 16382
max_relay_log_size 0
max_seeks_for_key 18446744073709551615
max_sort_length 1024
max_sp_recursion_depth 0
max_tmp_tables 32
max_user_connections 0
max_write_lock_count 18446744073709551615
min_examined_row_limit 0
multi_range_count 256
myisam_data_pointer_size 6
myisam_max_sort_file_size 9223372036853727232
myisam_mmap_size 18446744073709551615
myisam_recover_options BACKUP
myisam_repair_threads 1
myisam_sort_buffer_size 8388608
myisam_stats_method nulls_unequal
myisam_use_mmap OFF
net_buffer_length 16384
net_read_timeout 30
net_retry_count 10
net_write_timeout 60
new OFF
old OFF
old_alter_table OFF
old_passwords OFF
open_files_limit 50000
optimizer_prune_level 1
optimizer_search_depth 62
optimizer_switch index_merge=on,index_merge_union=on,index_merge_so...
pid_file /var/run/mysqld/mysqld.pid
plugin_dir /usr/lib/mysql/plugin
port 3306
preload_buffer_size 32768
profiling OFF
profiling_history_size 15
protocol_version 10
pseudo_thread_id 96149
query_alloc_block_size 8192
query_cache_limit 2097152
query_cache_min_res_unit 4096
query_cache_size 67108864
query_cache_type ON
query_cache_wlock_invalidate OFF
query_prealloc_size 8192
rand_seed1
rand_seed2
range_alloc_block_size 4096
read_buffer_size 131072
read_only OFF
read_rnd_buffer_size 262144
relay_log
relay_log_index
relay_log_info_file relay-log.info
Variable_name Value
relay_log_purge ON
relay_log_space_limit 0
report_host
report_password
report_port 3306
report_user
rpl_recovery_rank 0
secure_auth OFF
secure_file_priv
server_id 0
skip_external_locking ON
skip_name_resolve OFF
skip_networking OFF
skip_show_database OFF
slave_compressed_protocol OFF
slave_exec_mode STRICT
slave_load_tmpdir /tmp
slave_net_timeout 3600
slave_skip_errors OFF
slave_transaction_retries 10
slow_launch_time 2
slow_query_log ON
slow_query_log_file /var/log/mysqld-slow-query.log
socket /var/run/mysqld/mysqld.sock
sort_buffer_size 33554432
sql_auto_is_null ON
sql_big_selects ON
sql_big_tables OFF
sql_buffer_result OFF
sql_log_bin ON
sql_log_off OFF
sql_log_update ON
sql_low_priority_updates OFF
sql_max_join_size 18446744073709551615
sql_mode
sql_notes ON
sql_quote_show_create ON
sql_safe_updates OFF
sql_select_limit 18446744073709551615
sql_slave_skip_counter
sql_warnings OFF
ssl_ca
ssl_capath
ssl_cert
ssl_cipher
ssl_key
storage_engine MyISAM
sync_binlog 0
sync_frm ON
system_time_zone MSK
table_definition_cache 256
table_lock_wait_timeout 50
table_open_cache 256
table_type MyISAM
thread_cache_size 8
thread_handling one-thread-per-connection
thread_stack 196608
time_format %H:%i:%s
time_zone SYSTEM
timed_mutexes OFF
timestamp 1360418592
tmp_table_size 536870912
tmpdir /tmp
transaction_alloc_block_size 8192
transaction_prealloc_size 4096
tx_isolation REPEATABLE-READ
unique_checks ON
updatable_views_with_limit YES
version 5.1.49-3-log
version_comment (Debian)
version_compile_machine x86_64
version_compile_os debian-linux-gnu
wait_timeout 28800
warning_count 0
itstrue
Дата: 09.02.2013 18:05:40
И еще вопрос, как загрузка CPU может быть больше 100%?
romy4
Дата: 09.02.2013 18:17:52
itstrue,

в никсах 100% это загрузка 1 ядра. Если ядер больше, то может и 200% и 300%
javajdbc
Дата: 09.02.2013 18:28:02
itstrue,

как всегда, такого типа задачи решаются комплексно.
С трех-четырех разных сторон:

1.
wget mysqltuner.pl
perl mysqltuner.pl

(я не специалист но) мне показалось что, например ино-пул-буфер маленький

2.
slow query log, читать, думать

3.
трейсить запросы из приложения и вылавливать
которые долгие/массивные

4. оптимизировать процесс, преагрегировать, кешировать, итд.

5. нарашивать мошности -- память, ЦПЮ, кластеры....
itstrue
Дата: 09.02.2013 18:38:34
javajdbc
itstrue,

как всегда, такого типа задачи решаются комплексно.
С трех-четырех разных сторон:

1.
wget mysqltuner.pl
perl mysqltuner.pl




Качаю.

javajdbc
(я не специалист но) мне показалось что, например ино-пул-буфер маленький


InnoDB не используется, только MySAM.

javajdbc
2.
slow query log, читать, думать



Он пустой, да и запрос там один массивный, на выдачу объявлений.

javajdbc
3.
трейсить запросы из приложения и вылавливать
которые долгие/массивные


Запрос известен, но там запрашиваются все лимиты: настройки по дате, гео, времени, лимитам. Без них нельзя. Выход?

javajdbc
4. оптимизировать процесс, преагрегировать, кешировать, итд.


Всегда ЗА! :)

javajdbc
5. нарашивать мошности -- память, ЦПЮ, кластеры....


Машина и так не слабенькая, 32 Гб памяти, можно вообще туда загрузить всю текущую конфигурацию :)

А с кластерами я не особо понимаю, нужен специалист, мне бы понять - другого решения нет сейчас? Тогда уже будем думать о привлечении кого-то со стороны.
miksoft
Дата: 09.02.2013 18:49:23
itstrue
InnoDB не используется, только MySAM.
Почему?
miksoft
Дата: 09.02.2013 18:51:13
itstrue
запрос там один массивный
Ну показывайте уже. Желательно сразу с планом и с DDL всех участвующих таблиц. И с указанием текущего времени выполнения запроса, а так же с размером таблиц и т.п.
Arhat109
Дата: 09.02.2013 20:00:37
miksoft,

А чего там показывать-то? Сервак в 32 гектара, а буфера выделены, меньше чем у ноутбука...

myisam_sort_buffer_size = 8_388_608, при том что max_allowed_packet=16_777_216 ?!? на диске сортировать прикажете?

ещё: max_heap_table_size=536_870_912 ... полгектара... зажали, да? :)

Внимательно посмотрите на согласование параметров как промеж себя так и согласно вашему запросу, тем более раз он у Вас совсем один... :)