Колебания производительности HHVM fastcgi + Nginx

В настоящее время мы начали использовать HHVM в производственной среде, и на данный момент почти все результаты впечатляют. Наша общая скорость транзакций значительно улучшилась по сравнению с PHP-FPM с APC. Почти все запросы занимают менее 500 мс, однако каждая пара запросов (от 5 до 10 или около того) приводит к времени запроса от 2 до даже 5 секунд.

Запрошенная страница, похоже, не имеет никакого значения, а также повторный запрос одной и той же страницы вызовет такое поведение в течение нескольких запросов.

Мы запускаем HHVM в режиме сервера со следующими параметрами командной строки:

/usr/bin/hhvm --mode server -vServer.Type=fastcgi -vServer.FileSocket=/usr/local/php55/sockets/admin.sock -vPidFile=/var/run/hhvm/admin.pid -vEval.Jit=true -vServer.ThreadCount=24 -vServer.APC.EnableApc=true

Мы используем nginx для веб-сервера с этими соответствующими конфигурациями (извините, если я забыл что-то важное здесь).

fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_read_timeout 240;
fastcgi_intercept_errors on;

На сервере 128 ГБ памяти и 24 ядра (гиперпоточность, так что фактически 12).

Мы немного поискали на https://github.com/facebook/hhvm/wiki/Runtime-options однако большинство опций не очень хорошо объяснены, поэтому я понятия не имею, что они делают, и тестировать их в производственной среде немного страшно.

Если бы у кого-нибудь здесь была похожая проблема или, возможно, он мог бы указать мне направление с некоторыми вариантами HHVM, я был бы очень благодарен.

Используемая версия HHVM взята из http://www.hop5.in/yum/el6/.

HipHop VM 3.0.1 (rel)
Compiler: 
Repo schema: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

И файл /etc/hhvm/config.hdf

Log {
  Level = Warning
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
}

MySQL {
  TypedResults = false
}

Мы используем супервизор для запуска HHVM, так что здесь также конфигурация супервизора:

[program:hhvm]
stopasgroup=true
killasgroup=true
command=/usr/bin/hhvm --mode server -vServer.Type=fastcgi -vServer.FileSocket=/usr/local/php55/sockets/admin.sock -vPidFile=/var/run/hhvm/admin.pid -vEval.Jit=true -vServer.ThreadCount=24 -vServer.APC.EnableApc=true 
user=admin
stdout_logfile=/var/log/hhvm/admin.log
stderr_logfile=/var/log/hhvm/admin.error.log
directory=/home/admin
umask=000

В файле /etc/hhvm/php.ini есть файл php.ini, но его содержимое пусто. Кроме того, все страницы пытались подключиться к базе данных, но обычно это минимально. Для полной картины также файл my.cnf. Используемая версия mysql - percona

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/mysql.sock

[mysqld]

# GENERAL #
user                           = mysql
default-storage-engine         = InnoDB
socket                         = /var/lib/mysql/mysql.sock
pid-file                       = /var/lib/mysql/mysql.pid

[mysqld]

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

# SAFETY #
max-allowed-packet             = 128M
max-connect-errors             = 1000000

# DATA STORAGE #
datadir                        = /var/lib/mysql/

# BINARY LOGGING #
log-bin                        = /var/lib/mysql/mysql-bin
expire-logs-days               = 14
sync-binlog                    = 1

# CACHES AND LIMITS #
tmp-table-size                 = 128M
max-heap-table-size            = 256M
query-cache-size               = 10G
max-connections                = 1000
thread-cache-size              = 100
open-files-limit               = 65535
table-definition-cache         = 4096
table-open-cache               = 4000
join-buffer-size               = 1M

# INNODB #
innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 512M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 73G

# LOGGING #
log-error                      = /var/lib/mysql/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /var/lib/mysql/mysql-slow.log

Версия майкл:

innodb_version  5.6.17-65.0
protocol_version    10
slave_type_conversions  
version 5.6.17-65.0-56-log
version_comment Percona Server (GPL), Release 65.0, Revision 587
version_compile_machine x86_64
version_compile_os  Linux

person Fraak    schedule 15.07.2014    source источник
comment
У меня есть опыт работы с HHVM + Hack Lang. Не могли бы вы показать нам ваш hhvm server.ini + php.ini? То же самое для NGINX + FastCGI. Какую версию hhvm вы используете? Выполняет ли запрос что-либо? или подключиться к базе данных?   -  person Tyralcori    schedule 15.07.2014


Ответы (1)


Итак, нам удалось выяснить это, это была комбинированная проблема HHVM и приложения, которое мы используем.

HHVM выдаёт довольно много файлов perf-****.map и там же куча файлов sess_. Всего в каталоге /tmp более 8 миллионов файлов. После их удаления наши проблемы исчезли, и почти все наши запросы значительно улучшились в производительности. Кроме того, файлы сеанса не должны были быть там в первую очередь, но это была проблема, которая уже исправлена.

Теперь мы отключили генерацию perf-файлов, добавив -vEval.PerfPidMap в наши аргументы запуска.

person Fraak    schedule 18.07.2014
comment
Вау, я только что заглянул в /tmp и увидел миллионы файлов sess_. Почему вы говорите, что их там быть не должно, и как вы решили проблему их генерации HHVM? - person pjv; 02.12.2014