node截圖服務可用性報告
來自: http://my.oschina.net/u/137634/blog/613484
前言
服務器端截圖可以做什么?
個人觀點:省去跟報表有關的EDM開發,直接從系統上截圖,然后發圖片給用戶就搞定。剩下的自己腦補。
既然這么好,為毛不趕緊弄。需要用到的工具坑太多,沒有嘗試,不敢拿上去用。
環境準備
如果是window環境就更簡單了,大家自行處理,這里不做介紹。
- centos6.5(5.x版本來落后了,不要用,會出問題的。其他高級版本,自己掂量著用,公司提供給我的測試機只有6.5版本)
- phantomjs 2.x (1.9.x版本的各種bug,測試的時候并發一起來,進程各種crash,所以大家別腦殘用1.9.x的)
- nodejs 0.12以上版本(因為4.x版本的gcc要求比較高,我又不會裝,所以沒法測4.x版本的。注意,一定要編譯安裝,不然會出很多問題。)
- 安裝windows字體(按網上的說明來,安裝完成要重啟機器。不安裝會出現中文字體不顯示的問題)
安裝步驟
我知道很多人比較懶,也有很多人,這也不懂,那也不懂。所以為了不讓大家浪費時間,給大家安裝環境步驟,由于系統是64位,因此下面的步驟都是按64位來。windows環境下的安裝,自己看文檔。
安裝phantomjs 2.x
- 到http://phantomjs.org/download.html頁面下載相應的版本,https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
- 解壓 tar -xvfz phantomjs-2.1.1-linux-x86_64.tar.bz2
- 創建軟鏈,ln -s 相應phantomjs文件夾/phantomjs /usr/bin/phantomjs ln -s 相應phantomjs文件夾/phantomjs /usr/local/bin/phantomjs
- 測試phantomjs命令能不能使用(如果不可以,大家自己看著辦)
安裝nodejs0.12.x
參考:http://www.laozuo.org/6421.html
- 到官網下載node-v0.12.9.tar.gz,特別注意,是源碼,不是編譯后的
- 解壓node-v0.12.9.tar.gz
- 進入解壓后的文件夾逐步執行兩條命令1 ./configure 2 make && make install
- 驗證node -v 看看版本號是不是跟我們安裝的一樣
安裝windows下的字體
這個直接參考http://www.tuicool.com/articles/VfiqqiA
啟動服務
- 拷貝源碼https://github.com/angrytoro/webshot
- 進到根目錄后,執行cnpm install來安裝相關的模塊(因為npm在國內太慢了,經常慢到讓你安裝錯誤)
- 安裝模塊成功后,執行node index.js,端口是3000
- 在瀏覽器上瀏覽
界面介紹
直接給圖說明比較方便
截圖效果
由于有200kb的圖片上傳限制,大家將就下,到百度云盤上看qq官網截圖效果
http://pan.baidu.com/s/1qXquUkc
并發請求結果
ps(在另外一臺服務器上用wrk測試)
介紹下截圖服務機器的硬件配置:2核cpu,4g內存
由于我在程序中限定了開啟3個phantomjs,每個phantomjs最多同時做5個頁面的渲染和截圖。因此我開啟了15個線程,保持15個鏈接同時請求,持續1分鐘的時間,效果如下圖:
五組測試數據統計
序號 | 網址 | 持續時間(s) | 并發鏈接 | 請求總數 | 成功 | 失敗 | 崩潰 |
1 | qq.com | 60 | 15 | 47 | 47 | 0 | 0 |
2 | qq.com | 60 | 15 | 54 | 54 | 0 | 0 |
3 | qq.com | 60 | 15 | 45 | 45 | 0 | 0 |
4 | qq.com | 60 | 15 | 57 | 57 | 0 | 0 |
5 | qq.com | 60 | 15 | 49 | 49 | 0 | 0 |
平均 | |
60 | 15 | 50.4 | 50.4 | 0 | 0 |
從中可以看出在截取qq.com的時候,大概平均每秒處理0.84個截圖請求。
當然這是在有條件限制的情況下得出的數據,在測試的時候,查看了下cpu的峰值,大概是60%,也就是說這個還有提升的空間。而且我們是用qq.com做測試,如果是比較簡單的頁面,速度肯定還會提升。
不信請看,我請求http://alinode.aliyun.com/blog/23這個網址的測試
這里數據顯示1分鐘內總共處理了150個請求。平均每秒處理2.5個。
穩定性
下圖是跑了1小時的報告,蠻看看。
在一個小時之內連續的對qq.com首頁做截圖,總共是處理了562個請求,平均每秒0.16個,太憂傷了。大家有沒有發現,其實出現了202個讀錯誤,562個超時,平均網速才225.54kb,誒,這也太坑爹了。
不知道這是什么原因造成的,到底是網速慢了,還是qq官網首頁服務器做了安全策略。面對如此慘淡的數據,自信心都沒了。
其實在早些時候,有嘗試跑一個晚上的并發,可惜好像是因為斷網問題,導致測試沒有完成。之后有進行了持續6個小時的并發測試,在跑到2個多小時的時候,出現了內存溢出,導致服務中斷的情況。非常的憂傷,
我都不知道為毛內存溢出(當時跑去吃飯了),好歹也有3G多的內存可以用。在啟動服務后,我有觀測,內存從3G多,直接降到2G左右,不過一直在這個區間徘徊,不知道為毛會出現內存溢出。
有兩種猜測:
- 由于是測試騰訊首頁,不知道騰訊會不會出現防御,導致請求頁面速度變慢,然后phantomjs一直在等待,各種嘗試,導致內存溢出。一般情況下,我們在瀏覽某個頁面的時候,也會出現很卡的情況,瀏覽器出現假死。
- 由于V8的內存限制機制,導致在同時渲染15個頁面的時候出現內存溢出。
其實每次的并發測試都會出現超時的情況,這個問題不知道是什么原因造成的。
理論上要渲染一個頁面,其實是得花不少時間的,加載頁面就大概需要2~3秒的時間,加上渲染大概至少需要5秒左右的時間,有些垃圾網站更長,然后我們還要截圖,加起來,這大概得花個6~8秒的時間吧。
總結
按照目前并發測試的結果來說是不適合用于生產環境的。如果要小范圍的做生產測試,還需要解決下面幾個問題
- 將某些計算扔給GPU,畢竟GPU在渲染方面還是比較好的。
- 提升v8引擎的內存限制
- 查找內存溢出的原因并且解決
后記
服務器端截圖還是挺有意思的一件事情,如果穩定性提高了,相信可以用于很多地方。由于代碼是寫來做測試的,所以寫得挺爛的,還有很多可以改進的地方。
如果大家覺得這個點子不錯,可以繼續開發下去,請到github上點個贊,并給點改進意見。