DB 전문가가 아닌 글이니. 참조만 하세요.
개발자로서 이정도는 알아야 하지 않을까 싶다. 결국은 테이블과 SQL문을 만드는 것만 개발자의 몫은 아닐 것 같다.

오라클 SQL은 실행전에 반드시 파싱을 하도록 되어있다.

Hard Parsing(이하 하드 파싱)은 기본적으로 다음의 스텝을 가진다.
1. SQL문을 shared pool에 로딩한다. 
2. Syntax parsing.
3. Semantic parsing
4. Query Transformation
5. Optimization
6. Create executable

여기서 중요한 것은 soft parsing(소프트 파싱)은 위의 1번 SQL문을 shared pool에 로딩하지 않는 다는 점이다. 
정확히 말하면, SQL 문에 대해서 오라클에서는 해싱값을 가지게 되고 그 값을 share pool에서 찾아오게 된다. 그래서 쿼리에 space나 개행문자등이 오면 SQL문의 해싱값이 달라지니 hard parsing이 되게 된다.

hard parsing은 기본적으로 shared pool에 존재하지 않은 쿼리들이 들어오게 되므로 오라클의 shared pool 관리자에게 부하를 주는 꼴이 되나다. 즉, share-pool에 reloading이 필요하게 된다. 
결국 soft parsing보다 RAM allocation이나 메모리 management등을 하게 되어서 cpu나 latch에 영향을 미치게 된다. 

hard parsing이 많다는 것은 shared_pool_size가 작다거나 정말 많은 다양한 쿼리가 들어온다고 할 것이고, 결국은 오라클 DB에 부하를 주게 된다. 

메모리 모델은 항상 부하를 일으킬 수 있는 부분이 존재하다. 마치 자바의 GC하고도 비슷하게 생각해 볼 필요가 있다.

반면 꼭 soft parsing이 좋다는 것은 아니다. soft parsing도 1번 shared-pool에 해싱값을 이용해서 shared-pool에서 바로 가져오게 될 뿐이지, syntax 체킹부터 실행까지는 hard parsing과 똑같다.
특히 이 soft parsing이 자주 불리게 되어 많이 호출된다면, 역시 cpu에 부하를 주지 않겠는가?

As we know “hard parse” is a costly operation, even a “soft parse” requires library cache latch and CPU overhead, which if aggregated is a significant number.
(http://charie99.egloos.com/588452)

전체 parsing 대비해서 hard parsing , soft parsing 값을 비교할 수 있으며, soft parsing hitratio가 100%에 가까울 수록 그만큼 좋은 것이라 생각된다.

레퍼런스
http://www.dba-oracle.com/t_hard_vs_soft_parse_parsing.htm
http://www.dba-oracle.com/m_parse_to_execute_ratio.htm
http://charie99.egloos.com/588452


내가 닥친 문제는  select 1 from dual 이라는 validation query가 1분에 한번씩 나가는데, 과연 그게 DB에 큰 부하를 주는지에 대해서 고민중이다.. 하루 1440 번 이고, 서버가 1000대라면, 하루 최대 1,440,000 번 soft parsing을 하게 되고, 분당 1000번 쿼리가 서버로 접근하는 부분도 부하를 줄까?
테스트가 필요할 것 같다..

사실 이 쿼리가 db에 overhead를 준다고 생각되는 정보는 구글에도 찾아볼 수 없었다. 차라리 이상한 hard parsing이나 이상한 배치 쿼리를 찾는게 더 낫다고 생각되는데..

다르게 생각해보면 오라클이 꼭 from 쓰라고 하니까 문제가 생기는 거다. 그냥 from 절 없이 select 1 이렇게 해도 validation query가 쓰일 수 있도록 예외처리만 해줘도~ 좋을 것 같은데..쩝~


Posted by '김용환'
,
jmx를 이용하여 해당 jvm instance의 cpu usage를 측정하는 메소드는 다음과 같이 되어 있다.

private void _getJavaRuntime() {
OperatingSystemMXBean osbean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
RuntimeMXBean runbean = (RuntimeMXBean) ManagementFactory.getRuntimeMXBean();

long bfprocesstime = osbean.getProcessCpuTime();
long bfuptime = runbean.getUptime();
long ncpus = osbean.getAvailableProcessors();

for (int i = 0; i < 1000000; ++i) {
ncpus = osbean.getAvailableProcessors();
}

long afprocesstime = osbean.getProcessCpuTime();
long afuptime = runbean.getUptime();

float cal = (afprocesstime - bfprocesstime)
/ ((afuptime - bfuptime) * 10000f);

javacpu = Math.min(99f, cal);
uptime = runbean.getUptime(); 
}

'java core' 카테고리의 다른 글

JDK7에 clossloader의 close 메소드가 생기다니.  (0) 2009.04.09
JMX 에서 standardbean 사용 관련 Tip  (0) 2009.03.28
Java Memory 이야기  (0) 2009.03.25
svn과 연동 (svnkit)  (0) 2009.03.25
exception시 어떻게 되는가?  (0) 2009.03.05
Posted by '김용환'
,

csh 스크립트를 정리하다가. 발견한 사실.. (이미 오래전에 적었을지도 모르지만.. ^^;;)

 

#!/bin/csh

 wget -O serverStatusLog 'http://127.0.0.1/server-status?auto';
cat serverStatusLog | awk -F: '{ print $2 }' > statusCurrent

set current=(`cat statusCurrent`)

 

csh에서의 ( ) 마크는 bash 에서는 다르게 해석한다고 말했는데..  

csh에서는 개행문자뿐 아니라 사이띄기도 ( )를 이용하면 배열로 만들 수 있는데 반해서

bash에서는 오직 개행문자만 배열로 만들 수 있다.

 

만약 개행문자로 나눌 수 있는 값이면, 아래처럼 그래도 쓸 수 있다.

 

#!/bin/csh

 wget -O serverStatusLog 'http://127.0.0.1/server-status?auto';
cat serverStatusLog | awk -F: '{ print $2 }' > nstatusCurrent

current=(`cat nstatusCurrent`)

 

그러나, 스페이로 이루어질 때는 tr을 이용해서 배열로 만들면 된다.

 

#!/bin/csh

 wget -O serverStatusLog 'http://127.0.0.1/server-status?auto';
cat serverStatusLog | awk -F: '{ print $2 }' > nstatusCurrent

current=`echo nstatusCurrent | tr ' ' ' '`

 

 

Posted by '김용환'
,

'unix and linux' 카테고리의 다른 글

시스템 정보 가지고 오기 #1  (0) 2009.03.24
bash 에서 ( 사용관련 팁  (0) 2009.03.24
쉘 에러 bad interpreter:  (0) 2008.12.12
/etc/sudoers  (0) 2008.11.19
ipcs  (0) 2008.11.07
Posted by '김용환'
,

이클립스 + subclipse의 조합은 최악이라고 얘기했다.

이클립스 + subversive의 조합을 추천했는데, 가끔씩 이런 에러가 나서 놀랫다.

 

구체적으로 말하면, Team->share project-> 기존 sVN에서 골라서 프로젝트 소스를 올릴려고 했더니..

eclipse svn authentication canceled 하면서 안된다. 여러 번 해도 안된다.. 흘..

 

구글링을 해보니. 다음과 같이 SVNKit + javaHl의 조합을 추천한다.

 출처

 http://agaricdesign.com/note/svn-authentication-cancelled-problem-with-eclipse-pdt

 

 

SVN authentication cancelled problem with Eclipse PDT
  
 Select ratingPoorOkayGoodGreatAwesomePoorOkayGoodGreatAwesome
 
  
By Benjamin Melançon
on 03 Aug
0 comments
Key words and phrases
Eclipse PDT Subversion error
Tags
PC/Other Incomplete Problem Description
eclipse svn authentication canceled

discussion of seemingly related problems:

http://dev.eclipse.org/newslists/news.eclipse.technology.subversive/msg0...

http://svnkit.com/tracker/view.php?id=107

 

 

결국은 이렇게 처리했다.

 

 

Team->share project-> 새 SVN 추가(계정 추가) -> SVN 디렉토리 선택 :

OK 완료~

 

Posted by '김용환'
,

Exception이 생기면 어떻게 되는지 궁금해 하는 분이 계시던데.. 기본적인 것이고, thinking in java를 꼭 정독하면 좋겠다.

 

아래의 코드를 보자

 

 



import org.junit.Test;


import com.opensymphony.xwork.interceptor.annotations.After;
import com.opensymphony.xwork.interceptor.annotations.Before;


public class TestCase {

 int a = 0;
 @Before
 public void setup() throws Exception {

 }
 
 @After
 public void teardown() throws Exception {
  
 }
 
 public void a() {
  a = 0;
  try {
   a = 1;
   throw new Exception ("1");
  } catch (Exception e) {
   a = 2;
  }
  a = 3;
 }
 
 @Test
 public void execute() throws Exception {
  a();
  System.out.println(a);
 }
 
}

 

 

 

3이 출력된다.

java 언어는 예외처리 개념을 두었는데(여기에 대한 엄청난 의견들이 있음..) catch로 묶는 순간 이미 이것은 처리를 하겠다는 개념으로 생각하면 됨.

'java core' 카테고리의 다른 글

Java Memory 이야기  (0) 2009.03.25
svn과 연동 (svnkit)  (0) 2009.03.25
PermGen에서의 OutOfMemoryError 발생 대처하기  (0) 2009.02.25
Generic Erasure  (0) 2009.02.24
Java Profiling API 공부 시작..  (0) 2009.02.20
Posted by '김용환'
,

일일빌드서버에 저희쪽 SVN에 접속하여 모든 소스를 다운을 받았습니다. 체크아웃 소요시간은 17분정도 걸립니다. 그리고 소스는 head 5G, RC 5G 10G입니다.

 

소스를 다운 받는 이유는 reference를 검색하기 위함입니다. 하도 많은 검색이 필요하지요.

Head버전에서 grep으로 소스를 검색해보려니 (grep –r ‘HttpClient’ /home/www/bdssvn/head) 10분정도가 소요됩니다. (fgrep도 큰차이가 없음)

 

그래서, Hadoop(회사 owfs와 비슷, 분산파일시스템, 야후에서 사용) 을 이용하여 Map Reduce를 써먹을려고 해서 설치하기 까다로웠지만, 로컬만 설치해서 테스트를 해보니, 역시 grep을 기반으로 한거라 어쩔 수 없이 10분 소요됩니다. 여러 대에 깔아서 하기에는 조금 거시기 하더군요.

 

그래서 grep보다 빠른 것이 있나 확인했더니. ack라는 것이 있었습니다. 이거 1분만에 검색결과를 보여줍니다.

 

실제 hadoop을 썼을 때는 분산 파일 시스템을 쓰는 부분, 메모리를 많이 사용하는 부분으로 인해서 속도가 그리 많이 높게 나오지 않는다고 합니다. 10대를 설치해서 grep을 해보면, 10배의 기대치가 있지만, 실지로는 7배 빠른 정도라고 합니다. 제 생각으로는 java 기반의 Hadoop IO가 가장 약한 부분이라서 side effect가 있지 않나 생각이 듭니다.

또한, grep보다 빠른 녀석이 있는데 바로 ack입니다. Perl 기반이며, 이거 테스트를 해보니 엄청 빨라서 굳이 다른 것을 써보고 싶지 않을 정도입니다. 검색결과 포맷도 예쁘구요. 자세한 것은 참고자료를 보시면서 즐기시면 좋을 것 같습니다.

 

참고자료

http://kldp.org/node/55573

http://blog.i-no.de/archives/2008/05/06/index.html

http://www.jaso.co.kr/category/project?page=5

http://petdance.com/ack/

http://blog.i-no.de/archives/2008/05/06/index.html

'etc tools' 카테고리의 다른 글

라이브온에어  (0) 2009.04.07
여러 줄에서 특정 정규 패턴 찾아내기  (1) 2009.03.09
7zip과 bzip2의 비교  (0) 2009.03.02
디렉토리 비교, 3개의 파일 비교 가능 툴  (0) 2009.02.20
James 메일 서버  (0) 2009.02.19
Posted by '김용환'
,

2cpu가 있는 서버상에서 7zip과 bzip2의 성능 비교 자료이다. 5G가 되는 특정 데이터를 가지고 처리했는데. bipz2가 훨씬 더 빨리 속도가 빨랐다.

 

7zip fastest 5 min 14 MB/sec 973 MB
7zip fast 7 min 11 MB/sec 926 MB
7zip normal 34 min 2.5 MB/sec 752 MB
7zip maximum 41 min 2.0 MB/sec 714 MB
7zip ultra 48 min 1.7 MB/sec 698 MB

 

bzip2 fastest 2 min 36 MB/sec 1092 MB
bzip2 fast 2.5 min 29 MB/sec 1011 MB
bzip2 normal 3.5 min 22 MB/sec 989 MB
bzip2 maximum 7 min 12 MB/sec 987 MB
bzip2 ultra 21 min 4 MB/sec 986 MB

 

출처 : http://www.codinghorror.com/blog/archives/001231.html

Posted by '김용환'
,

subclipse는 쓰지 말자.. 흘..

 

설치 꼬이는 문제와 함께 버젼 문제, 사용상 이상한 점이 많다.

 

결국 subversive로 이동~

 

 

 

http://www.eclipse.org/subversive/documentation/gettingStarted/aboutSubversive/install.php

 

Posted by '김용환'
,

자바에서 클래스 메타 정보영역인 PermGen영역에서 OutOfMemoryError 가 나면..

보통 permgen 영역을 넓히면 된다.

 

해결 방법을 소개한다.

1. MaxPermSize을 늘린다.

-XX:MaxPermSize=256m 옵션을 실행할떄 추가한다. 보통 이정도면 꽤 많이 쓰는 것이다. 톰캣이라면, catalina.sh에 추가하면 된다.

 

 

만약 ConcurrentMarkSweep (CmS)  GC를 할 때면, 아래 옵션을 추가해야 한다.. CMS GC때는 반드시 permgen 영역을 gc하지 않는다. 따라서 추가하는 것이 많다. 아무 때나 추가하는 것이 절대 아니다.

 

2. CMSPermGenSweepingEnabled , CMSClassUnloadingEnabled 를 추가한다.

-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled 옵션을 추가한다.

중요한 것은 ParreleGC

 

'java core' 카테고리의 다른 글

svn과 연동 (svnkit)  (0) 2009.03.25
exception시 어떻게 되는가?  (0) 2009.03.05
Generic Erasure  (0) 2009.02.24
Java Profiling API 공부 시작..  (0) 2009.02.20
아파치 세션이 계속 있다??  (0) 2009.02.20
Posted by '김용환'
,