Oracle 9iAS, OracleAS 10g 일반튜닝및문제해결 Getting the most out of MetaLink 오치영 한국오라클 ( 주 ) 제품지원실
목차 Performance Tuning 전고려사항 Performance Tuning Parameter 자주발견되는문제들 많은고객분들이 Oracle 9iAS 나 OAS 10g 를포함한각종 J2EE container 에서 J2EE application 들을작성, 사용하고있습니다. 사용하다보면작성한 application 의기능 test 를하신후, application 을곧바로개발에서가동환경으로옮겨서사용하면개발시에발견하지못한다른문제가사용자들의의해발견되는사례가많습니다. 이번 iseminar 에서는고객분들이가장자주문의하시는것들을중심으로모아보았습니다. 시간이한정되어있어많은것을다룰수는없겠지만여기에서다룰내용을 application 작성시고려하시고작성후 test 및확인을하신다면가동시문제가발생할확률이그만큼줄어들게됩니다.
Performance Tuning 전고려사항 1. 가장최근, 최신의 OS patch 적용 가장최근에 release 된 OS recommended patches JVM 이요구하는 OS patches 2. JVM update 적용 1.4.2_06, 1.3.1_13 등각 version 의마지막 revision 사용 3. Oracle 9iAS, OracleAS 10g patchset 적용 Oracle 9iAS patchset 9.0.3.1 OracleAS 10g patchset 9.0.4.1 1. Latest OS patches JVM 사용시 OS patch 는매우중요합니다. 어느 OS 의 JVM 도 JVM install 시 OS patch 를가장최근것까지적용할것을요구하지않는것은없습니다. 2. Latest JVM JVM 의 version 은 -version 과 -fullversion 으로확인할수있습니다. OS 에따라 JVM version string 에는 3 자리 version number 다음에숫자가있거나년월일이나오는것이있습니다. 모두 OS engineer 에게확인하셔서가장최근의것만을사용하시기바랍니다. 3. 9iAS, OAS 10g 의최근 Release 된 patchset 적용
Performance Tuning 전고려사항 4. JDBC 사용시 OC4J connection pool 활용 5. WebCache 활용 6. Resource Limitation Parameter 를증설또는 Tuning 7. Parameter 를설정 각 OS 별 Kernel parameters Oracle Application Server 10g Performance Guide 10g (9.0.4) - Part No. B10379-01 각 OS 별 TCP/IP parameters $ORACLE_HOME/Apache/Apache/bin/tcpset.sh 1. JDBC Connection Pool 고객분들이작성하시는 J2EE application 들은주로 Client 가 web browser 이고, jsp 나 Java bean 에서 HTML, JDBC API, 및 HTTP Protocol 를사용하는것들입니다. ( 물론이외에도 Java application 이나 XML, LDAP data 등문의는다양합니다.) 이렇다보니 JDBC Connection Pool 을항상사용하게됩니다. 2. OC4J Connection Pool JDBC connection pool 을사용하실때에는 OC4J 의 connection pool 을가능한사용하시고 3rd party 나고객이작성하신 connection pool 을사용하시다가이와관련된문제가발생하면 OC4J connection pool 을사용해보실것을권합니다. 특히고객께서직접 connection pool 을작성하여사용하시다가저희쪽에문의를주신사례를보면그증세가매우다양하며고객이원인을스스로찾아그 source code 를 fix 하는데적어도많은시간이걸립니다. 고객스스로 connection pool 을구현한경우지원해드릴방법도없습니다. 고객께서안전하게 J2EE application 을구현하시도록 OC4J connection pool 사용을권합니다.
Using OC4J Connection Pool Data-sources.xml J2EE source code OC4J ConnPool 설정 다음의매뉴얼을참고하여주시기바랍니다. Oracle Application Server Containers for J2EE Services Guide 10g (9.0.4) Part Number B10326-01 Chapter 4 Data Sources http://downloadwest.oracle.com/docs/cd/b10464_05/web.904/b10326/datasrcs.htm#1016993
WebCache 활용 #1 End-User Web Cache Oracle HTTP Listener Web Content Cache File #1 File #2 File #3 1. WebCache Size 가크고실시간 update 되지않는 file 을 service 하실때는 WebCache 의사용을권합니다. OHS 로계속사용하시면 OHS 가이러한 file 들을 loading 하여 client 로전송하는데시간이걸리며, 이에따라동시에실행될수있는 OHS child process 의수가감소하여동시사용자가많을경우 HTTP Server 의성능이저하됩니다. WebCache 는처음 OHS 로부터받은이러한 file 들을 memory 에두고 client 로부터이러한 file 에대한 request 가오면 cache memory 에있는것을전송합니다. 예를들어, Macromedia Flash file (.swf), 큰 image file (.jpeg), movie file (.mpeg,.avi,.wmv), audio file (.mp3), word processor file (.doc,.hwp), spread sheet file (.xls), presentation file (.ppt) 들이좋은예입니다. WebCache Admin Server 에서이러한 file 들을등록해주고, WebCache 가일정간격으로 Origin Server (OHS) 에서이러한 file 들이 update 되었는지 check 를하도록합니다.
WebCache 활용 #2 WebCache 활용에대한자세한내용은다음 manual 이나 iseminar 에있습니다. Oracle Application Server Web Cache Administrator's Guide 10g (9.0.4) Part No. B10401-02 http://download-west.oracle.com/docs/cd/b10464_05/caching.904/b10401/toc.htm iseminar: 2004년 8월 10일참조 OracleAS 10g : Webcache의 Configuration and Performance http://www.oracle.com/kr/support/download/tech-iseminar_as10g_webcache.pdf
Performance Tuning Parameters TCP/IP parameter $ORACLE_HOME/Apache/Apache/bin/tcpset.sh Backlog WebCache: 자동으로설정됩니다. OHS: ListenBacklog default 값 511 로충분 OC4J standalone: server.xml <max-http-connections max-connections-queuetimeout="10" socket-backlog="30" value="10000">http://optional.redirect.url/page.jsp</maxhttp-connections> SQL*Net Listener (address=(protocol=tcp)(host= )(port= )(queuesize= )) TCP/IP parameters 9iAS, OAS 10g 내 tcpset.sh script 를활용 Backlog Backlog는주로 OS engineer에의하여발견되어문의되고있습니다. Backlog란 socket에서바로처리할수없는요청을정해진크기에 backlog에두었다가처리하기위한것으로아래와같이설정됩니다. WebCache: 자동으로설정 OHS: ListenBacklog directive로설정되는데 default 값으로도충분하며만일모자란다면 WebCache 사용을고려하시는것이더적합 OC4J standalone: OC4J standalone의경우 OC4J HTTP Listener로모든 HTTP request를처리해야하는데 server.xml에서위와같은 tag를추가하여조정가능. Socket-backlog= 30 은 OC4J default이며 <max-http-connections></maxhttp-connections> 사이에 URL은 backlog로도부족할경우 redirect하기위한 URL SQL*Net listener: (queuesize= ) parameter를 (address= parameter에적용
Performance Tuning #1 Stress Testing 을해봅니다. 9iAS 나 OAS 10g 의 ab command 를활용해봅니다. Resource Leak 점검해봅니다. JVM Heap Memory Leak Database Connection Leak Database Cursor Leak File Descriptor Leak 1. Stress Testing Software Oracle 은 HTTP Server 를포함한 Application Server 제품을제작하고있으나, HTTP Server 에대한 stress test software 는제작하고있지않습니다. 따라서 HTTP Server 에대한 stress test 시해당 3rd party 제품을사용하시게될것입니다. 2. Apache Bench Command 혹이러한 3rd party 제품을가지고있지않거나준비가곤란한경우, 9iAS 나 OAS 10g 내포함된 Apache Bench command 를사용하여 HTTP GET method 로 J2EE application 에대하여 stress test 를하실수있습니다. 3. Resource Leak 점검 Stress Testing 전에는해당 debug option 을켜서 resource leak 을 stress testing 중에발견할수있도록합니다.
Apache Bench Cmd 활용 #1 Apache Bench Command $ORACLE_HOME/Apache/Apache/bin/ab Help prompt$ ab -h Manual pages prompt$ MANPATH=$ORACLE_HOME/Apache/Ap ache/man:$manpath prompt$ export MANPATH prompt$ man ab 1. Installation of ab command 가능한한 Production System 과동일한성능을갖는 Machine 에 9iAS 나 OAS 10g 의 OHS 또는 Apache HTTP Server 를설치합니다. 2. Running ab command a. 그다음 Stress를가할 machine에서다음과같이 ab command를실행합니다. b. ab command가실행되는동안 Web browser 를새로열어체감속도를느껴봅니다.
Apache Bench 활용 #2 Running AB command 위의예에서 ab command 를 c option 과 n, 마지막으로 test 를할 URL 을주어실행하고있습니다.
Resource Leak 점검 #1 JVM Heap Memory Leak JVM Option: -verbose:gc Database Connection Leak JVM Property Options: -Djdbc.debug=true -Djdbc.connection.debug=true SQL> select count(1) from v$session where username = ; Database Cursor Leak SQL> select count(1) from v$open_cursor where user_name = ; File Descriptor Leak Prompt$ lsof p <PID> 1. JVM Heap Memory Usage Monitoring by Monitoring GC JVM 실행시 -verbose:gc option 을주면 GC 이이루어질때마다 standard output 으로몇가지정보를보여줍니다. 이정보를이용하여 GC 후에도 JVM 내 memory 사용량이늘어나는지알수있습니다. 2. JVM 실행시 -Djdbc.debug=true -Djdbc.connection.debug=true option 을주어위와같은 JVM property 들을설정해두면 OC4J 가이를읽고 debugging 정보를 standard output 으로출력합니다. 특히 Connection class 의.close() method 를 call 하지않고 Connection class 를사용한해당 class 가종료되면알려줍니다. 3. Stress test 중위와같이 query 를하면 J2EE application 에서연결한 user 가얼마나많은 cursor 를 open 하는지수를셀수있습니다. 해당 J2EE application 에서 ResultSet class 의.close() method 를 call 하지않고추가로 ResultSet class 가생성되는경우수가늘어납니다.
Resource Leak 점검 #2 Log files Output of verbose:gc, -Djdbc.debug=true, -Djdbc.connection.debug=true 9.0.4.x $ORACLE_HOME/opmn/logs/OC4J~<name of OC4J component>~<island name>~<vm #> 9.0.3.x $ORACLE_HOME/opmn/logs/<name of OC4J component>.<island name>.<vm #> 1. GC output... [GC 4995K->4533K(5340K), 0.0133230 secs] [GC 5044K->4548K(5340K), 0.0141170 secs] [GC 5058K->4569K(5340K), 0.0124670 secs] 04/12/20 00:25:19 Oracle Application Server Containers for J2EE 10g (9.0.4.1.0) initialized [GC 5074K->4649K(5340K), 0.0272720 secs] [GC 5161K->4629K(5340K), 0.0075200 secs] [GC 5139K->4671K(5340K), 0.0031930 secs]... 2. OC4J connection pool output... 04/11/12 17:14:04 DriverManagerConnectionPoolConnection not closed, check your code! 04/11/12 17:14:04 (Use -Djdbc.connection.debug=true to find out where the leaked connection was created) 04/11/12 17:14:04 OrionCMTConnection not closed, check your code! 04/11/12 17:14:04 Logical connection not closed, check your code! 04/11/12 17:14:04 (Use -Djdbc.connection.debug=true to find out where the leaked connection was created)
자주발견되는문제점 : JVM problem Java.lang.OutOfMemory JVM Heap Memory Maximum Heap Size: -Xmx Heap Memory 를늘려주어도계속 memory 사용량이늘어날경우 source code 를분석합니다. Java.lang.StackOverflow JVM Thread Stack Memory Xss Frequent CG Frequent Full CG in output of verbose:gc System.gc() -XX:+DisableExplicitGC option in Sun JVM 1. J2EE application and J2EE container J2EE application은그것을실행해줄수있는j2ee container에서실행됩니다. 2. J2EE container and JVM process J2EE container는 JVM, Java Virtual Machine에서실행되며 JVM은하나의 OS process로써실행됩니다. 3. Java application에서 4. Heap Memory Usage in JVM J2EE를포함한모든 Java Application은 JVM Memory내에서실행이되며 Application의크기나 memory 사용량, 동시사용자수의따라 JVM 내 memory의사용량은큰차이를갖게됩니다. 아직도문의를받다보면 "Java 에서는 Garbage Collection 이자동으로이루어지므로 memory 를사용하고나서되돌려줄필요가없으며실제로 Java 에서되돌려주는 coding 이없다." 라는말씀을들을때가있습니다. Java 에서는 GC 가자동으로이루어지는것은맞습니다. 그러나 memory 를되돌려줄필요가있으며되돌려주는 coding 이란더이상그 memory 를참조하지않는것입니다.
자주발견되는문제점 : 한글문제 #1 J2EE Web App 에서 Multi-byte character 들의전송단계 HTTP Client (Web browser) 에서 HTTP Server 로의한글전송 HTTP Server (JDBC Driver) 또는기타 Oracle Client Software 에서 Oracle RDBMS 로의한글전송 DB Link: Local Database 에서 Remote Database 로의한글전송 한글등 multibyte character 전송시발생하는문제는다음 3가지로구분하여생각하면편리합니다. 1. HTTP Client (Web Browser) 에서 HTTP Server (Web Server) 로전송시어떻게 encoding 되는가 2. HTTP Server (JDBC Driver, DB Client) 에서 DB Server로전송시어떻게 Oracle NLS가 character conversion을하는가 3. DB Link가사용되면, Local DB와 Remote DB사이에 Oracle NLS가어떻게 character conversion을하는가
자주발견되는문제점 : 한글문제 #2 HTTP Client (Web browser) 에서 HTTP Server 로의한글전송 어떤 J2EE web application page 를 loading 했을때 Web browser 의 encoding 이 IE6 의경우 " 한국어 " 또는 " 유니코드 " 로나와야합니다. 이는해당 J2EE web application이 client인 IE6에게 page가어떻게 encoding되어있으며 HTTP Server로 data를보낼때어떻게 encoding해야하는지알려준것입니다. 예를들어 " 유니코드 " 로 IE6 encoding이설정되었고 load한 page가 HTML form이어서그 form에한글을입력하고 HTML submit button을누르면 IE6에서는입력된한글을 UTF-8으로바꾼후다시 URL encoding을하여 HTTP Server로전송합니다.
자주발견되는문제점 : 한글문제 #3 HTTP Server (JDBC Driver) 또는기타 Oracle Client Software 에서 Oracle RDBMS 로의한글전송 Client-Side Oracle JDBC THIN App Oracle JDBC OCI App Oracle Precompiler App Oracle OCI App OS Locale or NLS_LANG Database-Side Oracle RDBMS Database Characterset or National Characterset Client로입력받은문자열은 NLS_LANG이나 OS locale 설정에따라그것이어떻게 encoding된문자열인지로간주됩니다. 예를들어 OS local이 (LANG=) UTF8으로설정되었고 JDBC THIN driver가사용되었다면 JDBC THIN driver는입력받은문자열들이 UTF8 문자열이라고간주하며 NLS_LANG=.KO16KSC5601이고 JDBC OCI Driver를사용되면 OCI driver는입력된문자열이 KSC5601-1987로간주됩니다. 이렇게입력받은문자열은 Database Characterset과비교되어전송시 Oracle NLS가가능한한범위내에서 conversion을하여줍니다. 다음은각 cliet side에서사용되는정보입니다. NLS_LANG Oracle JDBC OCI Driver, Oracle Precompiler/OCI App OS Locale Oracle JDBC THIN Driver
자주발견되는문제점 : 많은수의 File Open Too Many Open Files error in OHS and OC4J log Prompt$ lsof p <PID> Application 특성상동시에 open 되는 file 이많으면 user limitation 을증설 prompt$ ulimit n 4096 prompt$ vi opmnctl ulimit n 4096 Application 이비정상으로 File 을많이 open 하면해당 source code 를 debug Too many open files error 이 error는 UNIX error 중에하나로 process나 user 또는 system 내에서허용된수보다동시에 file이 open되면발생하는데 OHS나 OC4J log에 Too many open files 와같이기록됩니다. 9iAS 나 OAS 10g 가원인이된적은없었고, Application 내에서 file 이나 socket 들을많이 open 하는경우발생합니다. 따라서 ulimit n 을이용하여 user나 process에서동시에 open할수있는 file의수를늘려주시고그래서해결되지않으면 source code에서원인을찾아야합니다.
자주발견되는문제 : DB connection 이너무많이열림. Database Connection 이너무많이 open 되고줄지않을때 SQL> select count(1) from v$session where username = <username> ; OC4J connection pool 을사용하는경우 : JVM option 에 Djdbc.debug=true 를추가 OC4J 가 connection leak 을알리면추가로 Djdbc.connection.debug=true 를추가 해당 source code 에서 Connection object 의.close() method 가 call 되도록확인, 정정 Connection Leak을점검할때는처음엔 database session의수를확인한후예 ) SQL> select server, username, count(1) from v$session group by server, username; DEDICATED 7 NONE WWW 22 SHARED SYSTEM 1 SQL> session의수가정상이아니라고판단될때, 어느 host에서어떤 program이어떤 Oracle User로몇개나 login하고있는지 column을바꾸어가며 query해봅니다. 예 ) SQL> select machine, program, username, to_char(logon_time, 'YYYY-MM-DD HH24:MI:SS'), status from v$session where username is not null order by status, logon_time; 특히 connection leak 의경우오래전에 open 된 session 들은 status column 의값이여러번지켜보아도 inactive 로남아있는것을볼수있습니다.
자주발견되는문제 : cursor 가너무많이열림 ORA-1000: cursor 가많이 open 될때 SQL> select sql_text from v$open_cursor where user_name = <username> ; Source code 에서해당 SQL 문을보내는 Statement object 를찾습니다. ResultSet object 의.close() method 가있는지, Exception 등으로중간에실행되지않고있는지확인합니다. 업무특성상 cursor open 이많이된다고판단되면 init.ora parameter 에서 open_cursors= 의값을늘려주거나 cursor_sharing= 을활용 간혹.close() method들이 coding되어있음에도불구하고 Exception 등의이유로실행되지않는경우가있습니다. 이러한부분을보완하기위하여다음과같이 coding하는것이좋습니다.... } finally { if (rs1!= null) { try { rs1.close(); } catch (SQLException e) { } rs1 = null; } if (rs2!= null) { try { rs2.close(); } catch (SQLException e) { } rs2 = null; } if (stmt1!= null) { try { stmt1.close(); } catch (SQLException e) { } stmt1 = null; } if (stmt2!= null) { try { stmt2.close(); } catch (SQLException e) { } stmt2 = null; } if (conn1!= null) { try { conn1.close(); } catch (SQLException e) { sberror.append(e.tostring()); } conn1 = null; } }...
자주발견되는문제 : cursor 가너무많이열림 ORA-1000: cursor 가많이 open 될때 SQL> select sql_text from v$open_cursor where user_name = <username> ; Source code 에서해당 SQL 문을보내는 Statement object 를찾습니다. ResultSet object 의.close() method 가있는지, Exception 등으로중간에실행되지않고있는지확인합니다. 업무특성상 cursor open 이많이된다고판단되면 init.ora parameter 에서 open_cursors= 의값을늘려주거나 cursor_sharing= 을활용 SQL> select user_name, count(1) from v$open_cursor group by user_name USER_NAME COUNT(1) ------------------------------ ---------- SYSTEM 1 WWW 9 SQL> select user_name, sql_text from v$open_cursor where user_name = '<name of Oracle Database>'; v$open_cursor JDBC의경우 ResultSet 하나가 open되었을때 v$open_cursor에한 row가추가되는것을볼수있습니다. PreparedStatement and Cursor JDBC의 PreparedStatement는 Java에서 SQL Statement를재사용하기위한것이지 Cursor를재사용하는것과는무관합니다. OPEN_CURSORS Oracle RDBMS의 OPEN_CURSOR parameter는한 database session 내에서동시에 open할수있는 cursor의수입니다. ( 한 database instance에서 open할수있는 cursor의수가아님 ) CURSOR_SHARING Oracle RDBMS 내에서 cursor를 sharing하는것은 CURSOR_SHARING parameter의의하여가능합니다. 그러나이 parameter는 Oracle RDBMS의 performance 향상을위한것이지한 session에서 open할수있는 cursor의수를늘려주는것은아닙니다.
자주발견되는문제 : 기타, 3rd party 제품 3 rd party products PHP 9iAS 나 OAS 10g 에 PHP 가설치되지않습니다. Load balancer Load 가 balancing 되지않고한쪽 server 로치우칩니다. 1. PHP PHP 는 Oracle 에서지원되지않습니다. Oracle Technet 에 PHP 사용에대한글이있으나이글에서도 PHP 는 Oracle 에서지원받을수없음을명기하고있습니다. 2. Load balancer 간혹 Load balancer를사용하시는고객중에한쪽server 씩load를견디지못하고server가모두죽는다는문의가옵니다. 실제로원인을찾다보면아직까지는 Load balancer를사용해도 load가 balancing되지않고한 server로치우치면서그 server를죽게한다음나머지 server로죽게하는원인외에다른것이없었습니다. Load balancer 사용중에위와같은문제가발생하면각HTTP Server로TCP/IP connection 이고르게 open되는지확인합니다.
Related, Reference Document Performance Tuning of OHS, OC4J, and J2EE applications Oracle Application Server 10g Performance Guide 10g (9.0.4) Part No. B10379-01