性能測試四十四:性能優化思路
性能瓶頸定位整體思路,從前到後,從表象到內部
1,首先排除壓力機的性能情況,包括cpu、內存
2,應用服務器的硬件指標,cpu,內存,網絡IO(ethtool eth0),磁盤IO,如果發現某臺機器的這四項中的任何一項到達瓶頸,那麽這臺機器在這一方面就到達瓶頸了
3,其他服務器,比如數據庫服務器,依賴的其他應用服務器
4,看應用服務器的日誌,tomcat下看的是catalina.out,用tail -200 catalina.out ,看cause by:xxx TimeOut
5,tps比較低,應用服務器cpu比較高,jvisualvm、jprofiler看下java進程,消耗cpu的方法
6,tps比較低,應用服務器cpu也比較低,可能是java程序的線程阻塞或死鎖,也用jvisualvm看,如果紅色的線程比較多,就是阻塞的原因(blocked、timed_waiting),jstack pid
7,tps比較低,響應時間比較長,首先要先弄清楚請求的流向,比如:LR-->nginx-->tomcat-->java-->數據庫-->緩存-->外部依賴--返回,如果排除到其他的問題,可以在java代碼加時間戳的方法來定位響應時間比較長的問題
8,tps緩慢降低,或大幅降低,tps大幅波動,用jmap或者jvisualvm進行堆內存dump,用jstat -gcutil,看看是否有內存泄露趨勢,Jvm的FullGC是否頻繁(單次FullGC消耗的時間FGCT/FGC,最好不要超過200毫秒)
9,排查連接數相關的內容,包含tomcat的連接數、mysql的連接數,某端口的連接數:netstat -an|grep 8080 | wc -l
Tomcat連接數相關
關於連接數,要看2方面,首先是中間件最大配置的連接數,然後就是當前連接數
tomcat的當前連接數用netstat可以看,略。最大連接數在
一般tomcat需要設置的參數,第一個就是連接數在conf/server.xml裏配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
mysql連接數:
maxThreads="200" 表示最多同時處理200個連接,默認值是200,可以改為2000,一般都是上千的,看具體配置
acceptCount="100" 當同時連接的人數達到maxThreads時,還可以接收排隊的連接,超過這個連接的則直接返回拒絕連接。默認值為100 ,可以改為500,看具體配置
第二個jvm的參數,在bin目錄下的catalina.sh第二行插入就行
數據庫架構的調優
--讀寫分離:主從配置,AB主從關系,寫A同步到B,讀B
--分庫分表:根據一個id來路由庫名和表名,id%10,1202922292
user_1
user_2
user_3
...
user_10
--硬件調優
普通磁盤
SSD
fusionIO卡
常見的一些sql優化方案
1、在 where 及 order by 涉及的列上建立索引,避免全表掃描,索引不要太多,一個表不要超過4個索引
2、避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
3、查詢語句中不要使用 *,減少內存使用
4、盡量減少子查詢(嵌套查詢),使用關聯查詢(left join,right join,inner join)替代
5、減少使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代
6、or 的查詢盡量用 union或者union all 代替,(在確認沒有重復數據或者不用剔除重復數據時,union all會更好)
7、合理的增加冗余的字段(減少表的聯接查詢)
8、建表的時候能使用數字類型的字段就使用數字類型(type,status...),數字類型的字段作為條件查詢比字符串的快
應用程序架構調優
代碼優化原則
1、使用對象池減少對重復對象的創建;
2、調整對後端的連接
3、增加本地緩存
4、如果不涉及事務的情況下,考慮使用Nosql進行存儲
5、一次請求合並多次操作。
6、由串行修改為並行操作
7、同步修改為異步
性能測試四十四:性能優化思路