看板 PHP 關於我們 聯絡資訊
是說,最近遇到一個狀況。我們做了個東西讓使用者下載回去使用, 然後使用過程中,每隔10秒鐘會做一次回報動作,讓我們知道他有在 使用這個東西。回報動作是呼叫Web server上的一個php程式。 開放下載以後,隨著使用的人數增加,我們遇到了CPU loading上升 的問題。大約兩小時後,主機的CPU loading就持續維持在100%了... (Xeon 3.06GHz CPU x 2 / 2GB RAM, 記憶體使用量倒是一直算正常) 當時同時使用的人數,粗估大概有五六百人。想像一下這幾百人同時 瀏覽一個網站,然後大家每隔10秒鐘就換一頁或者reload一次這樣. 處理回報資料的php程式是執行在CodeIgniter這個php framework上面。 錯估對主機的負荷是我們的問題,不過這程式做的工作老實說並不 繁複,讓主機CPU持續滿載還是讓我嚇了一跳。而且我觀察到資料庫 那台主機的負荷竟然非常低,當Web server持續滿載的時候,DB server負荷卻只有不到10%。 這讓我直覺問題是出在php這端,而不是程式裡面使用過多資料庫操作。 是CI有什麼bug嗎?還是我們寫在CI上面跑的程式有問題?我首先試著 把這個程式的controller直接修改成什麼都不做,結果負荷仍然持續 滿載。這表示執行進入CI framework以後,還沒執行到我們寫的code 之前,就已經把CPU操爆了. 所以問題應該是出在CI上面。我沒有辦法打開CI的程式碼仔細找出 問題點,畢竟當時已經有人在抱怨網站很慢了...而且程式基本上 還是「正確」運作,只是很慢,這種效能問題往往不是單一一個地方 寫錯所造成的。 緊急狀況下,只好立刻動手把這部份程式改寫,改成不經過CI。 基本上我是把controller和model裡面的各個function複製出來貼 在一起,把資料庫操作的部份改成單純的mysql_xxx(),然後輸出 的部份用最單純的echo()。大概一個多小時修改完,切過去,Web server的負荷立刻下降到30%左右(DB server的負荷倒是如預期, 沒什麼變動)。網站瀏覽起來也恢復順暢了。 這次經驗讓我對php framework的效能產生很大的疑問。平常狀況 下確實沒什麼差異,但是在這次這種大量負荷的狀況下,framework 的效能問題就非常明顯了。 注意我是泛指各framework的效能問題。我不打算單獨說是CI有問題, 因為在我認知裡面,CI已經是php framework裡面很輕量的了, 其他framework也許也有同樣的問題。 希望藉由這次經驗的分享,大家也來說說看這方面的經驗吧:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.237.191