Назад | Перейти на главную страницу

улучшить скорость сервера mysql для приложения, размещенного на VPS

У меня на VPS запущено несколько приложений. Эти приложения созданы на PHP и используются в социальных сетях. В настоящее время у меня проблемы со скоростью сервера. Мой VPS имеет следующие характеристики:

CPU 2x2000GHz
Memory: 3Gb
SAS 15K 100 Gb
CentOS 5.5

my.cnf (движок MyIsam):

max_connections=80
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 128
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
query_cache_type=1
query_cache_size=20M
server-id       = 1
[mysqldump]
quick
max_allowed_packet = 10M
default-character-set = cp1251
[mysql]
no-auto-rehash
default-character-set = cp1251
[isamchk]
key_buffer = 8M
sort_buffer_size = 8M
[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M

Также мы установили memcached:

PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="500"
OPTIONS="-l 127.0.0.1"

очень небольшая часть списка процессов сервера mysql:

ОБНОВЛЕНИЕ 1

| 314041 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Sending data     | SELECT `uid` FROM `obschaga_users` WHERE `uid`>0                                   | 
| 314045 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Locked           | UPDATE `obschaga_users` SET `online`=1306785866 WHERE `uid`=46217997 LIMIT 1       | 
| 314046 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Locked           | UPDATE `obschaga_users` SET `online`=1306785866 WHERE `uid`=21704816 LIMIT 1 

Проблема заключается в загрузке 60-80% при 200-280+ подключений к веб-серверу Apache. Не могли бы вы исправить мои настройки сервера mysql / memcached, чтобы ускорить работу сервера? Если вам нужна дополнительная информация о конфигурации сервера - просто дайте мне знать.

Заранее спасибо.

ОБНОВЛЕНИЕ 2

Периодически сталкиваюсь со следующей проблемой:

-bash-3.2# uptime
-bash: fork: Cannot allocate memory

show status like 'Threads_connected'; команда показывает 93 потока. Я полагаю, когда сервер не отвечает на команды, потоков гораздо больше.

Иногда бывает и следующая ошибка:

ERROR 1040 (00000): Too many connections

Процессы MySQL следующие:

  | 1630030 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `sex` FROM `obschaga_users` WHERE `uid`<>134663653 and `club`=1 and `online`>=1306849507      | 
    | 1630031 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `level`,`clan`,`silver`,`win`,`lost`,`val`,`otkaz`,`wgift` FROM `obschaga_users` WHERE `uid`= | 
    | 1630032 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `uid`,`online` FROM `obschaga_users` WHERE `uid` IN (96113249, 88303183, 123525384, 37125913, | 
    | 1630033 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `obsch`,`online` FROM `obschaga_users` WHERE `uid`=114941284 LIMIT 1                          | 
obschaga_users` WHERE `uid`= | 
    | 1630036 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT `uid1` FROM `obschaga_wait_friend` WHERE `uid0`=39448276 and `state`=10 LIMIT 1     

Забавный момент, что памяти много free -mto показывает:

             total       used       free     shared    buffers     cached
Mem:          3000       1111       1888          0          0          0
Swap:            0          0          0
Total:        3000       1111       1888

Я должен показать cat /proc/user_beancounters или ulimit -a ?

Меняю свой комментарий на ответ

  1. Убедитесь, что вы не исчерпываете максимальное количество подключений, равное 60. Бегите show status like 'Threads_connected'; в часы пик, чтобы увидеть, достигли ли вы максимума.

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

    bulk_insert_buffer_size=32M 
    join_buffer_size=4M 
    key_buffer_size=128M 
    max_allowed_packet=32M 
    query_cache_limit=4M 
    read_buffer_size=1M 
    read_rnd_buffer_size=2M 
    sort_buffer_size=8M 
    table_cache=128 
    tmp_table_size=32M
    

Скорее всего, ваша конфигурация в порядке. Гораздо более вероятно, что в ваш код будут внесены алгоритмические улучшения. Вы не упомянули, была ли нагрузка сгенерирована Apache, MySQL или чем-то еще. Это первое, что нужно проверить. Если это Apache, начните с профилирования вашего PHP-кода. xhprof отлично подходит для этого.

Если MySQL, вероятно, виноват, изучите журнал медленных запросов. Также потратьте время на использование ОБЪЯСНИТЕ заявление.

Этот SQL-запрос также является подозрительным:

SELECT `uid` FROM `obschaga_users` WHERE `uid`>0

Похоже, что он вернет каждый uid во всей таблице (я сомневаюсь, что многие uid отрицательны). Если этот запрос выполняется в вашем приложении, это, вероятно, огромная проблема с производительностью. По крайней мере, убедитесь, что в столбце uid есть индекс. Однако на самом деле такие запросы никогда не следует использовать. Должен быть способ иметь какие-то дополнительные условия поиска для уменьшения количества возвращаемых данных.

Вы показываете только 3 процесса в вашем списке, 2 из которых записывают и 1 читают. MyISAM выполняет блокировку таблиц для записи.

Вы можете возиться, сколько хотите, но вам, вероятно, стоит подумать о том, чтобы получить еще один VPS и поставить на него только MySQL. то есть иметь уровень веб-приложения / приложения и уровень БД. Вероятно, вам также следует серьезно взглянуть на миграцию на InnoDB, который имеет большую блокировку параллелизма / на уровне строк.

Ура