[FreeBSD]Apache 噴出 signal Segmentation fault (11)

最近在玩 FreeBSD 伺服器的加強效能,其實我自己試了很多套:eAcceleratorPear APC,跟 Zend Optimizer,這三套都是可以加速php的速度,當你的 apache 效能遇到瓶頸,就可以選用這三個來改善網頁瀏覽速度,不過應該沒有人三個都用吧,畢竟三個東西,感覺都是cache幫助,所以達成我們所想要的要求,有時候並不是全部安裝就是代表你的伺服器一定會超快,因為我的經驗是三個不能同時裝,只要裝了兩個都會出問題,這是我這幾天測試的結果,只要裝了Pear APC,就不能裝Zend Optimizer跟eAccelerator了,因為我的 httpd 的 log 會噴出底下訊息:
signal Segmentation fault (11) 跟 pid 15879 (httpd), uid 80: exited on signal 11
這三種的安裝方式都非常簡單,先找ports在哪,然後 make install clean 就可以了
#
#Zend Optimizer:
#
cd /usr/ports/devel/ZendOptimizer; make install clean
#
#eaccelerator:
#
cd /usr/ports/www/eaccelerator;make install clean
#加入 php.ini
zend_extension="/usr/local/lib/php/20060613-zts/eaccelerator.so"
eaccelerator.shm_size="500"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="0"
eaccelerator.optimizer="1"
eaccelerator.log_file = "/var/log/eaccelerator_log"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys = "shm_and_disk"
eaccelerator.sessions = "shm_and_disk"
eaccelerator.content = "shm_and_disk"
APC 安裝請參考 [FreeBSD] 安裝 PHP APC 加速網頁速度 PHP 加速器的調校(php-eaccelerator) 這一套,我就覺得相當好用,可是她會陸續噴出 signal Segmentation fault (11) 跟 uid 80: exited on signal,所以我自己又把它移除了,我參考網路上一篇 PHP – PHP 加速器的調校(php-eaccelerator),裡面寫到:
由於 PHP 屬於直譯語言,因此當放在 Web 伺器器上的 PHP 程式碼被瀏覽者所讀取時,系統為了要執行 PHP 程式碼就必須要使用直譯器(interpreter),將 PHP 程式碼翻譯成電腦系統看得懂(或可以執行)的語言。這個直譯的動作是非常耗費系統資源的,而直譯語言的特性偏偏就是每次執行前都要先進行直譯的動作,因此當您放在 Web 伺服器上的 PHP 程式碼被 1000 個 client 讀取時,系統就要進行 1000 次的直譯動作。而 PHP 加速器的功能就是會把被這些 PHP 程式碼快取(Cache)起來,也就是同一支程式碼只要被直譯一次而已,藉此大幅降低系統的負載。自己個人的經驗是:若你的 Web 伺服器流量非常大,有沒有使用 PHP 加速器會有非常大的差別。 php-eaccelerator 的安裝很容易,但麻煩的是後續的調整。一般來講,若你會需要安裝加速器通常就代表你遇上了效能的瓶頸,也就是系統負載過大所以才需要安裝它;但是 php-eaccelerator 有 BUG,當系統負載過大,php-eaccelerator 需要消除 Share Memory 中的老舊資料時,會導致 apache 出現如下的錯誤訊息並使 CPU 使用率衝上 100%,最後終將致使伺服器當機。
如果沒有調整好,就會造成這個問題,可是我按照他們的系統參數調整,還是一樣會噴出這情形,我的系統:
apache-worker-2.2.9
php5-5.2.6
都算是最新版本了,他們系統參數如下:
eaccelerator.shm_size = "500"
#預設是32MB,這裡設為500MB

eaccelerator.cache_dir = "/var/cache/php-eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "0"
#預設是 1 (開啟),這裡設為 0 (關閉)

eaccelerator.debug = "0"
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.name_space = ""
eaccelerator.check_mtime = "1"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
#預設是3600,這裡設為0,也就是不移除Share Memory中的任何資料。

eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"
eaccelerator.keys = "shm_and_disk"
eaccelerator.sessions = "shm_and_disk"
eaccelerator.content = "shm_and_disk"
其實改成上面那樣也沒用,所以我又把它移除了,在裝一次 Pear APC 試試看,不過這次有加開三個選項:
Enable mmap memory support (default: IPC shm) 
Enable sysv IPC semaphores (default: fcntl())
Enable per request cache info
我把這三個選項勾起來,然後在重新編譯,在重新啟動 apache,竟然可以 work 了,完全沒有任何錯誤訊息了 參考網站: Alternative PHP Cache (APC)
  • Zend Optimizer其实只是用来解析zend encoder过的加密代码,除非用Zend的产品,对于性能帮助微乎其微。Zend 有自己的Zend Accelerator
    APC是PECL的子项目,一般不算PEAR的。
    Linux下最好还是用Apache Prefork的MPM,Worker的MPM要求所有模块都是线程安全的,更由于eaccelerator、apc都是要用到shared memory,和worker mpm搭配如果其中没有很好地解决线程安全是很危险的。FreeBSD应该也类似。