512MB VPS如何不爆掉

視網膜效應:人,只會看到自己想看的東西。

IMG_9360.jpg

當初,在評估跳船到 DigitalOcean VPS的時候,眼睛裡看到的,是那開網頁的速度。從快10秒,到三秒鐘 (加拿大的GT metrix 測出來的是1.35秒)。後來換過去,真的 Loading 一來,不到一天就爆炸了。

第一次爆炸,是 mysql 掛掉。翻了一下 log 發現 mysql 想吃掉多一點的記憶體,可是這小小的 512MB VPS 根本沒有足夠的記憶體給它。原來,是沒開 swap,於是,開了個 swap file,就沒事了:

dd if=/dev/zero of=/swapfile bs=1024 count=1024k
mkswap /swapfile
swapon /swapfile

最後記得寫到 /etc/fstab 並且設好相關權限, mysql 就乖乖的了。

 

第二次爆炸,整個 server loading 變超高,用 top 看所有 physical memory 被吃光光,apache2 process 塞到 swap 去,每一個 process 都跑不完,後面的 request 又一直進來,典型的 swap thrashing,大爆炸。

那合理的動作應該就是幫 apache2 瘦身囉,先瘦下來,並且加快每個 request 處理的速度 (例如用 apc/op cache),但cache 又會吃掉一些記憶體,需要些 trade-off。上網查了一下 512MB VPS (主要是 for linode VPS的,不過一樣適用),先把 /etc/apache2/apache2.conf 同時可以 serve 的 request 降下來:

Timeout 60
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
 StartServers         1
 MinSpareServers      3
 MaxSpareServers      5
 MaxClients           15
 MaxRequestsPerChild  2000
</IfModule>

小到很好笑吧,真的敲敲計算機算出來 Max clients 時,連我自己都笑了。笑完後有些不甘心,本來想大刀砍下去,再開一台起來玩 php5-fpm (我省事用 mod_php5) 還是前端多擺個nginx 或是乾脆用 LEMP。後來想想算了,改天想不開再說 。

事還沒完,我還是開了另外一台VPS 起來,反正 DigitalOcean使用時數以小時計的,用完再 destory 掉就好。開另外一台起來作什麼呢? clone 現在這台的所有設定,然後ab 去測它,直到不會被打掛。邊打邊調,一會兒把 apc 打開調整設定以加快處理速度,一會兒又把 apc 給關掉給節省一點記憶體。記憶體不大的情況之下, apc 隨便設都會爆,後來索性就關掉了。 mysql 的 my.cnf 跟 php.ini 也是類似的調法,邊打邊調,調到最後那個設定數字我都覺得好笑,就不好意思 po 出來了。

喔對了,Wordpress 自己也要最佳化一下, WordPress W3 Total Cache 用 Disk based page 沒關係,反正是 SSD 相較之下還算蠻快的。P3 (Plugin Performance Profiler) 可以幫助你了解一下哪幾個 plugin 吃掉了你的執行時間,你可以 KO 或是換掉那些不乖的 plugin。

全部弄完後記得把設定 deploy 回要見公婆的主機,然後把 test server 作個 snapshot,之後就可以 destory 他了。

More to Go:

在〈512MB VPS如何不爆掉〉中有 6 則留言

  1. 看完了才发现是繁体的,哈哈,一点阅读障碍都没有。
    我的也是512m内存,优化apache和mysql之后,内存很少超过100m了。512m完全能撑起来一般的pv

    回覆
  2. 您好,小弟是新手,完全沒接觸過linux,
    最近在 DigitalOcean 學手動安裝lamp.

    系統剛裝好時,安裝wordpress 等,一切都正常,於是建立了映像(方便主機掛恢復).
    15 天左右,系統都還正常.
    不知道甚麼原因,第16 天左右居然掛了.

    於是想說恢復成之前的映像,恢復後,訪問網站,mysql 就會當掉, 依然無法啟動.
    不知道是什麼原因.居然連恢復的也無法用.

    請問這是什麼情況呢?

    回覆
    • 你好:
      很難就這幾個訊息判斷為什麼備份的映像無法用。就你的狀況MySQL會當掉,應該查得到log 才是。不妨從 MySQL的error log和系統的log 著手。

      回覆

發佈留言