2014-07-15 44 views
6

目前我們開始在生產環境中使用HHVM,並且到目前爲止幾乎所有的結果都非常不起眼。與使用APC的PHP-FPM相比,我們的整體交易率大大提高。幾乎所有的請求都在500ms以下,但是每對請求(5到10個)導致請求時間爲2到5秒。HHVM fastcgi + Nginx性能波動

請求的頁面似乎沒有任何區別,並且一次又一次地請求相同的頁面會在幾次請求中觸發此行爲。

我們在用下面的命令行選項服務器模式運行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服務器(我很抱歉,如果我忘了什麼事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上進行了一些搜索,但大多數選項都沒有很好地解釋,所以我不知道它們在做什麼,並且在生產環境中測試它們有點嚇人。

這裏有沒有人有類似的問題,或者可能指向我的方向與一些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監事配置爲WEL :

[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 
+0

我有一些HHVM + Hack Lang的經驗。你可以告訴我們你的hhvm server.ini + php.ini嗎? NGINX + FastCGI也一樣。 你使用什麼版本的hhvm? 請求是否執行某事。或連接到數據庫? – Tyralcori

回答

2

所以我們設法弄清楚,這是HHVM的組合問題,我們正在使用的應用程序。

HHVM產生了很多的地圖文件,還有一堆sess_文件。總共有超過800萬個文件在/ tmp目錄中。消除我們的問題後,消失了,幾乎所有的要求都得到顯着提升。此外,會話文件不應該在那裏,但這是一個已經修復的問題。

現在我們通過將-vEval.PerfPidMap添加到我們的啓動參數來禁用perf-files的生成。

+0

哇,我剛剛在/ tmp中看到了很多sess_文件。你爲什麼說他們不應該在那裏,你是如何「修復」HHVM產生它們的問題的? – pjv

+0

會話文件的極端數量是由於HHVM中的錯誤造成的。見https://github.com/facebook/hhvm/issues/3747#issuecomment-59141301。現在有一個修復程序,但我們只是添加了一個cronjob來清除舊的會話文件。 – Fraak

+0

謝謝,我在這裏寫了一篇關於我如何處理這個問題的文章:http://community.rtcamp.com/t/hhvm-session-files/3639/1 – pjv