摘要:第一次寫(xiě)項(xiàng)目,用的,也沒(méi)啥經(jīng)驗(yàn),前期開(kāi)發(fā)比較緊所以以實(shí)現(xiàn)功能為主,下面記錄自己的一些性能優(yōu)化筆記。如果是在不使用數(shù)據(jù)庫(kù)連接池的情況下,必須在使用完數(shù)據(jù)庫(kù)之后關(guān)閉連接。所以使用數(shù)據(jù)庫(kù)連接池勢(shì)在必行,不然就是費(fèi)代碼了。
第一次寫(xiě) java 項(xiàng)目,用的 netty5.0,也沒(méi)啥經(jīng)驗(yàn),前期開(kāi)發(fā)比較緊所以以實(shí)現(xiàn)功能為主,下面記錄自己的一些性能優(yōu)化筆記。
以某接口為例,該接口是 feed 流,里面包含的信息有:
30條 feed 信息
每條 feed 下的最近的5條評(píng)論,和該評(píng)論總數(shù)
每條 feed 屬主的用戶信息
每條 feed 屬主和瀏覽者的好友關(guān)系
每條 feed 屬主和瀏覽者的地理位置距離
先不做壓測(cè)了,直接在 chrome 里打開(kāi)看響應(yīng)耗時(shí),
請(qǐng)求時(shí)間可以忽略不計(jì),等待時(shí)間和文檔下載時(shí)間都太長(zhǎng)了
將上面所有的信息都在 redis 緩存后的耗時(shí)
服務(wù)器優(yōu)化后端服務(wù)我直接用 netty 做服務(wù)和 api,沒(méi)有設(shè)置壓縮導(dǎo)致 api 文本很大
調(diào)試一個(gè)類似大小的之前項(xiàng)目的 api 做了壓縮處理的,發(fā)現(xiàn)文檔大小變化很大,如下圖 124k 被壓縮到了9.4k
返回的頭信息
HTTP/1.1 200 OK Server: nginx Date: Tue, 25 Aug 2015 04:14:54 GMT Content-Type: application/json; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Content-Encoding: gzip Vary: Accept-Encoding
而我目前卻還沒(méi)做壓縮處理,
直接請(qǐng)求 netty 返回的頭信息
HTTP/1.1 200 OK content-length: 126792 connection: keep-alive
走前端 nginx 轉(zhuǎn)發(fā)到后端 netty 返回的頭信息
HTTP/1.1 200 OK Server: nginx Date: Tue, 25 Aug 2015 04:21:39 GMT Content-Length: 126792 Connection: keep-alive
添加transfer-encoding頭信息
response.headers().set(TRANSFER_ENCODING,HttpHeaderValues.CHUNKED);
雖然不能縮短請(qǐng)求時(shí)間,但是能在接受到第一個(gè) chunked 包就可以開(kāi)始解析 api 文檔了。理論上可以縮短了客戶端加載的時(shí)間(不對(duì)請(qǐng)拍磚)解釋:http://blog.haohtml.com/archives/4777
我嘗試著在 netty 里添加了壓縮
response.headers().set(CONTENT_ENCODING, HttpHeaderValues.GZIP);
但是不好使,找了半天也沒(méi)找到資料,最后只能把壓縮轉(zhuǎn) nginx 里做的處理。
nginx 里的 gzip 配置如下:
gzip on; gzip_min_length 1k; gzip_buffers 4 4k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml text/javascript; gzip_vary on;
在不聲明文檔類型的時(shí)候,通過(guò) nginx 反向代理之后的 http 返回頭信息如下:
HTTP/1.1 200 OK Server: nginx Date: Tue, 25 Aug 2015 07:49:39 GMT Transfer-Encoding: chunked Connection: keep-alive
在 netty 里添加了文件類型聲明之后
response.headers().set(CONTENT_TYPE,HttpHeaderValues.TEXT_PLAIN);
再看 nginx 返回的信息則有壓縮了
HTTP/1.1 200 OK Server: nginx Date: Tue, 25 Aug 2015 07:55:57 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding Content-Encoding: gzip
發(fā)現(xiàn)文本有了很大的壓縮,下載時(shí)間大大減少了(在我做筆記的時(shí)候api 的文檔大小因?yàn)閿?shù)據(jù)變化而減少了3k)
今天在來(lái)公司的路上想到,我們大 PHP 在使用數(shù)據(jù)庫(kù)的時(shí)候基本上是使用了就不用關(guān)(在析構(gòu)函數(shù)里釋放數(shù)據(jù)庫(kù)連接),在同一個(gè)請(qǐng)求里面使用的數(shù)據(jù)庫(kù)連接是同一個(gè),在請(qǐng)求完畢的時(shí)候就釋放該數(shù)據(jù)庫(kù)連接。
做了如下測(cè)試,模擬一個(gè) api 需要做30次數(shù)據(jù)庫(kù)查詢
for ($i=1; $i < 30; $i++) { $sql = "select 1 from user limit where id=".$i; $res = $db->query($sql); echo "查詢了".$i."次 "; }
zhoumengkang$ mysql -uroot -pzmkzmk -e "show global status"|grep "Connections" Warning: Using a password on the command line interface can be insecure. Connections 30198 zhoumengkang$ php 2.php 查詢了1次 查詢了2次 查詢了3次 查詢了4次 查詢了5次 查詢了6次 查詢了7次 查詢了8次 查詢了9次 查詢了10次 查詢了11次 查詢了12次 查詢了13次 查詢了14次 查詢了15次 查詢了16次 查詢了17次 查詢了18次 查詢了19次 查詢了20次 查詢了21次 查詢了22次 查詢了23次 查詢了24次 查詢了25次 查詢了26次 查詢了27次 查詢了28次 查詢了29次 查詢了30次 數(shù)據(jù)庫(kù)連接關(guān)閉了 zhoumengkang$ mysql -uroot -pzmkzmk -e "show global status"|grep "Connections" Warning: Using a password on the command line interface can be insecure. Connections 30200
加上上面終端請(qǐng)求查詢數(shù)據(jù)庫(kù),共增加了兩個(gè)連接,也就是說(shuō)上面的30次請(qǐng)求就連接了一次數(shù)據(jù)庫(kù)。
如果是 java 在不使用數(shù)據(jù)庫(kù)連接池的情況下,必須在使用完數(shù)據(jù)庫(kù)之后關(guān)閉連接。類似的方法測(cè)試發(fā)現(xiàn) java 會(huì)連接30次數(shù)據(jù)庫(kù)。所以使用數(shù)據(jù)庫(kù)連接池勢(shì)在必行,不然就是費(fèi)代碼了。
弄了半天,使用的是apache.commons.dbcp,做了下壓測(cè)對(duì)比,還是在一個(gè) api 里做30次數(shù)據(jù)庫(kù)插入操作。
在不使用連接池的情況下
zhoumengkang$ ab -c100 -n1000 "http://localhost:8081/?method=test" Requests per second: 17.24 [#/sec] (mean) Time per request: 5800.506 [ms] (mean)
連接數(shù)直接增加了3萬(wàn)。耗時(shí)58秒。使用了連接池后,
Requests per second: 158.87 [#/sec] (mean) Time per request: 629.462 [ms] (mean)
設(shè)置的最小連接數(shù)20,耗時(shí)6秒。相差還是很大的。
未完待續(xù)...文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64451.html
摘要:以前一直對(duì)前端構(gòu)建工具的理解不深,經(jīng)過(guò)幾天的研究特意來(lái)總結(jié)一下,第一次寫(xiě)博客,有寫(xiě)錯(cuò)的請(qǐng)多多見(jiàn)諒,該文章我也從其他博客拷了一些內(nèi)容,如果有冒犯之處,請(qǐng)指出。強(qiáng)大的設(shè)計(jì)使得它更像是一個(gè)構(gòu)建平臺(tái),而不只是一個(gè)打包工具。 以前一直對(duì)前端構(gòu)建工具的理解不深,經(jīng)過(guò)幾天的研究特意來(lái)總結(jié)一下,第一次寫(xiě)博客,有寫(xiě)錯(cuò)的請(qǐng)多多見(jiàn)諒,該文章我也從其他博客拷了一些內(nèi)容,如果有冒犯之處,請(qǐng)指出。 如今,網(wǎng)頁(yè)不再...
摘要:引言半月刊第四期來(lái)啦,這段時(shí)間新增了道高頻面試題,今天就把最近半月匯總的面試題和部分答案發(fā)給大家,幫助大家查漏補(bǔ)缺,歡迎加群互相學(xué)習(xí)。更多更全的面試題和答案匯總在下面的項(xiàng)目中,點(diǎn)擊查看。引言 半月刊第四期來(lái)啦,這段時(shí)間 Daily-Interview-Question 新增了 14 道高頻面試題,今天就把最近半月匯總的面試題和部分答案發(fā)給大家,幫助大家查漏補(bǔ)缺,歡迎 加群 互相學(xué)習(xí)。 更多更...
摘要:保證上線后的版本不會(huì)因?yàn)g覽器緩存而產(chǎn)生影響。前端部分之后會(huì)有多人合作,為了提高效率決定采用組件化開(kāi)發(fā)。對(duì)之后的維護(hù)工作造成了一點(diǎn)困擾。之后的日子里做到一周更新兩篇博文,主要是實(shí)際項(xiàng)目中遇到的具體問(wèn)題來(lái)加以總結(jié)和分析,未完待續(xù)。 原文鏈接: http://xdlrt.github.io/2016/1...距離上次更博已經(jīng)過(guò)去兩個(gè)月了,終于也有時(shí)間能靜下心來(lái)想一些事情,也對(duì)這幾個(gè)月的生活做...
閱讀 2584·2021-11-24 09:38
閱讀 2615·2019-08-30 15:54
閱讀 930·2019-08-30 15:52
閱讀 1918·2019-08-30 15:44
閱讀 2725·2019-08-30 13:48
閱讀 778·2019-08-29 16:21
閱讀 1006·2019-08-29 14:03
閱讀 2223·2019-08-28 18:15