Спустя полгода LS 0.4.2 стал тормозить, описание ситуации

Вот и меня настигла нелегкая карма.

Проблема: При записи пустяковых вещей (комменты, небольшие топики) в БД через интерфейс LS от любого пользователя стали наблюдаться тормоза около 10 секунд.
Причем не постоянно. Но все же тормозить последнее время все стало.
Перезагружаю серв — все некоторое время ннормально, потом опять начинается…

Вплоть до выдачи вот такой ошибки иногда: «ошибка 504 Gateway Time-out nginx» (стоит Apache+nginx, причем не совсем уверен, что оно правильно настроено, но более полугода сайт работал без нареканий).

Количество активных пользователей на сайте около 30.
Ежедневная посещаемость ~ 100 уников.
В режиме чтения сайт работает нормально.

Хостинг fastvps.ru (виртуальный выделенный серв):


Статистика из админки:




Часть Config'a:

/**
 * Настройки кеширования
 */
// Устанавливаем настройки кеширования
$config['sys']['cache']['use']    = true;               // использовать кеширование или нет
$config['sys']['cache']['type']   = 'memory';             // тип кеширования: file и memory. memory использует мемкеш
$config['sys']['cache']['dir']    = '___path.root.server___/tmp/';       // каталог для файлового кеша, также используется для временных картинок. По умолчанию подставляем каталог для хранения сессий
$config['sys']['cache']['prefix'] = 'livestreet_cache'; // префикс кеширования, чтоб можно было на одной машине держать несколько сайтов с общим кешевым хранилищем
$config['sys']['cache']['directory_level'] = 1;         // уровень вложенности директорий файлового кеша
$config['sys']['cache']['solid']  = true;               // Настройка использования раздельного и монолитного кеша для отдельных операций

/**
 * Настройки логирования
 */
$config['sys']['logs']['file']           = 'log.log';       // файл общего лога
$config['sys']['logs']['sql_query']      = false;           // логировать или нет SQL запросы
$config['sys']['logs']['sql_query_file'] = 'sql_query.log'; // файл лога SQL запросов
$config['sys']['logs']['sql_error']      = true;            // логировать или нет ошибки SQl
$config['sys']['logs']['sql_error_file'] = 'sql_error.log'; // файл лога ошибок SQL
$config['sys']['logs']['cron_file']      = 'cron.log';      // файл лога запуска крон-процессов
$config['sys']['logs']['profiler']       = false;           // логировать или нет профилирование процессов
$config['sys']['logs']['profiler_file']  = 'profiler.log';  // файл лога профилирования процессов

/**
 * Настройка memcache
 */
$config['memcache']['servers'][0]['host'] = 'localhost';
$config['memcache']['servers'][0]['port'] = '11211';
$config['memcache']['servers'][0]['persistent'] = true;
$config['memcache']['compression'] = true;


Statistics performance:


Команда top на сервере:


Команда free -m


— И еще, в PhpMyAdmin в «текущем состоянии mysql» вот эти строки подсвечены красным, намекая, что надо как-то исправить (что это?):

--- Обработчик ---
Handler_read_rnd	7,802 	 Количество запросов, на чтение строки, основанных на ее позиции. Большое значение переменной может быть обусловлено частым выполнением запросов использующих сортировку результата, выполнением большого числа запросов требующих полного сканирования таблиц, наличием объединений не использующих индексы надлежащим образом. 
Handler_read_rnd_next	267 k	 Количество запросов на чтение следующей строки из файла данных. Данное значение будет высоким, при частом сканировании таблиц. Обычно это означает, что таблицы не проиндексированы надлежащим образом или запросы не используют преимущества индексов.
--- Временные данные --- 
Created_tmp_disk_tables	90 	 Количество временных таблиц, автоматически созданных сервером на диске, во время выполнения SQL-выражений. Если значение Created_tmp_disk_tables велико, следует увеличить значение переменной tmp_table_size, чтобы временные таблицы располагались в памяти, а не на жестком диске.
--- Кеш индекса --- 
Key_reads	9,810 	 Количество физических операций чтения блока индексов с диска. Если значение велико - скорее всего, задано слишком маленькое значение переменной key_buffer_size. Коэффициент неудачных обращений к кешу может быть рассчитан как: Key_reads/Key_read_requests.
--- Объединения --- 
Select_full_join	40 	 Количество запросов-объединений, выполненных без использования индексов. Если значение переменной не равно 0, рекомендуется проверить индексы таблиц.
--- Сортировка --- 
Sort_merge_passes	14 	 Количество проходов, сделанных алгоритмом сортировки. При большом значении следует увеличить значение переменной sort_buffer_size.
--- Таблицы --- 
Opened_tables	4,535 	 Общее количество открывавшихся таблиц. При большом значении переменной рекомендуется увеличить размер кеша таблиц (table_cache).


Так вот, вопрос: как исправить ситуацию, чтобы LS летал как и прежде при добавлении топиков/комментов?

37 комментариев

avatar
Кеш чистили? У меня были подобные проблемы, когда винт начал сыпаться, после замены проблема исчезла. Проверить просто, перенести кеш файлы на рам диск…
avatar
Кеширование стоит как раз на память (если я правильно понимаю, это и есть «рам диск»?)
avatar
Но в /templates/cache/new все же появляются 7 каких-то файлов, а в /templates/cache/compiled/new 115 файлов лежит — значит ли это, что, не смотря на то, что стоит мемкеш, кеширование все равно идет на винт? и почему так?
А у вас такая проблема была с «504 Gateway Time-out nginx» тоже?
avatar
Да именно эти папки, конечно же на винт, это же темплейты скомпилированные. Нет 504 не было, с тормозами это не связано, это значит апач не отвечает. Судя по странному размеру памяти, у вас виртуальный сервер и с этого надо было начинать, ведь это очень важно. Похоже дело в том, что база выросла и его ресурсов уже не хватает.
avatar
включите плагин «профилировщик» на некоторое время (есть в комплекте), там можно посмотреть какой участок кода дает такой тормоз…
avatar
прошу прощения, как им пользоваться? мануал есть здесь где-нить?
avatar
Просто активировать плагин, включить профилирование в конфигах, и смотреть логи.
avatar
может быть мускуль надо потюнить… mysqltuner.pl
avatar
это где и как?
avatar
wget mysqltuner.pl && chmod +x mysqltuner.pl && ./mysqltuner.pl
avatar
wget mysqltuner.pl/mysqltuner.pl && chmod +x mysqltuner.pl && ./mysqltuner.pl
avatar
там еще http:// провалилось :)
avatar
Выполнил скрипт. Так понимаю, где двойной воскл_зн — ето трабл.
А конкретно что надо делать?


-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.51a-24+lenny5
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB +Federated -InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 5M (Tables: 130)
[--] Data in MEMORY tables: 0B (Tables: 1)
[!!] Total fragmented tables: 9

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 11d 0h 9m 30s (431K q [0.454 qps], 26K conn, TX: 491M, RX: 61M)
[--] Reads / Writes: 95% / 5%
[--] Total buffers: 26.0M global + 824.0K per thread (100 max threads)
[OK] Maximum possible memory usage: 106.5M (26% of installed RAM)
[OK] Slow queries: 0% (3/431K)
[OK] Highest usage of available connections: 6% (6/100)
[!!] Key buffer size / total MyISAM indexes: 16.0K/2.7M
[!!] Key buffer hit rate: 88.6% (4M cached / 550K reads)
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (756 temp sorts / 86K sorts)
[OK] Temporary tables created on disk: 5% (970 on disk / 16K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (4 open / 195K opened)
[OK] Open file limit used: 0% (8/1K)
[OK] Table locks acquired immediately: 99% (401K immediate / 402K locks)

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Enable the slow query log to troubleshoot bad queries
    Set thread_cache_size to 4 as a starting value
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    key_buffer_size (> 2.7M)
    query_cache_size (>= 8M)
    thread_cache_size (start at 4)
    table_cache (> 4)
avatar
в разделе recomendations всё написано, воспользуйтесь переводчиком
avatar
Судя по всему там еще жуткая нехватка памяти и нету своп раздела.
avatar
На хостинге в целом нехватка? free -m говорит 50% еще свободно для моего тарифа.
avatar
Да так и есть, просто -m выдает не привычно, а самое главное крайне не информативно информацию.
free -m
             total       used       free     shared    buffers     cached
Mem:          1980       1830        150          0          0       1160
-/+ buffers/cache:        669       1310
Swap:         3812          0       3812

И без -m
free
             total       used       free     shared    buffers     cached
Mem:       2027892    1874448     153444          0        244    1188452
-/+ buffers/cache:     685752    1342140
Swap:      3903752          0    3903752

Логи апача надо обязательно посмотреть.
avatar
/var/log/apache2/error.log?

а что там искать?
avatar
Тупо надписи почитать, он для того и существует и уже от их содержимого плясать дальше, но уже не как телепат, а как человек знающий что просиходит.
avatar
не могут ли быть эти тормоза связаны с rss (?) или gzip? Сейчас стабильно при создании топика наблюдаю «504 Gateway Time-out nginx», комменты создаются долго, но до таймаута пока не дошло…
avatar
как советуют некоторые в инете при такой ситуации, увеличивать время выполнения скрипта и менять хостера не хочу, т.к. дело тут не в этом — раньше то все норм работало.
avatar
то бишь искоренению проблемы не поможет — если увеличить время выполнения скрипта там до 5 минут даже — все равно ждать надо, а скорость раньше была молниеносной. При переходе на другой хостинг или добавления памяти ситуация даже если и изменится, то со временем (при увеличении БД или посещаемости) все опять начнет повторяться. Решения пока не нашел, ибо из меня скудный сисадмин.
avatar
нашел похожую проблему, пока сделал вот так. Посмотрим на результат некоторое время…
avatar
мало что изменилось, 504 ошибка стала появляться реже. Еще ньюанс: допустим, голосую за коммент — жду секунд 30, пока не появиться табличка «ваш голос принят». После голосую за коммент — жду уже не 30, а 3 секундлы… ну что за фигня… кеш?
avatar
Пробовали вместо memcached использовать файловый?
avatar
ТАк изначально было — давным давно, но посчитал, что мемкеш быстрее файлового… Советуете на файловый переключить?
avatar
мемкеш гораздо быстрее, зачем вам файловый?
avatar
дак вот и я про то что быстрее, просто уж не знаем на что грешить.
avatar
мемкэш одназначно быстрее, просто было предложение попробовать использовать файловый дабы сравнить и понять дело это в мемкеше или к каких то иных настройках впс.
avatar
Была такая же проблема, такой же примерно сайт. Попробуйте через phpmyadmin очистить таблицу сессий. Пока не разобрался почему, но в ней скопилось несколько сот тысяч записей, при сбросе тормоза прекратились.
avatar
У меня в этой таблице 229 записей — столько же, сколько и всего пользователей (а записи эти нужны, я так понимаю, чтобы смотреть, когда юзер последний раз посещал сайт). Т.е. проблема в данном случае не в этом, но спасибо за информацию — вдруг что.
avatar
просто для сведения — при переносе базы с сервера на сервер потерялось требование уникальности для полей таблиц сессии, поэтому она разрослась и капитально тормозила движок.
avatar
Попробуйте убрать memcache и перейти на xcache, у меня были подобные грабли, только не 504 а 502 ошибка появлялась и тормоза дикие были. В общем советую поставить последнюю версию xcache 1.32 и обновить nginx до 1.0.10, я недавно обновил — вроде как быстрее все стало и даже apache стал памяти жрать меньше.
avatar
спасибо, попробую, как руки дойдут (ну или выпрямятся :) )
avatar
всем спасибо за дельные комменты, советы очень пригодятся. трабл решился (хочется верить) благодаря убиению лишних процессов постфикса — т.е. трабл был в отправке почты юзерам при посте комментов.
avatar
А можно поподробнее про убийство процессов? Как проверить на VPS лишние процессы постфикса?
avatar
а сколько у кого весит процесс апача под LS? у меня получается

230 virt 32 res
на сайте ~100 уников, ~120К комментариев, ~20К топиков. Жрать столько памяти, по-моему, перебор. Так и должно быть или где-то течет?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.