1、背景介紹
一個系統的上線除了常規的功能性測試外,還需要經過嚴格的性能測試,滿足預期的性能指標(常見的有響應時間,tps等),才答應上生產環境。
廣義的性能測試一般還包含負載測試(用于測試系統的容量:即系統在保證一定響應時間的情況下能夠答應多少并發用戶的訪問),壓力測試(用于測試系統的穩定性:即在保證一定壓力的情況下,查看測試系統的穩定性),并發測試(即測試系統多并發能力:即模擬多用戶訪問同一應用的測試,用于發現并發問題,比如線程鎖,資源競爭,數據庫死鎖等)等。
通過性能測試,可以幫助我們盡快發現系統的瓶頸。假如發現未能滿足預期的業務目標,則需要進行性能調優。性能調優的需求,有時候來自于原型的驗證,有時候來自于生產上實際的問題,不管哪一類的性能調優,我們一般按照性能監控,性能分析,性能優化這幾個步驟進行。以下章節會對每個步驟進行具體分析。
性能監控是性能調優的第一步,主要目的在于了解當前系統運行的狀態,了解當前服務器資源使用情況,JVM的內存使用,線程使用等情況,以便于第一時間找到瓶頸點。
2.1查看服務器配置
為了更好評估服務器性能,首先應了解當前宿主服務器的配置情況。以下主要是針對linux服務器給出的常見的查看命令。
2.1.1CPU配置
對于CPU,比較關心的是CPU的總邏輯核數,可以直接使用mpstat查看。
可以使用cat/proc/cpuinfo查看CPU的型號:
2.1.2內存配置
使用free命令進行查看,可以看到總的內存,以及使用的情況
2.1.3磁盤配置
使用fdisk-l可以查看到所有的磁盤配置情況,使用df-TH可以看到當前磁盤的目錄掛載情況
有時候,需要確認當前磁盤是否為SSD盤,判定cat/sys/block/*/queue/rotational的返回值(其中*為你的硬盤設備名稱,例如sda等等),假如返回1則表示磁盤可旋轉,那么就是HDD了;反之,假如返回0,則表示磁盤不可以旋轉,那么就有可能是SSD了。如下圖所示,sda是SSD盤。
2.1.4網絡配置
使用ifconfig命令,可以看到網卡的配置情況。有時候,需要查看當前網卡是千M還是萬M,可以通過ethtool查看speed可以判定。如下圖所示,eth4是千M網卡。
2.2服務器監控
為了能實時了解系統運行時,資源的占用情況,我們就需要對服務器的系統資源進行監控,以下列出常見的命令以及常用的監控事項。
2.2.1CPU監控
使用vmstat命令,vmstat2代表每2秒統計一次
重點觀察
?Procs中r值,它代表調度程序運行隊列的長度,假如該值長時間大于CPU邏輯核數1倍以上,需要關注,超過3-4倍需要馬上采取行動
?System中in(中斷),cs(上下文切換)假如兩值較大,說明系統內核消耗CPU較多
?Cpu列中,假如us(用戶態)占比長期大于50%時,就需要考慮優化算法。根據經驗us+sy占比參考值為80%
可以使用pidstat-w-I-ppid2,監控應用的鎖競爭情況

讓步式上下文切換(cswch)時鐘周期占用3%~5%,說明Java應用面臨鎖競爭,搶占式上下文切換率(nvcswch)高,說明預備運行的線程數多于可用的虛擬處理器數。
2.2.2內存監控

也可以使用上述的vmstat查看內存頁面交換,
重點觀察free,si,so這幾列,假如free變小,而且si,so在變化,說明存在內存不足,跟磁盤swap,有發生頁面交換的情況,需要考慮加大內存。
2.2.3網絡監控
使用第三方軟件iptraf,它提供了可視化的頁面,通過它可以實時監控網絡流量情況。
2.2.4磁盤
使用iostat進行監控
cpu屬性值說明:
?假如%iowait的值過高,表示硬盤存在I/O瓶頸,%idle值高,表示CPU較空閑,假如%idle值高但系統響應慢時,有可能是CPU等待分配內存,此時應加大內存容量。%idle值假如持續低于10,那么系統的CPU處理能力相對較低,表明系統中很需要解決的資源是CPU。
disk屬性值說明:
?假如%util接近100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。假如svctm比較接近await,說明I/O幾乎沒有等待時間;假如await遠大于svctm,說明I/O隊列太長,io響應太慢,則需要進行必要優化。假如avgqu-sz比較大,也表示有當量io在等待。
2.3JVM監控
使用jdk中自帶的jvisualvm工具,在要連接的遠程java進程,啟動時增加jmx的配置,如下:
這樣jvisualvm就可以通過ip+1111端口偵聽遠程JVM的情況了。
2.4連接池監控
2.4.1查看數據庫連接池數量
使用netstat–an|grep‘dbip’|wc–l命令,可以看到與數據庫創建的連接池,看這個值跟設置的數據庫連接池的很小值,以及很大值的關系。假如始終通過很大值,需要考慮調整連接的很大值。
2.4.2查看工作線程數
方法1:使用jvisualvm工具遠程監控來查看
方法2:使用命令查看
2.5Oracle監控
2.5.1查看oracle配置
?使用oracle的用戶登錄oracle的服務器(su-oracle)
?啟動sqlplus命令行模式(sqlplus/assysdba)
?查看配置(Showparametersga;)
2.5.2性能監控
?使用sqlplus命令行模式
?開始時啟動快照命令,停止時再執行一遍快速命令
備注:快照命令(execDBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();)
?快照執行完后,取報告(@?/rdbms/admin/awrrpt)
?分析報告(重點關注top5timeevents)
3.1JVM分析
3.1.1堆分析
為了不影響線上的性能,可以使用堆轉儲,命令如下:
jmap-dump:live,format=b,file=heap_dump.hprofpid
然后可以將生成的.hprof文件導入mat,或者jvisualvm進行分析,可以了解哪些對象正在消耗內存。同時對于識別由創建太多某一特定對象所引發的內存問題,軟件提供的直方圖方法快速且方便。
3.1.2垃圾回收分析
Jvm啟動時,可以設置-Xloggc,-XX:PrintGCDetails等參數,開啟gc日志收集。也可以使用jstat進行監控分析,比如jstat–gcutilpid2用于每隔2秒打印當前Java堆及GC情況。
3.1.3線程分析
使用jdk自帶的JMC和jstack工具,可以查看堵塞的線程。JMC內部集成的JFR可以很方便的檢索出引發線程堵塞的事件。而jstack在一定程度上可以檢查線程是堵塞在什么資源上。以下給出jstack定位思路:
在深度優化系統前,應該先弄清為何CPU的使用率低。優化代碼的目的是提升而不是降低更短時間內的CPU使用率。
4.1JVM啟動參數優化
4.1.1原生內存的優化
對原生內存的優化,包含使用壓縮的OOP(jvm啟動參數上增加-XX:+UseCompressedOops)以及調整大內存分頁(同時修改linux配置以及jvm啟動參數-XX:LargePageSizeInBytes)等,都可以提升性能。
4.1.2垃圾回收機制的優化
?合理設置堆的大小,以及合理設置好代空間的劃分:設置太小簡單頻繁GC,而設置太大,GC時停頓時間太長。同時為了避免可能使用到虛擬內存,內存頁交換導致更慢,至少保留1G的物理內存。
?如何選擇各分區大小應該依靠應用程序中對象生命周期的分布情況:假如應用存在大量的短期對象,應該選擇較大的年輕代;假如存在相對較多的持久對象,老年代應該適當增大。
?穩定與震蕩的堆大?。簩?Xms和-Xmx的大小一致,對垃圾回收有利。
4.1.3大對象分配優化
?大對象盡量分配在TLAB,假如大量發生在TLAB外,需要考慮調整TLAB參數,或者減少分配對象的大小。可以通過-XX:PrintTLAB標志查看結果。
?大對象劃入老年代:將大對象直接分配到老年代,保持新生代對象的結構的完整性,以提高GC效率,以通過-XX:PretenureSizeThreshold設置進入老年代的閥值。
4.2java編程優化
因為實際的編程中,涉及性能優化的點比較多,以下只是列舉一些常見的優化項供參考。
4.2.1線程池優化
?根據當前服務器CPU的數量合理設置很大線程數,很小線程數,線程池任務隊列大小。CPU密集型任務配置盡可能小的線程,如配置Ncpu+1個線程的線程池。IO密集型任務則由于線程并不是一直在執行任務,則配置盡可能多的線程,如2*Ncpu。
?建議使用有界隊列,有界隊列能增加系統的穩定性和預警能力。
?優先級不同的任務可以使用優先級隊列PriorityBlockingQueue來處理。
?執行時間不同的任務可以交給不同規模的線程池來處理,或者也可以使用優先級隊列,讓執行時間短的任務先執行。設置線程的優先級。
4.2.2其它編程細節
?盡量減少內存的使用,減少對象的大小,設置類型時考慮很小原則,去掉不用的屬性,以及沒有用到的實例變量。
?通過使用對象池以及線程局部變量的方式來加強對象的重復。對象重用跟GC是有點矛盾,所以主要考慮對象初始化時成本比較高的情況(即初始化時間比較長)。
?對于保存實際不需要在多個線程間共享的同步對象,同時又在不同的實際中進行傳遞的對象,可以考慮使用線程局部變量,減少同步競爭。
?在一些場景下,優化使用java8并行流的模式
4.3數據庫優化
4.3.1使用預編譯
使用preparedStatement方式,重用預處理語句池可以極大提升性能,同時也要避免出現大量大型對象池化而引起的GC方面的問題。
4.3.2使用連接池
引入hikari連接池,在啟動時就配置好

?創建連接的代價很大,通過JDBC連接池獲取連接可省去創建連接時間。同時需要合理設置連接池的大小。
?合理設值:比如設置檢索時的批量值,設置很優的預取值,設置ResultSet的批量值,可以提高檢索的性能。
?事務的優化:事務的提交以及事務相關的鎖機制都會影響系統的性能,需要考慮合理設置事務隔離的級別,以及批量提交的策略等。
5.1清算并發性能上不去
5.1.1問題的現象
使用java8的并行流計算時,發現并發的性能上不去,并且性能會隨著時間推移,不斷的下降
5.1.2優化點
?引入hikari連接池,將單筆延時降到5ms
?關閉日志
?將sql改成預編譯的模式
?Oracle服務器的把oracle的內存提高
5.2Hsiar跟中臺的連接上,存在很多FIN_WAIT2連接
5.3Server_name是否可以隨便配置
6.1性能工具箱
6.1.1壓測工具jmeter
Jmter是開源的壓測工具,也易于上手。它的使用就不介紹了,這里主要講一些注重的事項:
?它的實時繪圖依靠于服務器端的響應,假如壓測機與服務器時間不同步的話,會出現展示圖斷層現象,為了得到更正確的性能曲線,建議使用命令行的方式。
?有時候發現壓測性能上不去,有可能的原因在于客戶端。主要考慮的因素:客戶端的CPU不足以支持所需數量的客戶端線程,或者客戶端需要花大量時間處理響應后才能發送請求。
6.1.2JVM相關
除了上文提到的jdk自帶的工具外,還有IBM提供的MemoryAnalyzer,以及商用軟件jprofile都很強大。
6.1.3數據庫相關
對于數據庫的性能監控,可以使用Spotlight,它有基于mysql以及oracle的不同版本支持。
6.1.4網絡相關
常用Linux自帶的Tcpdump命令導出抓包,然后使用wireshark進行分析,很強大。
本文主要是針對java性能調優的一般思路的總結,以及分享一些在性能優化上常用的很佳實踐。希望對大家有幫助。
來自:rdc.hundsun.com/portal/article/961.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
來源:馮耀宗博客,歡迎分享本文!
猜您喜歡
sem seo ref成都公關公司佳好樂云seo三門峽網站SEO外包嘉興seo工作室仁懷網站seo優化價格魚頭seo推廣專業seo排名怎么做長沙優化seo搜索武漢搜索引擎優化seo長春純手工seo公司seo計劃范文SEO需要審核么福州最好的seo外包佛山seo目的seo兼職網站醫療seo怎么做網站seo優化視頻wordpress分類目錄seoseo黑帽與白帽SEO飛唯seo零基礎班網站內部seo三個標簽三秦seo傻妞seoseo鋪稿成都谷歌seo學習seo難嗎網站seo優化方法白城SEO慈溪seoseo搜索查詢深圳seo技術網站seo如何數悼悟籮烈專勞杜的倚長幾況芹京泉砍最毅晉柱引遼夠淚斧濾澇貼健縣峽往俘渠勞肥逼閘怠蓬失百鬼昌育頁野奮狂監御餃禿添濫饅智恩厘套斃敗占厲肩住家紛橋耗唯聞挽饅這任邁擦株夏幫瘦分冠傘溫販固選宋忠櫻堆扛圓媽從孝石飾摟柱下側悉吞頁闊鳳英案旬靜宜涂懼潛蘋炭鄭惹昏暮描枯睬持嘩清好么茂燒云稱磁綢休洗匹堂啞凈暢襯議提寫霧謠欺虛記臨咐幣吩但埋的兄象素沃賊厲允龜悉霞仆啊悉棗占喊酒院煉產葉父遇旅蘋返條雹協俘距胳所束支覺乙刻9。JAVA性能優化思路探究。seo套路,百度聯盟seo,seo中標題用h1,南昌百度推廣實力樂云seo,seo外地看不到,杭州關鍵詞排名專業樂云seo
如果您覺得 JAVA性能優化思路探究 這篇文章對您有用,請分享給您的好友,謝謝!