服務項目:網站建設、仿站、程序開發、APP開發設計、移動網站開發設計、企業網站設計、電子商務網站開發、網站維護、網站推廣、UX/UI 、HTML5、CSS3、JS / Jquery ...
四川浚網科技有限公司
四川浚網科技有限公司 (開發設計官網)TEL : 15308000360 / QQ : 38585404

您的位置:首頁 > 技術經驗 > 服務器 > 正文

服務器高并發下的一些優化經驗

最近在高并發、較大數據的網站優化上有一些心得和體會,所以特寫此文做一下總結,這塊的高手就可以直接跳到文尾了哈,費話就不多說,直接進正文。

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,在速度上提升會非常明顯,同時也能保證動態程序服務器的穩定。
好了,以上就是近期總結的一些經驗。



上一篇:第一頁
下一篇:NGINX多虛擬主機配置設置

相關熱詞搜索:服務器 高并發 優化
历届英超联赛冠军 山东省11选5 虚拟足球e球彩开奖 云南十一选五定牛走势 股米网 jdb财神捕鱼技巧 通化大嘴棋牌官方 山东11选5开奖号 多乐彩下载安装 澳洲幸运8是哪里的彩种 中国福利彩票双色球 用扑克打麻将怎么打 澳门娱乐棋牌官网下 历史广西快乐十分开奖 波克安徽麻将辅助挂 欧洲足联欧洲联赛 湖南麻将打法和规则