人臉識別(FaceRecognition)服務運行在Windows系統的bat文件中,其計算量非常大,運行耗時也比較長(10-20小時),並且在Java程序中使用Runtime執行命令,比直接運行cmd命令耗時更多,因此必須采取必要的手段對整個Server進行優化。
主要優化目標是降低Java程序中的執行時間,以提高吞吐率。
--------------------------------------分割線 --------------------------------------
編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm
Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm
Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm
Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm
Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm
--------------------------------------分割線 --------------------------------------
Server類型
虛擬機
CPU
1核,Intel(R) Xeon(R) CPU E5603 @ 1.60GHz
內存
3GB
操作系統
Windows XP Pro Version 2002 SP3
Tomcat
apache-tomcat-7.0.47-windows-x86
JDK
jdk1.7.0_04
下面,搭建模擬環境,分析潛在的優化點。
加內存,catalina.bat中加上Java VM參數:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
下面是Tomcat添加JVM參數之後的對比結果(測試ffmpeg命令):
默認內存(64M)
85 s
加大內存(1024M)
85 s
可見,優化內存,基本無效。
仍然采用上面的測試例子,不同方法的執行時間對比如下:
命令行中直接執行bat文件
69s
使用RunTime,不加cmd /c start
104s
使用RunTime,加cmd /c start,內存為64M
85s
使用RunTime,加cmd /c start,內存加大到512M
85s
使用processBuilder,不加cmd /c start
88s
使用processBuilder,加cmd /c start
87s
使用processBuilder,加cmd /c
87s
優化後,運行時間提升幅度為(104-85)/104*100%=18.27%。
直接執行,輸出信息
80s
直接執行,不輸出信息
72s
優化後,運行時間提升幅度為(80-72)/80*100%=10%。
1核2.4GHz
292s
4核2.5GHz
69s
優化後,運行時間提升幅度為(292-69)/292*100%=76.37%。
在Java程序中使用Runtime執行操作系統命令的時候,發現java程序的CPU占用率高達66%,而執行的命令程序只占33%,因此需要考慮優化Runtime方法的執行。
優化方法:將執行命令的方法中啟動的兩個用於讀取輸出和錯誤流的線程去掉,改為直接讀取這兩個流,而不是啟動2個線程。
優化前後對比如下:
測試項
優化前
優化後
Linux
直接在cmd中執行耗時
347s
344s
在Java中使用Runtime執行耗時
728s
353s
CPU占用率
ffmpeg:33%
Javaw:66%
ffmpeg:66%
Javaw:33%
Windows
直接在cmd中執行耗時
87s
86s
在Java中使用Runtime執行耗時
107s
88s
CPU占用率
ffmpeg:20%
Javaw:40%
ffmpeg:40%
Javaw:0%
優化後,運行時間提升到和直接執行命令相當的水平。
搭建測試環境
記錄命令行上的執行時間;
記錄Java程序中的執行時間;
按照優化點分析進行優化,分別記錄優化之後的執行時間;
生成優化報告,並記錄詳細的優化步驟,供後續使用。
1)搭建人臉識別的運行環境。
2)由於人臉識別步驟耗時較長,為了便於快速進行優化測試,准備一個24秒長的電影片段,總共包含4個人臉,並且每一幀都會有至少一個人臉。
在CMD中執行下面的命令,以手動啟動人臉檢測步驟。
C:\Face.bat Y:\FaceRecognition\DispatcherMovies\face.avi
記錄命令執行前後的時間如下:
The current time is: 18:11:04.52
The current time is: 18:19:29.09
總計執行504秒。
Java程序中采用“Runtime.getRuntime().exec(cmd)”的方式執行Windows操作系統的DOS命令,其中命令前面加上“cmd /c start”參數,以提高執行效率。
記錄命令執行前後的時間如下:
The current time is: 13:54:15
The current time is: 14:21:12
總計執行1617秒。
將默認的64M內存加大為1024M。在catalina.bat中加上Java VM參數:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
記錄命令執行前後的時間如下:
The current time is: 14:27:23
The current time is: 14:50:18
總計執行1375秒。
將人臉識別bat文件中輸出全部屏蔽掉,在bat文件中每個命令的後面加上“> nul”參數。
記錄命令執行前後的時間如下:
The current time is: 15:17:09
The current time is: 15:39:15
總計執行1326秒。
只增加CPU數量,不增加CPU主頻
將原來的1核CPU擴展到8核CPU。CPU配置為:Intel(R) Xeon(R) CPU E5603 @ 1.60GHz。
記錄命令執行前後的時間如下:
The current time is: 21:51:55
The current time is: 22:00:38
總計執行523秒。
既增加CPU數量,又增加CPU主頻
將原來的1核CPU擴展到32核CPU。CPU配置由1.60GHz變為2.13GHz。
記錄命令執行前後的時間如下:
The current time is: 10:35:07
The current time is: 10:41:21
總計執行374秒。
優化前後對比如下:
測試項
優化前
優化後
直接在cmd中執行
245s
245s
在Java中使用Runtime執行
374s
239s
優化後,運行時間提升到和直接執行命令相當的水平。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104412p2.htm