HHVM fastcgi + Nginx性能波动

目前我们开始在生产环境中使用HHVM,到目前为止,几乎所有的结果都非常有效。 与使用APC的PHP-FPM相比,我们的总体交易率大大提高。 几乎所有的请求都在500ms以下,但是每对请求(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 

我们使用这些相关的configuration运行networking服务器的nginx(如果我忘了importand这里,我很抱歉)。

 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; 

服务器有128GB的内存和24个核心(超线程所以实际上是12)。

我们在https://github.com/facebook/hhvm/wiki/Runtime-options上进行了一些search,但是大多数选项并没有很好的解释,所以我不知道他们在做什么,在生产环境中testing它们是有点可怕。

如果这里有任何人有类似的问题,或者可能指向我的方向与一些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 } 

我们正在使用supervisord来启动HHVM,所以在这里的主pipeconfiguration如下:

 [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 

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 

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

HHVM产生了很多的表现文件,还有一堆sess_文件。 总共有超过800万个文件在/ tmp目录中。 消除我们的问题后,消失了,几乎所有的要求都有显着提高的性能。 此外,会话文件不应该在那里,但这是一个已经解决的问题。

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