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

支模網整體開發到上線為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,在速度上提升會非常明顯,同時也能保證動態程序服務器的穩定。

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

轉載地址:
https://blog.51cto.com/11024720/2321644


分享到:


相關文章: