HHVM fastcgi + Nginx性能波动

Fra*_*aak 6 php mysql performance nginx hhvm

目前,我们已开始在生产环境中使用HHVM,到目前为止,几乎所有结果都非常令人反感.与使用APC的PHP-FPM相比,我们的整体交易率大大提高.几乎所有请求都在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
Run Code Online (Sandbox Code Playgroud)

我们正在为这些相关配置的网络服务器运行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;
Run Code Online (Sandbox Code Playgroud)

服务器有128GB内存和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
Run Code Online (Sandbox Code Playgroud)

和/etc/hhvm/config.hdf

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

MySQL {
  TypedResults = false
}
Run Code Online (Sandbox Code Playgroud)

我们正在使用supervisord启动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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

Mysql版本:

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
Run Code Online (Sandbox Code Playgroud)

Fra*_*aak 2

所以我们设法弄清楚,这是 HHVM 和我们正在使用的应用程序的综合问题。

HHVM 生成相当多的 perf-****.map 文件,并且还生成大量 sess_ 文件。/tmp 目录中总共有超过 800 万个文件。消除这些问题后,我们的问题就消失了,几乎所有请求的性能都得到了显着提高。此外,会话文件一开始就不应该存在,但这是一个已经解决的问题。

现在,我们通过将 -vEval.PerfPidMap 添加到启动参数来禁用 perf- 文件的生成。