1. 程式人生 > >網站高併發優化效能調優總結

網站高併發優化效能調優總結

最近在對PHP網站高併發高效能有所領悟,今天寫一篇關於這方面的文章。今天用我的測試站點:http://zhimo.yuanzhumuban.cc/來講解例項

支模網整體開發到上線為10個月左右,後端採用php開源框架destoon,站點總資料為800萬,其中每天會更新入庫資料5000-50000資料不等,日流量光手機端熊掌號流量為:8000以上

加上其他搜尋引擎和使用者連結直接進了的流量,每天日流量在1W以上,因為公司是單臺伺服器,配置也比較低,還需要每天資料入庫檔案,資料庫之前一直會奔潰狀態,所以自己通過以下的優化思路進行優化,效果好轉了許多,希望廣大朋友可以參考借鑑,如有不足,可以指出更好的方法。大家一起進步!

1.瞭解你的網站和專案到底有多大的流量和併發?

當專案的使用者量達到一定規模以後,網站往往會經常出現502 bad gateway(Nginx),連線超時(Apache),MYSQL拒絕連線等問題。這個時候,一般的理解就是網站的訪問量比較大,請求數比較高,所以伺服器不堪重負,開小差去了。這個時候最快的解決辦法一般就是重啟apache,nginx或mysql,當然這個不能解決根源,只是臨時解決一下而已。

那麼,首先你應該清楚你的網站的流量到底有多大?每秒的流量到底有多高?CPU佔用峰值是多少?對於這個問題,首當其衝方案的肯定使用是監控軟體了,這類的監控軟體比較多,有cacti(完全圖形化的流量監控工具),zabbix(支援各種資料的監控且可自己擴充套件監控模組並整合報警功能,非常強大!)所以第一步你就一定要先在所有伺服器上安裝監控客戶端,如cacti的snmp,zabbix的zabbix_client,然後搭建自己的監控服務端。然後靜默收集資料一段時間,可以是幾天也可以是一週。然後瞭解伺服器的峰值是多少,平均值是多少,CPU佔用,記憶體佔用。這樣你能先做到對伺服器的狀態心裡有底。

2.查詢高併發源泉

如果伺服器一直執行得比較正常,但突然一段時間經常出現502,超時,超高CPU時,排除流量的超大幅度增長以外的原因,那麼原因就有可能是程式卡死了或伺服器硬體故障。如果排除硬體故障以後這個時候最好第一步查詢MYSQL、PHP、Nginx、Apache的錯誤日誌,慢日誌,定位根原始檔及程式碼塊,往往新功能如果沒有經過完整的測試就上線,就非常容易引起這類的問題。

比如我們的一臺線上伺服器有段時間曾經上線了一個新功能,就是要求在某程式碼模組中將MYSQL伺服器地址更改為其它機房的MYSQL伺服器,由於程式碼沒有經過嚴格的測試,而直接使用了MYSQL_CONNECT重新連線。在這個功能上線以後,伺服器經常出現502,超時,CPU90%。後來排查時才看到這裡,由於其它機房的網路問題引起MYSQL_CONNECT超慢,所以大量的MYSQL_CONNECT卡死在這裡引起了阻塞。另外一個統計模組的file_get_contents也是同樣的問題,所以我們在後面的開發中要求一定要禁止使用file_get_contents,另外MYSQL_CONNECT也要限制超時的時間。

如果程式上沒有問題,那就要從資料庫或佇列上去查詢原因了。資料庫上的問題會非常多,比如一條沒有經常優化的SQL語句引起表的鎖死啊,MYSQL併發量達到預設峰值,表崩潰啊,等待程序過多啊等等。

3.使用佇列和快取

經驗告訴我們,佇列和快取絕對是解決高併發的非常有效的辦法。比如郵件傳送,這類功能其實客戶端並不需要等待完成,所以我們在前端只需要一直把要傳送的郵件地址,內容等一併放到佇列裡,後臺程式慢慢從佇列裡面去取就OK。對於佇列的解決方案有許多,比如memcache,redis等。

關於memcache,前段時間嘗試自己用memcache來寫了一個佇列,平臺windows。最終效果非常不理想,在迴圈的get或set時,memcache會顯得非常緩慢,並且最終的命中率一點都不高。在windows平臺上的redis會由於pull的不支援造成在高併發時經常redis server gone away的情況。在*inux平臺上,redis表現了非常棒的效能和穩定性,目前公司線上產品在使用redis後,已經非常穩定,所以redis絕對是值得使用的神器。

4.特別注意阻塞

這是一個非常嚴重的問題。HTTP上的阻塞,MYSQL的阻塞,阻塞的結果將是伺服器不能正常響應請求,CPU居高不下,並且很難發現問題。這要求我們在開發階段,對於容易引起阻塞的地方一定要特別注意,如果某段程式碼執行的時間會非常長,就一定要交給子程序來做這個事情。對於這個情況,node.js是一個非常好的解決方案,因為node.js正是為非阻塞而生的。並且這幾年node.js發展迅速,各類模組越來越多,也越來越穩定,框架的出現也大大的提升了程式碼編寫的速度,像express和eventproxy這類的,新手可以非常快的開發一個node.js未阻塞應用。

5.資料庫的優化

在高併發和大資料量的情況下,分表分庫是一定要的,並且儘量按模組分。不要相信分割槽,分割槽這貨非常容易引起表崩潰,特別是MYISAM引擎下,分割槽不僅會在一個資料夾下產生一堆的檔案,還非常有可能因為開啟的檔案控制代碼過多而出現各種MYSQL錯誤。

根據情況選擇不同的引擎或資料庫軟體,MYISAM,INNODB等引擎要在不同的情況下使用,MYSIAM適用於查詢多,插入少;INNODB適用於寫入多,查詢少和事務支援。noSQL也是非常值得嘗試的產品,PHP對mongdb的支援還行,操作也挺方便的。

M/S在高併發下存在延遲問題,臨時解決方案是可以用快取。

6.靜態資源與動態分離

頻寬是非常珍貴和昂貴的。有條件一定要使用CDN,在速度上提升會非常明顯,同時也能保證動態程式伺服器的穩定。

好了,以上就是近期總結的一些經驗。