另一份Java應用調優指南之

jopen 8年前發布 | 12K 次閱讀 Java開發

每一次成功的調優,都會誕生又一份的調優指南。

一些必須寫在前面的軍規,雖然與Java應用的調優沒直接關聯,但是測試同學經常不留神的地方。

 

1 獨占你的測試機器

包括跑JMeter的那些機器。

"top"或者"pidstat -l 2 10" 看一下,其他的路人甲乙丙丁的應用都關干凈了沒。

如果是云主機,確保百分百占有宿主機的資源,或者深夜大家下班了你在家連V*N回來跑。

 

2 了解你的測試機器

必須完完全全的了解你的機器,才知道有沒卡在某個瓶頸,或者與線上環境、其他測試結果的比較。

還是那句, 包括跑JMeter的那些機器。

 

2.1 CPU

"cat /proc/cpuinfo", 看最后一條就好,比如

processor : 23
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
physical id : 1
cpu cores : 6

所有數字都從零開始,physical id:1即兩顆cpu, cpu core: 6即6核,processor : 23即24個處理器。

2 CPU * 6 Core * 2HT(Intel超線程技術) = 24 Processor

不過也有很多同事喜歡說24核,也懶得糾正了。

 

2.2 內存

"free -h" 沒什么好說的。

 

2.3 硬盤

  • 查看大小、分區、文件系統類型: "df -hT"
  • 硬盤是否SCSI:/dev/sdX就是scsi的,hdX就是普通的。
  • 硬盤是否SSD : "cat /sys/block/sda/queue/rotational", 0是SSD,1是傳統硬盤

普通硬盤的寫速度大概100M/s,RAID級別的查看不方便,SSD的速度也不定,所以用dd測一下最靠譜:

dd if=/dev/zero of=dd.file bs=8k count=128k conv=fdatasync
dd if=/dev/zero of=./dd.file bs=1G count=1 conv=fdatasync

上面命令測試了分別以每次8k和1g的大小,寫入1g文件的速度。

  • if:輸入文件名, /dev/zero 設備無窮盡地提供0
  • of:輸出文件名
  • bs:塊大小
  • count:次數
  • conv=fdatasync :實際寫盤,而不是寫入Page Cache

硬盤讀速度的測試同理,不過要先清理緩存,否則直接從Page Cache讀了。

sh -c "sync && echo 3 > /proc/sys/vm/drop_caches”
dd if=./dd.file of=/dev/null bs=8k

 

2.4 網卡

先用ifconfig看看有多少塊網卡和bonding。bonding是個很棒的東西,可以把多塊網卡綁起來,突破單塊網卡的帶寬限制。

然后檢查每塊網卡的速度,比如"ethtool eth0"。

再檢查bonding,比如"cat /proc/net/bonding/bond0", 留意其Bonding Mode是負載均衡的,再留意其捆佳節又重陽綁的網卡的速度。

最后檢查測試客戶機與服務機之間的帶寬,先簡單ping或traceroute 一下得到RTT時間,iperf之類的可稍后。

 

2.5 操作系統

Linux的內核版本,是否64位: "uname -a"
Redhat/CentOS版本 : "cat /etc/redhat-release"

 

3. 布置好你的機器狀態采集工具

講究點,要用來出報告的,用Zabbix之類。

實時觀察的,我喜歡dstat,比vmstat,iostat, sar們都好用,起碼對得夠齊,單位能自動轉換。不過dstat需要安裝(yum install dstat,如果裝不上,就要將就著用vmstat,sar了)

  • dstat:默認,已有足夠信息
  • dstat -am:再多一個memory信息
  • dstat -amN bond0,lo: 如果有bonding,dstat會把bond0和eth0 算雙份,還有lo的也算到總量里,所以還是用-N指定網卡好。

要看IO細節,還是要用"iostat -dxm 5"

  • -d 不看cpu信息
  • -x 看細節
  • -m 以m為單位,而不以block原始size
  • 5 5秒的間隔

 

4. JMeter的調優頂一半的事

JMeter的版本越新越好。

 

4.1 JMeter的JVM參數

它默認連個垃圾收集算法都沒有配,對延時要求高的,必須配上CMS或G1,內存也整大點降低GC的頻率。其他的,給Server配的啥參數,給JMeter也來上一份,最好把-XX:+AggressiveOpts也加上。

 

4.2 測試計劃的編寫

什么if 語句,以及所有其實用動態語言來實現的都挺慢的。
xPath抽取結果集里的字段之類看著就慢的也別寫了。
別加任何監瑞腦消金獸聽器和圖形。
再配置輸出日志的格式,能不要的列都別要了,最極端的其實就延時這列有用。

 

4.3 JMeter的運行

在Linux上用命令行跑,別偷懶用Window開著界面跑。
別開超過200條線程。
可以在不同機器上起多個JMeter,用集群匯總的模式。

 

4.4 結果的統計

初始連接,Server端熱身,JVM編譯熱點方法等都需要時間,所以建議統計前刪掉前面的一些日志。

要配置一下才能看到99.9%, 99.99% 分位數的延時,另外因為之前輸出日志時省略了很多列,導入日志的時候配置也要如此。

但如果不能XWindows Forward,還要把日志下載回來再導入本地的JMeter,那還不如自己動動手,用sed, awk, sort配合一下自己寫個分析延時的腳本。

 
嘮叨完這些寫給測試同學的話,下篇,就可以正式開始調優了。

更重要的是,唯品會廣州的基礎架構部還在繼續招人啊,簡歷請砸 calvin.xiao@vipshop.com

另一份Java應用調優指南之前菜 by 江南白衣 轉載請保持鏈接。

來自: http://calvin1978.blogcn.com/articles/perf-tunning-1.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!