為Oracle數(shù)據(jù)庫默認的端口是8080,這也是tomcat服務器的默認端口.
為了避免端口沖突,我們通常會修改掉其中一個.
這里我們選擇修改Oracle數(shù)據(jù)庫的端口.
第一步:以管理員身份運行cmd窗口(按win鍵+X)
第2步:輸入 sqlplus sys as sysdba;
第3步:輸入你的Oracle數(shù)據(jù)庫的sys帳號的登錄密碼
注:默認輸入密碼狀態(tài)不可見,輸入完直接回車就可以
第四步:以修改端口為8090為例,輸入以下指令 exec dbms_xdb.sethttpport(8090);
修改成功,恭喜!
調優(yōu)是需要做好準備工作的,畢竟每一個應用的業(yè)務目標都不盡相同,性能瓶頸也不會總在同一個點上。在業(yè)務應用層面,我們需要:
此外,還需要掌握以下知識和技能:
一、 HotSpot虛擬機
HotSpot虛擬機是Java開發(fā)用的最多的JVM,了解其體系結構,才能夠從原理層面更好的理解性能問題,也才能更好地對Java應用進行調優(yōu)。
HotSpot VM內部有一些線程進行JVM的管理、監(jiān)控、垃圾回收工作。主要包括:
這些線程的運行有時候會影響業(yè)務線程的運行,是影響應用性能的關鍵因素。
二、 系統(tǒng)性能調優(yōu)
后端應用都是需要部署在服務器上的,因此在對Java應用調優(yōu)之前務必先將系統(tǒng)的性能調整到一個相對較好的水平。
一般來說,目前后端系統(tǒng)都是部署在Linux主機上的。所以拋開Win系列不談,對于Linux系統(tǒng)來說一般有以下配置關系著系統(tǒng)的性能。
文件描述符數(shù)限制
臨時性 echo 1000000 > /proc/sys/fs/file-max 永久性:在/etc/sysctl.conf中設置 fs.file-max=1000000
通過讀取/proc/sys/fs/file-nr可以看到當前使用的文件描述符總數(shù)。另外,對于文件描述符的配置,需要注意以下幾點:
進程/線程數(shù)限制
TCP內核參數(shù)
在一臺服務器CPU和內存資源有限的情況下,最大的壓榨服務器的性能,是最終的目的。在節(jié)省成本的情況下,可以考慮修改Linux的內核TCP/IP參數(shù),來最大的壓榨服務器的性能。如果通過修改內核參數(shù)也無法解決的負載問題,也只能考慮升級服務器。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
使用上面的命令,可以得到當前系統(tǒng)的各個狀態(tài)的網(wǎng)絡連接的數(shù)目。如下:
LAST_ACK 13 SYN_RECV 468 ESTABLISHED 90 FIN_WAIT1 259 FIN_WAIT2 40 CLOSING 34 TIME_WAIT 28322
這里,TIME_WAIT的連接數(shù)是需要注意的一點。此值過高會占用大量連接,影響系統(tǒng)的負載能力。需要調整參數(shù),以盡快的釋放TIME_WAIT連接。
一般TCP相關的內核參數(shù)在/etc/sysctl.conf文件中。為了能夠盡快釋放TIME_WAIT狀態(tài)的連接,可以做以下配置:
這里需要注意的一點就是當打開了tcp_tw_recycle,就會檢查時間戳,移動環(huán)境下的發(fā)來的包的時間戳有些時候是亂跳的,會把帶了“倒退”的時間戳的包當作是“recycle的tw連接的重傳數(shù)據(jù),不是新的請求”,于是丟掉不回包,造成大量丟包。另外,當前面有LVS,并且采用的是NAT機制時,開啟tcp_tw_recycle也會造成一些異常。如果這種情況下仍然需要開啟此選項,那么可以考慮設置net.ipv4.tcp_timestamps=0,忽略掉報文的時間戳即可。
此外,還可以通過優(yōu)化tcp/ip的可使用端口的范圍,進一步提升負載能力。如下:
三、 系統(tǒng)常用診斷工具
當應用運行情況、響應情況異常時,會直接表現(xiàn)為系統(tǒng)的指標異常。而指標需要通過相關的系統(tǒng)命令來獲取。Linux系統(tǒng)(CentOS 6.5)下常用的診斷工具如下:
00:40:16 up 116 days, 5:28, 1 user, load average: 0.36, 0.32, 0.32
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None ADDRCONF(NETDEV_UP): eth0: link is not ready ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None eth0: no IPv6 routers present eth1: no IPv6 routers present e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None eth0: no IPv6 routers present eth1: no IPv6 routers present
total used free shared buffers cached Mem: 16051 15879 171 0 672 4763 -/+ buffers/cache: 10444 5607 Swap: 8001 0 8000
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 7102/java tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - tcp 0 0 10.9.117.63:80 10.10.251.117:46335 SYN_RECV - tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 11225/java tcp 0 0 10.9.117.63:8080 10.9.90.198:4238 ESTABLISHED 7102/java tcp 0 0 10.9.117.63:51502 10.42.27.223:3306 ESTABLISHED 11225/java tcp 0 0 10.9.117.63:80 10.10.251.196:11934 TIME_WAIT - tcp 0 0 10.9.117.63:80 10.10.251.196:31371 TIME_WAIT -
12:54:59 AM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s 12:55:00 AM all 4.74 0.00 1.37 0.00 0.25 1.25 0.00 92.39 3593.07 12:55:00 AM 0 2.97 0.00 0.99 0.00 0.00 0.00 0.00 96.04 992.08 12:55:00 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 12:55:00 AM 2 1.96 0.00 0.98 0.00 0.00 0.98 0.00 96.08 0.00 12:55:00 AM 3 2.00 0.00 1.00 0.00 0.00 0.00 0.00 97.00 0.00 12:55:00 AM 4 2.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 0.00 12:55:00 AM 5 2.02 0.00 1.01 0.00 0.00 0.00 0.00 96.97 0.99 12:55:00 AM 6 4.00 0.00 0.00 0.00 0.00 0.00 0.00 96.00 0.00 12:55:00 AM 7 23.00 0.00 7.00 0.00 3.00 9.00 0.00 58.00 2599.01
11:48:34 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 11:48:35 AM lo 176.29 176.29 69.45 69.45 0.00 0.00 0.00 11:48:35 AM eth0 15513.40 15292.78 2677.08 2648.08 0.00 0.00 0.00
11:39:54 AM active/s passive/s iseg/s oseg/s 11:39:55 AM 13.40 454.64 16029.90 16083.51 11:39:54 AM atmptf/s estres/s retrans/s isegerr/s orsts/s 11:39:55 AM 6.19 1.03 0.00 0.00 3.09
avg-cpu: %user %nice %system %iowait %steal %idle 9.01 0.00 3.61 0.01 0.00 87.36 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util vda 0.02 1.56 0.12 1.12 3.62 21.45 20.21 0.00 2.20 0.80 0.10 vdb 0.01 37.75 0.57 1.67 82.30 315.68 177.35 0.01 5.88 0.55 0.12
top - 01:02:04 up 116 days, 5:50, 1 user, load average: 1.20, 0.46, 0.29 Tasks: 152 total, 2 running, 150 sleeping, 0 stopped, 0 zombie Cpu(s): 2.7%us, 0.5%sy, 0.0%ni, 96.3%id, 0.0%wa, 0.1%hi, 0.4%si, 0.0%st Mem: 16436664k total, 16302392k used, 134272k free, 688420k buffers Swap: 8193140k total, 132k used, 8193008k free, 4878348k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27852 root 20 0 180m 36m 548 R 56.5 0.2 0:00.29 python 4259 root 18 0 2396m 815m 13m S 25.3 5.1 7988:19 java 14128 root 18 0 4603m 1.9g 15m S 3.9 12.4 572:23.01 java 14785 root 24 0 5554m 2.1g 25m S 1.9 13.2 36:42.81 java 27851 root 15 0 12744 1048 748 R 1.9 0.0 0:00.02 top 1 root 15 0 10356 684 576 S 0.0 0.0 0:06.18 init 2 root RT -5 0 0 0 S 0.0 0.0 0:08.14 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:08.73 migration/1 5 root 34 19 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/1
四、 JDK常用診斷工具
在對Java程序進行問題排查、性能調優(yōu)時,如果沒有合適的工具,很多時候會事倍功半,甚至無法繼續(xù)進行下去。JDK自身已經(jīng)提供了很多強大的工具供我們使用。
筆者的開發(fā)環(huán)境是:OS X EI Captian 10.11.6
JDK版本:
java version "1.8.0_92" Java(TM) SE Runtime Environment (build 1.8.0_92b14) Java HotSpot(TM) 64Bit Server VM (build 25.92b14, mixed mode)
JAVA_HOME/bin下的工具截圖如下:
和性能分析相關的工具如下表所示:
javap
Java反編譯工具,主要用于根據(jù)Java字節(jié)碼文件反匯編為Java源代碼文件。
jcmd
Java 命令行(Java Command),用于向正在運行的JVM發(fā)送診斷命令請求。
jconsole
圖形化用戶界面的監(jiān)測工具,主要用于監(jiān)測并顯示運行于Java平臺上的應用程序的性能和資源占用等信息。jdeps用于分析Java class的依賴關系。
jdb
Java調試工具(Java Debugger),主要用于對Java應用進行斷點調試。
jhat
Java堆分析工具(Java Heap Analysis Tool),用于分析Java堆內存中的對象信息。
jinfo
Java配置信息工具(Java Configuration Information),用于打印指定Java進程、核心文件或遠程調試服務器的配置信息。
jmap
Java內存映射工具(Java Memory Map),主要用于打印指定Java進程、核心文件或遠程調試服務器的共享對象內存映射或堆內存細節(jié)。
jmc
Java任務控制工具(Java Mission Control),主要用于HotSpot JVM的生產(chǎn)時間監(jiān)測、分析、診斷。開發(fā)者可以使用jmc命令來創(chuàng)建JMC工具。
jps
JVM進程狀態(tài)工具(JVM Process Status Tool),用于顯示目標系統(tǒng)上的HotSpot JVM的Java進程信息。
jrunscript
Java命令行腳本外殼工具(command line script shell),主要用于解釋執(zhí)行javascript、groovy、ruby等腳本語言。
jstack
Java堆棧跟蹤工具,主要用于打印指定Java進程、核心文件或遠程調試服務器的Java線程的堆棧跟蹤信息。
jstat
JVM統(tǒng)計監(jiān)測工具(JVM Statistics Monitoring Tool),主要用于監(jiān)測并顯示JVM的性能統(tǒng)計信息,包括gc統(tǒng)計信息。
jstatd
jstatd(VM jstatd Daemon)工具是一個RMI服務器應用,用于監(jiān)測HotSpot JVM的創(chuàng)建和終止,并提供一個接口,允許遠程監(jiān)測工具附加到運行于本地主機的JVM上。
jvisualvm
JVM監(jiān)測、故障排除、分析工具,主要以圖形化界面的方式提供運行于指定虛擬機的Java應用程序的詳細信息。