Google GCP 最近一直提示我的主機有「效能問題」,建議我升級成 g1-small 的方案,意思就是要從免費轉成一個月13USD的方案。第一時間還有點緊張,想說這樣會不會讓瀏覽數下降,沒思索太多就升級了,所以也才生出了之前的 Teraterm 設定 GCP金鑰快速 SSH 登入 這篇文章。但再仔細觀察了一下後,網頁載入的確是不快,但從監控的網頁來看 CPU 使用率都很低啊…於是又把方案改回了免費的 f1-micro,並趁這次機會研究了怎麼提升效能。
花了2天的時間,總算研究出了一些東西。
- 一個是為了”長遠”的未來研究的 “load balance” 負載平衡,哪天真的訪客多到滿出來(有那天?),可以再開第2台, 第3台, 第4台…preemptible的虛擬機,把一些流量動態轉移過去。
- 第二個是研究怎麼加速 Apache,把 MPM (Multi-Processing Module) 從 Prefork 改成 Event based 的。
這篇文章是要先介紹 Apache 的 Event MPM模組,這個較易套用,也能看出一些改善。另外,本文是以 Ubuntu 16.04 32bits 來做為解說,要套用命令時可能要注意一下。
Event Based 處理方式
Apache 可說是 opensource web server 的先驅,從 1995 釋出的第一版到目前 2019 的 2.4.41,這樣也有將近25年了。但在 2004 時就已經出現了一個強勁的對手,Nginx。Nginx 的最大優點的就是大幅超越 Apache 的效能,相比於 Apache 用了少很多的記憶體,但卻有4倍的效能。
其中一個主要的原因,就是 Apache 對於每個連線都 fork 出一個行程來處理,而 Nginx 在一開始只建立幾個行程,連線的處理則是以線程來進行。行程的產生相較於線程,是更消耗資源的,而在切換上也更花時間,也因此 Nginx 有著更好的效能。
為了改善這個弱項, Apache 也推出了稱為 Event Based 的 MPM,也的確對效能有些改善。
Apache 啟用 Event MPM
一般預裝的Apache會使用 Prefork MPM,因為這是相對穩定的模組了,為了最佳相容性,預設會啟用Prefork。當然也不是說 Event MPM不穩不相容,這都是相對於Prefork的。要怎麼知道自己用的 Apache 是否啟用 Event MPM 了呢?可以用下面指令來觀察使用的 MPM。
1 |
apachectl -V |
在輸出的狀態中,可以看到紅框這行表明了是使用 Prefork ,如果是用 Event MPM 就會顯示 Event。
設定 Event MPM
本文是參考 server fault 的這篇文章,截取出來的最終修改,有需要可參考原文。請下達下面的命令,來進行設定/安裝Event MPM所需的變動。
首先要修改設定檔,將站台的 .php 處理功能指向 php-fpm,如果是使用 http 的請編輯/etc/apache2/sites-available/000-default.conf,https 請編輯 /etc/apache2/sites-available/default-ssl.conf,然後加入以下設定:
接著以指令安裝設定下列項目
1 2 3 4 5 6 7 |
a2dismod php7.0 # 停用原本 process base php a2dismod mpm_prefork # 停用 prefork MPM 模組 a2enmod mpm_event # 啟用 event MPM 模組 a2enmod proxy_fcgi # 啟用 FastCGI 模組以搭配 PHP FPM apt-get -y install php7.0-fpm # 安裝 php fpm 套件 service apache2 restart service php7.0-fpm restart |
上面有提 php-fpm (FPM=FastCGI process manager),也是為了加快 Apace 在執行 PHP 時的速度。FastCGI 執行時不需重新建立一個行程,而是以固定的一個行程來處理 web server的請求,web server 會以UNIX socket的方式將資料傳遞給此行程來處理。可以看到早期都是以產生行程 (process) 來處理問題,我猜是早期還沒有 thread 的概念吧,或是先求有再求好,近期網路大發達才曝露出原本設計的弱點。
當完成上面設定後,再重新下 apachectl -V,應該就可以看到 Server MPM 變成 event 了。並且,在 ps -aux 內,也可以看到多了 php-fpm 的行程,這樣就算設定完成了。
效能改善
套用 Event MPM 後,個人是感覺有快一些些。參考網路上的比較,Event MPM 大概可以比 Prefork 快上 50%!聽起來好像還不錯的,的確以免錢方案來講算很好了,但Nginx的效能還是Event MPM的兩倍!不過把web server轉換到 Nginx 可能又是另一番功夫了,也許不會很難,但花的時間肯定是不會少的。
結語
剛開始架站時,對效能一般都不太要求,等到流量大起來後,又不敢隨便 shutdown 更新。所以如果是新架站的朋友,也許可以一開始就選用 Nginx ,畢竟現在 Nginx 市佔看起來跟 Apache 已經是1:1了,所以文件、穩定性都不差才對。如果你已經上了 Apache 的車,或技術能力不太夠,就先用這種方式擋著吧,或者是乾脆就升級成更高級的 CPU 方案,花錢了事也算是種 solution!
Latest Comments