目前我们开始在生产环境中使用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
我们正在运行nginx的web服务器与这些相关的配置(我很抱歉,如果我忘记了一些重要的东西在这里)。
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上做了一些搜索,但是大多数选项都没有很好地解释,所以我不知道它们是做什么的,在生产环境中测试它们有点可怕。
如果在座有人有类似的问题,或者可以给我指出一些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
}
我们正在使用supervisor来启动HHVM,所以这里也有supervisor配置:
[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产生相当多的性能-****。Map文件和那里也有成堆的sess_文件。总共有超过800万个文件在/tmp目录下。在消除了这些问题之后,我们的问题就消失了,几乎所有请求的性能都得到了显著提高。此外,会话文件本来就不应该在那里,但这是一个已经修复的问题。
现在我们通过添加- veval来禁用生成perf-文件。PerfPidMap到我们的启动参数