另一份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