Высокая нагрузка на сервер из-за mysql

Мы используем VPS и испытываем высокую нагрузку, вызванную сервером mysql. В настоящее время мы не можем найти причину этой проблемы, и поэтому я надеюсь, что кто-то может указать мне правильное направление.

VPS имеет 4 процессора и 4 ГБ (18/11 EDIT: теперь 8 ГБ) оперативной памяти. Информация о дисках недоступна, но я считаю, что они не самые быстрые. На этом VPS мы запускаем 1 установку magento CE 1.7.0.2 с 20 интернет-магазинами и 8 установками wordpress (подключенными к системе magento). У нас есть некоторые пользовательские расширения, установленные в системе magento. Мы используем Ubuntu 13.04 с Nginx 1.2.6, mysql 5.5.34, PHP 5.4.9, Polishd 3.0.4 и используем APC в качестве кэшера кода операции.

При беге сверху:

top - 13:58:21 up 17:51,  2 users,  load average: 4.40, 4.09, 3.91
Tasks: 119 total,   3 running, 116 sleeping,   0 stopped,   0 zombie
%Cpu(s): 94.0 us,  3.5 sy,  0.0 ni,  2.0 id,  0.2 wa,  0.0 hi,  0.0 si,  0.3 st
KiB Mem:   4049220 total,  3101744 used,   947476 free,   253548 buffers
KiB Swap:  1044476 total,    22324 used,  1022152 free,  1442356 cached
PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
22378 mysql     20   0 3439m 588m 7888 S 224.0 14.9  73:21.99 mysqld
24650 eemeega6  20   0  532m  56m  28m S  26.0  1.4   0:11.25 php5-fpm
24658 eemeega6  20   0  534m  57m  27m S  25.8  1.5   0:02.80 php5-fpm
24649 eemeega6  20   0  529m  58m  33m S  25.4  1.5   0:12.95 php5-fpm
24652 eemeega6  20   0  532m  61m  33m R  22.2  1.5   0:05.00 php5-fpm
24659 eemeega6  20   0  538m  59m  25m R  16.6  1.5   0:00.83 php5-fpm
24661 eemeega6  20   0  533m  55m  27m S  16.2  1.4   0:00.81 php5-fpm
24648 eemeega6  20   0  535m  65m  34m S  15.4  1.7   0:14.46 php5-fpm
24653 eemeega6  20   0  536m  64m  32m S  11.8  1.6   0:04.55 php5-fpm
24662 eemeega6  20   0  533m  49m  21m S   6.2  1.3   0:00.31 php5-fpm
1236 nobody    20   0  731m 369m  76m S   1.0  9.4   6:38.74 varnishd
22478 www-data  20   0 90532  10m 1044 S   0.4  0.3   0:07.56 nginx
10 root      20   0     0    0    0 S   0.2  0.0   2:29.32 rcu_sched
247 root      20   0     0    0    0 S   0.2  0.0   1:20.05 jbd2/dm-0-8`

Наш файл my.cnf имеет следующие значения:

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address        = 127.0.0.1

key_buffer      = 64M
max_allowed_packet  = 1M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 50
table_cache            = 2048
table_definition_cache = 1024
#thread_concurrency     = 10
thread_cache_size       = 24
wait_timeout        = 60
interactive_timeout = 60

query_cache_limit   = 1M
query_cache_size        = 64M

log_error = /var/log/mysql/error.log
log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 8
#log-queries-not-using-indexes = /var/log/mysql/mysql-not-indexes.log

expire_logs_days    = 10
max_binlog_size         = 100M

#InnoDB
innodb_buffer_pool_size = 1280M
innodb_additional_mem_pool_size = 32M
innodb_log_buffer_size = 1M
innodb_thread_concurrency = 8
innodb_lock_wait_timeout = 60

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer      = 16M

!includedir /etc/mysql/conf.d/

Наш вывод из mysqltuner.pl:

[--] Reads / Writes: 97% / 3%
[--] Total buffers: 1.4G global + 2.7M per thread (50 max threads)
[OK] Maximum possible memory usage: 1.6G (40% of installed RAM)
[OK] Slow queries: 0% (0/1M)
[OK] Highest usage of available connections: 42% (21/50)
[OK] Key buffer size / total MyISAM indexes: 64.0M/35.4M
[OK] Key buffer hit rate: 99.8% (902K cached / 1K reads)
[!!] Query cache efficiency: 1.2% (16K cached / 1M selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 739K sorts)
[!!] Joins performed without indexes: 129
[OK] Temporary tables created on disk: 5% (56K on disk / 1M total)
[OK] Thread cache hit rate: 99% (21 created / 16K connections)
[OK] Table cache hit rate: 24% (940 open / 3K opened)
[OK] Open file limit used: 9% (378/4K)
[OK] Table locks acquired immediately: 100% (4M immediate / 4M locks)
[OK] InnoDB data size / buffer pool: 339.7M/1.2G

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Adjust your join queries to always utilize indexes
Variables to adjust:
    query_cache_limit (> 1M, or use smaller result sets)
    join_buffer_size (> 128.0K, or always use indexes with joins)

Мы запускали mysql дольше, чем 24 часа, и использовали большинство настроек, оптимизированных в соответствии с mysqltuner и tuning-primer. Использованные функции восстановления и оптимизации для оптимизации всех баз данных.

К сожалению, mysql переключается на диск, и я думаю, что это высокая загрузка процессора.

Я надеюсь, что кто-то может указать мне правильное направление поиска причины подкачки/высокой нагрузки. Мы не сталкиваемся с медленными запросами журнала (только при переиндексации magento).

Если кому-то нужна дополнительная информация, пожалуйста, спросите меня.

[РЕШЕНИЕ]:

Таким образом, мы решили эту проблему, отключив постоянные соединения в php.ini: mysql.allow_persistent = Off Мы заметили снижение использования ЦП из-за mysql. Tuning-prmier больше не жалуется на то, что наши приложения не закрывают соединения. У нас есть некоторые улучшения, которые нужно внести, поскольку не все наши запросы правильно используют индексы, но на данный момент это исправление помогает нам поддерживать наш сервер в рабочем состоянии.

С уважением, Сандер.


person Sander    schedule 15.11.2013    source источник
comment
Вы уверены, что медленные запросы не являются проблемой? Joins performed without indexes: 129 Видел случаи, когда при добавлении индекса загрузка процессора падала с 200 до 30%. Я бы начал с проверки сторонних таблиц.   -  person Simon H    schedule 18.11.2013
comment
Спасибо Саймон Х, я изучаю медленные запросы. Я должен признать, что есть много запросов без выполнения индексов. Я еще не знаю, как правильно добавить индексы (на каких полях). Является ли увеличение join_buffer_size хорошей идеей?   -  person Sander    schedule 20.11.2013
comment
Как правило, хорошей идеей является добавление индекса для столбцов, которые используются для соединений. Чтобы идентифицировать запросы, вы можете использовать журнал медленных запросов или запрос типа SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, LEFT(INFO, 51200) AS Info FROM information_schema.PROCESSLIST; для определения текущих запросов.   -  person Simon H    schedule 20.11.2013
comment
Я уже просматривал неиндексированные запросы в файле mysql-slow.log после включения log-queries-not-using-indexes, поэтому я заметил, что было много запросов без индексов. И действительно, большинство запросов исходят от сторонних расширений (хорошее предположение!), что затрудняет улучшение. Я пройдусь по файлу неиндексированных запросов и добавлю индексы. Результаты опубликую позже. Спасибо за вашу помощь!   -  person Sander    schedule 20.11.2013


Ответы (3)


Я обнаружил, что производительность сервера можно «повысить» с помощью различных вещей, вот некоторые из них:

  1. Выяснение того, сколько памяти вам нужно, чтобы MySQL мог обрабатывать все ваши данные, а также предоставление наличных выполненных SQL-запросов. Вы можете прочитать все, что связано с памятью здесь и понимать, как это работает. После этого вы можете Включить поддержку больших страниц

  2. Я обнаружил, что вы можете повысить производительность, включив APC, где вы можете увидеть, как это повышает вашу производительность. Также взгляните на это.

  3. Использование лака, но это длинная история, чтобы писать здесь. Это сводится к тому, что вам нужен очень хороший конфиг, чтобы он работал идеально.

  4. Если у вас по-прежнему возникают проблемы, попробуйте использовать Xdebug, чтобы узнать, что мешает каждому процессу. . Вы можете сделать это с самого начала, так как ваш MySQL будет пытаться выполнить все, что вы от него попросите, но по 1 процессу за раз. Поэтому он будет хранить каждый процесс, который он не может выполнить, в памяти, и если это произойдет, он переполнит вашу память.

Я пришел к выводу, что чем больше вещей, связанных с php/mysql (для чего вашему серверу требуется время/ресурсы), которые вы можете повторно использовать, получая их из своих денег (Varnish, APC, MySQL mem), тем больше соединений он может обрабатывать без создание высокой нагрузки на сервер.

person gelleby    schedule 15.11.2013
comment
Привет Геллеби, 1. хорошо, я посмотрю на это. 2. у нас есть APC с поддержкой. Добавлю в исходный пост, забыл упомянуть. 3. у нас установлен лак версии 3.0.4. 4. Хорошо, хороший совет, я попробую. - person Sander; 15.11.2013
comment
Привет, Сандер, что тебе говорит APC? Можете ли вы опубликовать график, пожалуйста? Какой конфиг вы используете для лака? И, наконец, вы уверены, что каждый сайт WP и Magento работает с хорошим кодом? - person gelleby; 15.11.2013
comment
Здравствуйте, Геллеби! См. нашу диаграмму APC здесь: emega.nl/apc-diagram.jpg Что касается нашей конфигурации Varnish, мы интегрировали расширение Phoenix PageCache, и оно поставляется с файлом конфигурации, который мы изменили для наших портов и IP-адресов. Я могу опубликовать файл конфигурации выше, если хотите, но я думаю, что в нашей конфигурации mysql что-то не так, и я не могу найти, поэтому мой пост здесь. - person Sander; 17.11.2013
comment
Пробовали ли вы использовать другие настройки для MySQL? Следовал примеру на эта страница? Или попробуйте дать MySQL больше памяти? - person gelleby; 18.11.2013
comment
Мы используем tuning-primer и mysqltuner для оптимизации конфигурации mysql. Мы увеличили объем памяти до 8 ГБ, и я настроил mysql на использование 4 ГБ, но mysqltuner и tuning-primer не жаловались на использование всей памяти. Я пробовал mysqlreport, и это показывало, что используется 99% памяти. Но после увеличения памяти проблема осталась. Есть ли у вас какие-либо предложения относительно конфигурации mysql? Спасибо за сотрудничество! - person Sander; 18.11.2013
comment
Вы пытались использовать Xdebug, чтобы узнать, что задерживает каждый процесс? Вы сказали, что mysql внезапно начал потреблять процессор, что-то должно было измениться? Обновления WP/Magento, плохой сценарий, циклический код PHP,... MySQL не может быть проблемой, потому что обычно ее никогда не бывает ;) - person gelleby; 18.11.2013
comment
Сандер, я кое о чем подумал, у тебя на сервере установлен suPHP? Если да, то попробуй удалить... - person gelleby; 19.11.2013

Вы проверили свободное место? Однажды у нас возникли некоторые проблемы из-за огромных текстовых файлов журнала, которые создает magento. Убедитесь, что на ваших сайтах magento отключена ошибка журнала в меню «Разработчик» -> «Настройки журнала». Размер этих файлов не ограничен! По крайней мере, это то, что я знаю. Надеюсь, это поможет вам. Ваше здоровье!

person vbak    schedule 15.11.2013
comment
Здравствуйте vbak, Спасибо за ваш ответ. У нас отключены настройки журнала, так как это живая среда. У нас есть 120 ГБ свободного места на диске, так что это не должно быть проблемой. Спасибо за ваш вклад. - person Sander; 15.11.2013

Шлифовальный,

Не уверен насчет сервера, хотя работа в magento нашла кое-что полезное, на что вы, возможно, захотите обратить внимание.

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

  • простая спираль
  • Следующий
  • Peer1хостинг
  • Зеролаг

Также однажды я прочитал о кластеризации magento с большими данными и доступом клиентов (крупные транзакции БД), которая выполняется на уровне Интернета, базы данных и файловой системы.

Вот руководство, как это сделать:

http://www.severalnines.com/blog/how-cluster-magento-nginx-and-mysql-multiple-servers-high-availability

Также несколько простых, но полезных советов:

  • Включить слияние файлов js, css
  • Выключить журнал
  • Включить компиляцию
  • Установить индексатор cron

Я считаю, что такие же вещи должны быть доступны и для WordPress.

Надежда выше может немного помочь, если не полностью.

person Sunil Verma    schedule 15.11.2013
comment
Здравствуйте, SKV, спасибо за ваш вклад. У нас включено слияние js/css, журнал отключен, так как это живой сервер. Компиляция в настоящее время отключена, так как у нас есть apc, и нам нужно было очень часто компилировать из-за изменений. У нас есть индексатор, настроенный с помощью cron, и мы используем NICE для определения приоритетов индексов, которые выполняются в одночасье. - person Sander; 15.11.2013
comment
Сандер, я рад, что тогда вам следует переместить некоторые из ваших сайтов либо на WP, либо на Magento в другие места, возможно, и я надеюсь, что все ваши сайты генерируют бизнес ... и сервер не может взять на себя нагрузку. - person Sunil Verma; 15.11.2013
comment
Спасибо, SKV, но я считаю, что наш сервер должен справиться с такой нагрузкой. Ежедневно мы видим около 3 тысяч уникальных посетителей (согласно аналитике) и ежедневно делаем 20-30 заказов. Я думаю, что сервер должен справиться с этим, и он делал это пару недель назад. Но потом внезапно mysql начал потреблять процессор, и теперь мы выясняем, как решить эту проблему. Загрузка сервера увеличилась со 100-150% до 250-300% без большой разницы в трафике или заказах. - person Sander; 17.11.2013