偶然看到以前寫過的這篇帖子《小規模低性能低流量網站設計原則》 ,重新發到微博上引起了一點反響,覺得有必要以 Linode VPS 為例再做個簡單的優化實踐說明,免得總有人問我,也順便賺點點擊量。
假定現在你已經有了一個基本的 VPS 可用,基本內存 512MB 。參考官方提供的各種安裝指導將 LAMP 這個組合運行了起來,操作系統一般 Ubuntu ,Web 服務器 Apache ,數據庫 MySQL ,然后是 PHP ,以及需要安裝的應用軟件,WordPress 、Drupal 或是 OpenCart 什么的,一步一步配置好,能夠正常的瀏覽頁面。按照官方指導文檔操作的一個好處是會包括一些基本的優化一點的配置。不至于出現太大的錯誤。
一旦應用就緒后,登錄到操作系統中,通過 top / iostat / free 等基本操作系統命令收集基準數據,做記錄。收集信息越全面,對于后面的優化就越便利。優化沒有魔法,只有合理的方法。
1.內存相關的調整
內部測試或是較小范圍使用,可能這樣也不會遇到太大問題。一旦訪問人數多了一點,機器響應可能就有點慢了。對于 VPS ,第一步著手調整的就是各個組件對內存的使用。因為內存受限,對內存的使用一定要精打細算一點。記住一旦內存耗盡,一部分內存調用壓到磁盤上,系統負載會飆升,一般就會掛掉。
一般來說,對于 LAMP 環境,以下幾個地方要注意:
PHP 程序的內存相關的調整
PHP5 配置文件 php.ini 中 memory_limit 定義的值默認情況是16MB,該參數定義單個 PHP 腳本消耗最大的內存大小(大意)。如果程序某個頁面需要的內存超過這個限制,訪問者最可能遇到一個 HTTP 500 錯誤,查看 Web 服務器錯誤日志也可以看到。多數情況下,這個值需要做相應調整。比如設置為32MB,是否合適,需要做觀察。有一個經驗方法是觀察 top 命令的輸出,看相應進程的 SHR 字段的值,實際上總是盡量大一點點。但不能過大,一旦有個別程序寫的不好調用的時候占用過多資源,會導致 VPS 掛掉。
經常有人問,這個服務器跑某某 Web 應用,能支持多少并發? 一個大致的思路是估算單個進程占用的內存,看系統能分配多少內存給應用程序,并發的量大致可以估算得到。但實際上,這個提問基本沒多大價值。
另外,還有一個比較重要的參數需要修改 output_buffering 需要修改為 On 或是具體數值(eg, 4096)。修改配置后,檢查是否生效(如何檢查?)。另外,記住error_log的位置,隨時查看。
MySQL 數據庫內存占用
如果不確定 MySQL 內存使用情況,可以利用MySQLReport這個工具收集一下 MySQL 實例的信息報告,不同時間段多收集幾次作為對比。然后相應的調整 key_buffer/query_cache_size 等參數的大小, 一次調整一個參數,重啟動 MySQL ,繼續抽取報告,分析數據,然后調整下一個參數。既然需要編輯配置文件 my.cnf , 建議順手加大一點 max_connections 這個參數(為什么?)。
多數內存問題都是由數據庫 I/O 引起,導致 I/O 問題多由不合理數據庫調用有關(這么說嚴謹么?),解決不合理調用要么修改應用,要么通過查詢緩存或是 Key-Value Cache 等辦法緩解。這地方說來話長,假定 VPS 上基本不會有這么復雜的環境。
2. 影響 CPU 利用率的調整
這個主要針對 PHP 的 Opcode(Accelerator) 而言,解析、編譯PHP代碼是相當消耗CPU的操作。常見的要么是APC, 要么是eAccelerator或是 XCache,在 Ubuntu 下安裝配置都相對簡單,參數調整簡單搜索一下就知曉了。如果是 PHP 環境,那么一定要用 Opcode 減少 CPU 的負荷(為什么?)。至于用哪一個關系倒是不大,但前提是必須要有一個。
另外,張磊同學這篇《讓進程運行在指定的CPU》對于特定需求的應用,很有借鑒意義。